ID do artigo: 241728 - Última revisão: segunda-feira, 28 de junho de 2004 - Revisão: 3.0

PROBLEMA: Usando 2 dígitos com IsDate 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 | Recolher tudo

Sintomas

A função IsDate() pode retornar resultados inesperados se passado a uma data que contém um ano de 2 dígitos.

Causa

As VBA data funções IsDate , formato , CDATA e CVDate utilizam uma função encontrada na automação OLE (OleAut32.dll). Esta função localiza todos os formatos de data possível por tokenizing cada um dos valores separados na seqüência de caracteres representando a data e retorna um valor Boolean que indica se a entrada pode ser representada como uma data.

Isso é importante lembrar-se ao usar a função para interpretar uma data que contém um ano de 2 dígitos. Localidades diferentes utilizar vários formatos de data (ou seja, mm/dd/aa, aa/mm/dd, "DD MMM aa", "YY MMM DD" e assim por diante) e, portanto, 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 se 29 de fevereiro é uma data válida para um ano específico, é um exemplo de onde você pode obter resultados inesperados quando passando IsDate funcionar a uma data que contém um ano de 2 dígitos. Para ser mais específico, passar a função IsDate um ambíguo data como "29-fev-01", irá resultar em IsDate verificando todos os formatos de data disponíveis e retornam VERDADEIRO como 1 de fevereiro de 2029 é uma data válida. No entanto, quando o ano totalmente qualificado é passado como "29-fev-2001", em seguida, IsDate poderá determinar que isso uma data inválida e, portanto, retornará FALSE.

Resolução

Crie uma função wrapper em torno a função IsDate para converter a data em um ano de 4 dígitos antes de passar a data convertida para a função IsDate() .

Situação

Esse comportamento é por design.

Mais Informações

As funções no OleAut32.dll use um padrão "Deslizar ano" de modo que, por padrão, todos os anos de 2 dígitos no intervalo de 0 - 29 são considerados como sendo o 2000s e esteja no intervalo 30-99 estão na 1900s. Isso pode ser substituído facilmente com a seguinte função de wrapper.

A documentação para a função IsDate define ele é projetado comportamento.

IsDate(expression)
A expressão necessária é um Variant que contém uma expressão de data ou expressão em seqüência reconhecível como uma data ou hora.

Etapas para reproduzir o problema

  1. Inicie um novo projeto Standard EXE VB. O Form1 é criado por padrão.
  2. Coloque um CommandButton (Command1) no Form1.
  3. Cole o código a seguir na seção declarações do 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. Selecione F5 para executar o projeto e clique em Command1 . A seguinte mensagem será exibida:
    Data válida encontrado: 02/01/2029

Etapas para evitar o problema

  1. Substitua o código anterior no módulo Form1 com o código a seguir que inclui o uso de uma função wrapper:
    
       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 projeto e selecione Command1 . Conforme o esperado, a seguinte mensagem será exibida:
    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 de 32 Bits 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 traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes 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/ )