Artigo: 241728 - Última revisão: segunda-feira, 28 de Junho de 2004 - Revisão: 3.0

PROBLEMA: Utilização anos de 2 dígitos com ÉData pode produzir resultados inesperados

Dica do SistemaEste artigo aplica-se a um sistema operativo diferente do que está a utilizar. Foi desactivado o conteúdo do artigo, que pode não ser relevante para si.

Nesta página

Expandir tudo | Reduzir tudo

Sintomas

A função IsDate() poderá devolver resultados inesperados se forem transmitidos uma data que contém um ano de 2 dígitos.

Causa

As data funções VBA ÉData , formato , CDATA e CVData utilizam uma função na automatização OLE (OleAut32.dll). Esta função procura todos os formatos de data por tokenizing cada um dos valores separados pela cadeia que representa a data e devolve um valor boleano que indica se a entrada pode ser representada como uma data.

Isto é importante lembrar-se quando utiliza a função para interpretar uma data que contém um ano de 2 dígitos. Idiomas diferentes utilizam vários formatos de data (ou seja, mm/dd/aa, aa/mm/dd, "DD MMM aa", "Aa MMM DD" e assim sucessivamente) e, por isso, a função tenta os dígitos em todas as posições até que a função tiver encontrado uma data válida ou esgotado todas as possibilidades.

Corrente quer 29 de Fevereiro é uma data válida para um ano específico, é um exemplo de onde poderá obter resultados inesperados quando passar ÉData funcionar uma data que contém um ano de 2 dígitos. Para ser mais específico, passar a função ' ÉData um ambíguo data tal como "29-Fev-01", irá resultar em ÉData verificar todos os formatos de data disponível e devolvem VERDADEIRO como 1 de Fevereiro de 2029 é uma data válida. No entanto, quando o ano totalmente qualificado é transmitido como "29-Fev-2001", em seguida, ÉData pode determinar que esta é uma data inválida e assim devolverá FALSO.

Resolução

Crie uma função de wrapper à volta a função ÉData para converter a data de um ano com 4 dígitos antes de passar a data convertida para a função IsDate() .

Ponto Da Situação

Este comportamento ocorre por predefinição.

Mais Informação

As funções OleAut32.dll utilizar um padrão "Deslizar ano" para que, por predefinição, todos os anos de 2 dígitos no intervalo 0 - 29 são considerados como correspondendo ao século XXI e estas no intervalo de 30-99 são in a 1900s. Isto pode ser facilmente substituído com a seguinte função de mensagens publicitárias.

A documentação para a função ' ÉData define este comportamento foi concebida.

IsDate(expression)
A expressão obrigatório é uma variante contendo uma expressão de data ou uma expressão de cadeia reconhecível como uma data ou hora.

Passos para reproduzir o comportamento

  1. Inicie um novo VB Standard EXE projecto. É criado o Form1 por predefinição.
  2. Coloque um CommandButton (Command1) no Form1.
  3. Cole o código seguinte na secção declarações de 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. Seleccione F5 para executar o projecto e clique em Command1 . Aparecerá a seguinte mensagem:
    Data válida encontrado: 01/02/2029

Passos para evitar o problema

  1. Substitua o código anterior no módulo do Form1 com o código seguinte que inclui a utilização de uma função de mensagens publicitárias:
    
       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. Execute o projecto e seleccione Command1 . Conforme esperado, aparecerá a seguinte mensagem:
    29 De Fev de 2001 não é uma data válida

A informação contida neste artigo aplica-se a:
  • 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
Palavras-chave: 
kbmt kbdatetime kbprb KB241728 KbMtpt
Tradução automáticaTradução automática
IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine translation ou MT), não tendo sido portanto revisto ou traduzido por humanos. A Microsoft tem artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais. O objectivo é simples: oferecer em Português a totalidade dos artigos existentes na base de dados do suporte. Sabemos no entanto que a tradução automática não é sempre perfeita. Esta pode conter erros de vocabulário, sintaxe ou gramática? erros semelhantes aos que um estrangeiro realiza ao falar em Português. A Microsoft não é responsável por incoerências, erros ou estragos realizados na sequência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza actualizações frequentes ao software de tradução automática (MT). Obrigado.
Clique aqui para ver a versão em Inglês deste artigo: 241728  (http://support.microsoft.com/kb/241728/en-us/ )