Makale numarası: 241728 - Son Gözden Geçirme: 28 Haziran 2004 Pazartesi - Gözden geçirme: 3.0

SORUN: beklenmeyen sonuçlar ısdate ile 2 basamaklı yılları kullanma 1.000.000

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Belirtiler

2 Haneli içeren bir tarih aktarılırsa, IsDate() işlevi beklenmedik sonuçlar döndürebilir.

Neden

VBA tarih işlevleri ısdate, Biçim ve CDateCVDate OLE Otomasyonu içinde (OleAut32.dll) bulunan bir işlevi kullanır. Bu işlev tüm olası tarih biçimleri, tarih gösteren dize ayrılmış değerleri tokenizing arar ve Giriş bir tarihi temsil edilebilir olup olmadığını gösteren bir Boole değeri döndürür.

Bu işlevi, bir 2 haneli yıl içeren bir tarihi yorumlamak için kullanırken hatırlamanız önemlidir. Çeşitli tarih biçimleri (yani, aa/gg/yy, yy/aa/gg, "Gg AAA YY", "YY AAA GG" vb.) farklı yerel ayarlar'ı kullanın ve işlevi geçerli bir tarih bulunamadı veya tüm olasılıklarını adres kalmadı kadar tüm pozisyonlar rakamları işlevi bu nedenle çalışır.

Şubat 29 belirli bir yıla ait geçerli bir tarih olup olmad???n? çek ısdate iletme işlevi, 2 haneli içeren bir tarih, beklenmeyen sonuçlar elde edebilirsiniz bir örnektir. Daha belirli için <a0></a0>, ısdate Fonksiyonun belirsiz bir geçirmeden "29-Şub-01 gibi" tarihi, tüm kullanılabilir tarih biçimlerini denetimi ısdate neden ve Şubat 1, 2029 geçerli bir tarih olduğundan DOğRU dönün. Ancak, tam yıl içinde "29-Şub-2001", ardından ısdate geçirilir bu geçersiz bir tarihi ve bu nedenle YANLıŞ döndürür belirleyebilirsiniz.

Çözüm

ısdate işlevi, dönüştürülmüş tarihi IsDate() işlevine geçirmeden önce 4 basamaklı bir yıl tarihi dönüştürmek için geçici bir sarmalayıcı fonksiyon oluştur.

Durum

Bu davranış tasarım yüzündendir.

Daha fazla bilgi

OleAut32.dll fonksiyonlarında "yıl kayan" bir standart varsayılan olarak, tüm aralığı 0 - 2 basamaklı yılda 29 2000s düşünülür ve 30-99 arasındaki aralığın içinde 1900s dosyaları, kullanın. Bu, kolayca aşağıdaki sarmalayıcı işleviyle kılınabilir.

ısdate işlevi ile ilgili belgelere, tanımladığı davranış tasarlanmış.

IsDate(expression)
Ifade gerekli bir tarihi ifade ya da bir tarih veya saat olarak tanınabilir dize deyimi içeren bir Variant ' dir.

Davranışı yeniden oluşturma adımları

  1. Bir yeni VB Standart EXE proje başlatın. Varsayılan olarak, Form1 oluşturulur.
  2. Bir KomutDüğmesi (Command1) Form1'ın getirin.
  3. Aşağıdaki kodu Form1 bildirimleri bölüme yapıştırın.
       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. Projeyi çalıştırın ve Command1 tıklatın için F5 ' ı seçin. Aşağıdaki ileti görüntülenir:
    Geçerli tarih bulundu: 02/01/2029

Adımları, sorun kaçının.

  1. Önceki kod <a0>Form1</a0> modülünde bir sarmalayıcı işlevi kullanımını aşağıdaki kodla değiştirin:
    
       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. Projeyi çalıştırın ve Command1 seçin. Beklendiği gibi aşağıdaki ileti görüntülenir:
    29 Şub 2001 geçerli bir tarih değil.

Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbdatetime kbprb KB241728 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:241728  (http://support.microsoft.com/kb/241728/en-us/ )