文章編號: 241728 - 上次校閱: 2004年6月28日 - 版次: 3.0

PRB: 使用 IsDate 的 2 位數年份,可能會產生非預期的結果

系統提示本文適用於您使用的作業系統之外的作業系統。與您不相關的文章內容已停用。

在此頁中

全部展開 | 全部摺疊

徵狀

如果傳遞包含 2 位數年份的日期,IsDate() 函式可能會傳回非預期的結果。

發生的原因

[VBA 日期函數 IsDate格式]、 [CDate,] 和 [CVDate 利用 OLE 自動化 (OleAut32.dll) 中找到的函式。這個函式由 tokenizing 每個分隔的值代表日期字串中搜尋所有可能的日期格式,並傳回布林值,指出是否可以輸入表示為 Date。

這是使用函式來解譯包含 2 位數的年份的日期時,請記住很重要的。不同的地區設定使用各種日期格式 (也就是公釐/dd/yy、 yy/公釐/dd、"DD MMM YY"、"YY MMM DD",等等) 和函式因此嘗試所有位置中的數字,直到函式已經找到有效的日期或已用完所有的可能性。

支票 2 月 29 是正確的日期,特定年度的是否是其中一個範例傳遞 IsDate 函式包含 2 位數年份的日期時您可能其中得到非預期的結果。若要成為更特定,傳遞 IsDate 函式的稜兩可如"29-FEB-01 」 的日期、 將導致 IsDate 檢查所有可用的日期格式且會傳回 TRUE,因為 2029 2 月 1,是正確的日期。不過,時為"29-Feb-2001",然後 IsDate 傳入完整格式的年份可以判斷這是日期無效,因此將 FALSE 傳回。

解決方案

建立包裝函式的函式周圍 IsDate 函式,若要將日期轉換成 4 位數的年份,然後再將轉換後的日期傳遞至 IsDate() 函式。

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

中 OleAut32.dll 函式使用"滑動年 」 的標準讓,預設情況下,所有的 2 位數年份,在範圍 0-29 視為處於 2000s年,且在 30-99 範圍內的位於 1900s年。這可以輕易地被覆與下列包裝函式函式。

文件,以 IsDate 函式定義它的設計是行為。

IsDate(expression)
必要的 運算式 是 Variant,包含日期運算式或字串運算式可辨識為日期或時間。

重製行為的步驟

  1. 開始一個新 VB 標準 EXE 專案。預設會建立 Form1。
  2. 在 Form1 上放置指令按鈕 (Command1)。
  3. 下列程式碼貼至 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. 選取 F5 執行專案,然後按一下 Command1。會出現下列訊息:
    找到有效的日期: 02/01/2029年

要避免這個問題的步驟

  1. 在 Form1 的模組中較早的程式碼取代下列程式碼,其中包含的包裝函式函式使用:
    
       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. 執行專案,然後選取 Command1。如預期般,會出現下列訊息:
    29 FEB 2001 不是有效的日期

這篇文章中的資訊適用於:
  • 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
關鍵字:?
kbmt kbdatetime kbprb KB241728 KbMtzh
機器翻譯機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:241728? (http://support.microsoft.com/kb/241728/en-us/ )
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。