Visual Basic - Datas e o ano 2000.

    "Time is on my side...", este é um refrão de uma música tocada pelos Rolling Stones,
    que significa mais o menos o seguinte "O tempo esta do meu lado". O que significa isto?
    alguém pode pensar ao ler estas linhas.

    Calma , isto é apenas uma chamada para alertar que os desenvolvedores de aplicações
    não podem cantar o refrão sem pensar que na verdade "Time is against me...", i.e, o
    tempo está contra mim. Sabe porque ?  Por que nos aproximamos do século XXI e o
    "Bug do Milênio" está cada vez mais perto.

    Vamos procurar entender a razão do problema e de como tratá-lo para evitar frustações
    futuras. Iremos nos ater apenas aos seguintes aplicativos da Microsoft utilizados em
    aplicaçoes desktop: Visual Basic e  Access.

    Um Pouco de história

    Para todas as versões do Visual Basic ate a versão 3.0 , datas informadas com dois
    digitos (dd/mm/yy) , são consideradas como pertencentes ao seculo XX , i.e, 1900.

12/01/09 -----> 12/01/1909
01/01/00 -----> 01/01/1900
30/02/40 -----> 30/02/1940.

O código que implementa este tratamento está , neste caso, embutido no run-time de cada versão , e não depende da versão do sistema operacional utilizado nem do formato da data usada. Com o surgimento da Automação OLE e do VBA (Visual Basic for Applications) o código responsável pela conversão dos dois dígitos usados em datas (dd/mm/yy) para quatro dígitos (dd/mm/yyyy) passou a ser responsabilidade das livrarias de AUTOMAÇÃO OLE. Então a VBA não mais implementa este código , apenas chama a livraria responsável pela conversão. A partir da versão 4.0 do Visual Basic foi definida um novo comportamento para as datas informadas com dois digitos no ano (dd/mm/yy). Elas são convertidas para o século utilizado na data do sistema. Assim se a data do sistema é o presente século (1900) 01/01/00 será interpretada como 01/01/1900 , porém se a data do sistema for o século XXI (2000), a data será interpretada como 01/01/2000. Esta regra foi implementada na livraria de Automação OLE usada pelo Visual Basic 4.0 e pelo VBA. Acontece que a Microsoft alterou a interpretação dada aos dois digitos para o ano a partir da versão 2.20.4049 da biblioteca OLEAUT32.DLL. Para as aplicações que usam esta biblioteca datas com dois dígitos para o ano cujo dígitos sejam de 00 a 29, são interpretadas como sendo do século XXI e as demais como sendo do século XX.

12/01/09 -----> 12/01/2009
01/01/29 -----> 01/01/2029
30/02/40 -----> 30/02/1940.
30/02/72 -----> 30/02/1972.

Tentando Arrumar a Casa. Meu Deus, que confusão !!!. Vamos tentar por as coisas nos seus lugares.

Aplicativo | Regra
--- | ---
Aplicações de 16 bits: Access 2.0 , VB 3.0 | Todos os anos com dois dígitos são automaticamente considerados como do século 20
VB 4.0 16 bits | Todos os anos com dois dígitos são do século corrente (definido pelo relógio do sistema).
Access 95 (com a nova biblioteca), VB 4.0 32 bits, VB5 , Access 97 | Todos os anos com dois dígitos entre 00 e 29 são do século XXI e os demais do século XX

Já deu para perceber que é importante saber com qual versão de biblioteca OLEAUT32.DLL seu sistema esta trabalhando. Para isso faça o seguinte:

    1-abra o Explorer e no diretório System;
    2-localize o arquivo OLEAUT32.DLL;
    3-Clique com o botão direito do mouse sobre o arquivo;
    4-Selecione propriedades;
    5-Selecione a ficha Versão e clique em Versão do Produto;
    6-Se o número da versão for igual ou superior a 2.20.4049 a nova regra esta sendo usada.

Criando a sua própria interpretação. Você pode querer implementar as suas próprias regras, como por exemplo: - datas com dois dígitos no ano entre 00 e 49 serão interpretadas como do século XXI (2000 e 2049), - e datas entre 50 e 99 como do século XX.(1950 e 1999). Para isto basta criar uma procedure com o seguinte código:

      Private Sub cmdConvertDate_Click()
           Dim strYear As String
           Dim intSlash As Integer

           If IsDate(txtDate) or txtDate = "2/29/00" Then
               'procura primeiro separador
               intSlash = InStr(txtDate, "/")
               If intSlash > 0 Then
                   'procura segundo separador
                   intSlash = InStr(intSlash + 1, txtDate, "/")
                   If intSlash > 0 Then
                       'Extrai ano da data
                       strYear = Mid(txtDate, intSlash + 1)
                       If Len(strYear) = 2 Then
                           If CInt(strYear) < 50 Then
                           ' Menor que 50: ano = 20XX.
                               strYear = "20" & strYear
                           Else
                           ' Maior que 50: ano = 19XX.
                               strYear = "19" & strYear
                           End If
                       End If
                       MsgBox "Data Informada: " & txtDate
                       MsgBox "ANO (Sua Regra): " & strYear
                       MsgBox "ANO (Regra do VB): " & Year(txtDate)
                   Else
                       MsgBox "Data no formato não esperado!"
                   End If
               Else
                   MsgBox "Data no formato não esperado!"
               End If
           Else
               MsgBox "Data inválida !"
           End If
           '  Limpando a data no texto
           txtDate.Text = Left(txtDate.Text, intSlash) & strYear
       End Sub

Bem , espero não ter criado mais confusão com as datas. Até mais... (Referência: Article ID:Q162718 - Microsoft )

Retorna