date - anos anteriores a 1901 são tratados como inválidos

11

Eu tenho data (GNU coreutils) 7.1 instalado no meu sistema.

Se eu tentar verificar as datas antes de 14 de dezembro de 1901, recebo um erro de "data inválida". Por exemplo,

  $ date -d 1901-12-13
  date: invalid date '1901-12-13'

  $ date -d 1901-12-14
  Sat Dec 14 00:00:00 EST 1901

O que devo fazer para tornar válida a utilidade date para tratar anos anteriores a 1901?

Recebo erros semelhantes para datas após 19-jan-2038

    
por Jasdeep Singh 20.02.2011 / 01:10

2 respostas

15

Boa pergunta.

A documentação diz que deve ser permitido.

 info date 'Date input formats' 'Calendar date items'

For numeric months, the ISO 8601 format 'YEAR-MONTH-DAY' is allowed, where YEAR is any positive number, ...

A leading zero must be present if a number is less than ten.

If YEAR is 68 or smaller, then 2000 is added to it; otherwise, if YEAR is less than 100, then 1900 is added to it.

Você está em um sistema de 32 bits?

Você também recebe um erro com datas após 2038-01-20, por exemplo,

date -d '2038-01-20'

Se assim for, parece que a data do GNU está usando um valor de tempo de 32 bits.

Não sei como consertar isso, a não ser usar um sistema de 64 bits ou usar uma ferramenta diferente, por exemplo, DateTime em Perl ou datetime em Python.

Alguns antecedentes:

Unix vezes contam o número de segundos de 1 de janeiro de 1970 usando um valor inteiro. Se o sistema usa números inteiros de 32 bits, ele pode contar apenas 2,1 bilhões de segundos para frente (até 2038-01-19 03:14:02 UTC) e 2,1 bilhões de segundos para trás (de volta para 1901-12-13 20:45:52 UTC).

Mais informações em:

por 20.02.2011 / 01:35
7

Seu sistema (ou pelo menos essa versão de data ) provavelmente está usando um valor de tempo interno de 32 bits.

A época do Unix (valor de tempo zero) é 1970-01-01 00:00:00 UTC. Este ponto de partida coloca 1901-12-13 00:00 EST fora do intervalo de um valor de tempo de 32 bits assinado.

1901-12-14 00:00:00 EST é -2147454000
1901-12-13 15:45:52 EST é -2147483648 (também conhecido como INT_MIN em C, o número mínimo assinado de 32 bits)
1901-12-13 00:00:00 EST é -2147540400

Você poderia tentar usar 1901-12-13 15:45:52 EST. Deve funcionar, mas um segundo antes provavelmente falhará da mesma forma que 1901-12-13 00:00.

    
por 20.02.2011 / 03:39