DATA VARIANT para string de data e hora

Esta calculadora online converte o valor de DATA VARIANT (dupla) em string de data e hora.

Há muito, muito tempo, no desenvolvimento de software...
Havia um tipo VARIANT, que poderia conter qualquer um dos muitos outros valores de tipo de dados (vartypes), consulte a wikipédia. E um dos vartypes era VT_DATE, também conhecido como data Variant, também conhecido como DATA (dupla), também conhecido como data variant OLE. Era um valor de Data e Hora representado como um número de ponto flutuante duplo de 8 bytes. A propósito, tudo sobre o tipo de dados variante é relevante até os dias de hoje, exceto que a programação hardcore do Windows ou COM/ActiveX/OLE não parece convencional hoje em dia.

Às vezes, quando você vê algo como 42842.370277778, a chance é que seja uma data variant. Aqui está uma simples calculadora que pega um valor duplo, interpreta-o como a data variant e produz a data e a hora codificadas nesse valor duplo. Aquelas pessoas que estiverem curiosas sobre o formato das datas variant e a história por trás delas podem continuar lendo após a calculadora.
.

PLANETCALC, DATA VARIANT para string de data e hora

DATA VARIANT para string de data e hora

Data e hora
 

Sobre o formato de data da variant.

De acordo com a documentação, os dias são representados por incrementos de números inteiros começando em 30 de dezembro de 1899, meia-noite como hora zero. Os valores das horas são expressos como o valor absoluto da parte fracionária do número.

Ainda assim, existe um problema. Embora os valores do dia se tornem negativos antes da meia-noite em 30 de dezembro de 1899, isso não acontece com os valores da hora do dia. Por exemplo, 06:00 é sempre representado por um valor fracionário de 0.25, independentemente de o número inteiro que representa o dia ser positivo (após 30 de dezembro de 1899) ou negativo (antes de 30 de dezembro de 1899).

Devido a isso, o valor de -1.25 representa 29/12/1899 06:00, e o valor de -1.30 representa 29/12/1899 07:12. Ou seja, enquanto o segundo valor duplo é menor que o primeiro valor duplo, como a data, ele é maior que a primeira data.

Além disso, os valores de data entre -1.0 e 0.0 representam as mesmas datas lógicas que suas contrapartes positivas. Ou seja, -0.5 e 0.5 são os mesmos 30/12/1899 12:00.

Você também pode se perguntar por que a data da variant tem um ponto zero tão estranho - 30 de dezembro de 1899, em oposição a 1 de janeiro de 1900 (ponto zero do SQL Server) ou 1 de janeiro de 1970 (ponto zero Unix/Javascript). De acordo com o escrito de Eric Lippert, "Na verdade, isso é para contornar um bug no Lotus 1-2-3! Os detalhes se perderam com o passar do tempo, mas, aparentemente, o Lotus 1-2-3 usou este formato de data, mas seus desenvolvedores esqueceram que 1900 não era um ano bissexto. A Microsoft corrigiu esse bug movendo o dia primeiro para o dia anterior." Esta e outras singularidades da VT_DATE estão explicadas em seu artigo, e é uma leitura fascinante para um desenvolvedor antigo como eu. Aproveite.

URL copiado para a área de transferência
PLANETCALC, DATA VARIANT para string de data e hora

Comentários