PRB: Použití číslice 2 roky s IsDate může mají neočekávané výsledky

Překlady článku Překlady článku
ID článku: 241728 - Produkty, které se vztahují k tomuto článku.
Tento článek byl archivován. Je nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Příznaky

Funkce IsDate() může vrátit neočekávané výsledky, pokud předán datum, které obsahuje číslice 2 rok.

Příčina

VBA datum funkce IsDateFormát, CDate a CVDate využívají funkce nalezen v automatizaci OLE (OleAut32.dll). Tato funkce vyhledá všechny formáty možné datum podle jednotlivých oddělených hodnot v řetězec představující datum tokenizaci a vrátí logická hodnota označující, zda může být vstupní reprezentován jako data.

To je důležité pamatovat při použití funkce interpretovat datum obsahuje 2 číslice roku. Proto funkce pokusí číslic v všechny pozice, dokud má nalezen platné datum nebo vyčerpání všech možností funkce a různých národních použít různé formáty data (tj mm/dd/rr, rr, mm/dd, "DD MMM rr", "Rr MMM DD" a tak dále).

Kontrola, zda únor 29 je platné datum pro konkrétní rok je příkladem kde může získat neočekávané výsledky při předávání IsDate funkci datum obsahuje číslice 2 rok. Přesnější, předávání funkce IsDate dvojznačný datum jako například "29-FEB-01", bude výsledkem IsDate Kontrola všechny formáty dostupné datum a vrátit TRUE, protože je 1. února 2029 platné datum. Když je úplný rok předaný jako "29-II-2001", potom IsDate může určit, toto je neplatné datum a proto bude vrátit NEPRAVDA.

Řešení

Vytvoření souhrnného funkce kolem funkce IsDate převést datum na 4 číslice roku před předáním převedené datum funkce IsDate().

Prohlášení

Toto chování je záměrné.

Další informace

Funkce v OleAut32.dll používat standardní "Vysunutelné rok" tak, aby ve výchozím nastavení, všechny roky 2 číslice v rozsahu 0 - 29 jsou považovány za v 2000s a ty v rozsahu 30-99 jsou 1900s. To lze snadno přepsat pomocí následující funkce obálky.

Dokumentace funkce IsDate jej definuje chování má navržena.

IsDate(expression)
Je vyžadován výraz typu Variant obsahující výraz datum nebo řetězcový výraz rozpoznatelný jako datum nebo čas.

Kroky pro reprodukci chování

  1. Spustit nový VB Standardní EXE Project. Jako výchozí je vytvořen formulář Form1.
  2. Umístěte CommandButton (Command1) na Form1.
  3. Vložte následující kód do oddílu deklarací Form1.
       Private Sub Command1_Click()
       Dim bIsDate As Boolean
       Dim sDate As String
    
        sDate = "29 FEB 01"
        bIsDate = IsDate(sDate)
        If bIsDate Then
           MsgBox "Valid Date Found : " & Format(sDate, "mm/dd/yyyy")
        Else
           MsgBox sDate & " Is Not a Valid Date"
        End If
       End Sub
    						
  4. Vyberte F5 spustit projektu a klepněte na tlačítko Command1. Zobrazí se následující zpráva:
    Platné datum nalezen: 02/01/2029

Postup eliminace problému

  1. Nahradit starší kód v modulu Form1 následující kód, který zahrnuje použití funkce obálky:
    
       Private Sub Command1_Click()
       Dim bIsDate As Boolean
       Dim sDate As String
    
        sDate = ConvertYear("29 FEB 01")
        bIsDate = IsDate(sDate)
        If bIsDate Then
           MsgBox "Valid Date Found : " & Format(sDate, "mm/dd/yyyy")
        Else
           MsgBox sDate & " Is Not a Valid Date"
        End If
     
       End Sub
    
       Private Function ConvertYear(sDate As String) As String
       Dim sYear As String
    
       ' This function currently uses the same sliding year as OleAut32.dll, 
       ' but can be customized to fit the needs of the application.
    
       sYear = Right(sDate, 2)
       If Val(sYear) <= 29 Then   
         ConvertYear = Left(sDate, 6) & " 20" & sYear
       Else
         ConvertYear = Left(sDate, 6) & " 19" & sYear
       End If
    
       End Function
    					
  2. Spusťte projektu a vyberte Command1. Podle očekávání, zobrazí se následující zpráva:
    29 FEB 2001 není platné datum

Vlastnosti

ID článku: 241728 - Poslední aktualizace: 28. února 2014 - Revize: 3.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft Visual Basic 4.0 Standard Edition
  • Microsoft Visual Basic 4.0 Professional Edition
  • Microsoft Visual Basic 4.0 32-Bit Enterprise Edition
  • Microsoft Visual Basic 5.0 Learning Edition
  • Microsoft Visual Basic 6.0 Learning Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft Visual Basic for Applications 5.0
  • Microsoft Visual Basic for Applications 6.0
Klíčová slova: 
kbnosurvey kbarchive kbmt kbdatetime kbprb KB241728 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:241728

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com