decodedatetime decodedate delphi date encoding negative-number

decodedatetime - ¿Hay una versión de la función Delphi EncodeDate/DecodeDate que pueda manejar las fechas de BC?



decodedate delphi (1)

AFAIK TDateTime es un tipo base de Windows, común a COM, Variantes, DotNet y Delphi. Los valores negativos se pueden usar para fechas anteriores a 1899.

Pero eso no es tan simple, ya que con valores negativos viene un problema, como se indica en esta página :

La parte integral es la fecha, la fracción es el tiempo. Fecha y hora. Eso es fácil. Las cosas se ponen raras cuando el valor es negativo. Esto es en o antes # 12/30/1899 #.

Con las fechas modernas, el tiempo siempre corre hacia adelante, como sospecharías. ¡Con fechas históricas negativas, el tiempo realmente corre hacia atrás! Medianoche # 1/1/1800 # es igual a -36522, pero el mediodía # 1/1/1800 # es -36522.5 (¡menos de la medianoche!) Y un segundo antes de la medianoche es -36522.9999884259 (incluso menos). A medianoche, el reloj salta hacia adelante a -36521, que equivale a # 1/2/1800 #. La fracción decimal todavía muestra el tiempo y la parte integral es la fecha, pero cada segundo disminuye el reloj, mientras que cada nuevo día lo incrementa, no solo por 1, sino por casi 2. Los tiempos negativos son realmente contraintuitivos.

Para empeorar las cosas, los valores de tiempo para # 12/30/1899 # son ambiguos de dos maneras. Primero, un valor de tiempo sin una fecha es igual a la hora del # 12/30/1899 #. Esto significa que 0.5 es mediodía o mediodía en # 12/30/1899 #, según el contexto. Cero es medianoche, # 12/30/1899 # o medianoche # 12/30/1899 #. La otra ambigüedad es que todos los valores de tiempo vienen en doble para # 12/30/1899 #. 0.5 es mediodía # 12/30/1899 #, pero -0.5 es mediodía # 12/30/1899 # también. La parte integral es la fecha, la fracción es el tiempo. Otra sorpresa está aquí: # 12/30/1899 11:59:59 PM # - # 12/29/1899 11:59:59 PM # = 2.99997685185185. No 1, lo que normalmente esperarías durante un período de 24 horas. Tenga cuidado cuando trabaje con fechas históricas.

Que yo sepa, la implementación actual de EncodeDate / DecodeDate funcionará, pero puede tener problemas cuando trabaja con valores negativos o casi cero de TDateTime ...

Debería usar mejor su propio formato de hora, por ejemplo, ISO-8601 o un registro simple como tal:

TMyDateTime = packed record Year: SmallInt; Month: Byte; Day: Byte; end;

Y al calcular cosas sobre la duración o la visualización de la fecha / hora, debe tener en cuenta que "nuestro tiempo" no es continuo. Entonces el cálculo usando el truco TDateTime=double no siempre funcionará como se espera. Por ejemplo, recuerdo que Teresa de Ávila murió en 1582, el 4 de octubre , justo cuando las naciones católicas estaban haciendo el cambio del calendario juliano al gregoriano, que requería la eliminación del calendario del 5 al 14 de octubre. :)

Las funciones Delphi EncodeDate / DecodeDate parecen ser capaces de manejar únicamente fechas posteriores a 1.1.0001. ¿Hay algunas implementaciones de EncodeDate / DecodeDate que pueden manejar los valores de BC tDateTime?