DATA VARIANT para string de data e hora

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

Esta página existe graças aos esforços das seguintes pessoas:

Timur

Timur

Julia Gomes

Criado: 2021-06-09 03:05:59, Ultima atualização: 2021-06-09 03:05:59
Creative Commons Attribution/Share-Alike License 3.0 (Unported)

Este conteúdo é licenciado de acordo com a Licença Creative Commons de Atribuição/CompartilhaIgual 3.0 (Unported). Isso significa que você pode redistribuir ou modificar livremente este conteúdo sob as mesmas condições de licença e precisa atribuir ao autor original colocando um hyperlink para este trabalho no seu site. Além disto, favor não modificar qualquer referência ao trabalho original (caso houver) que estiverem contidas neste conteúdo.

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