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

11

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

Se eu tentar verificar datas anteriores a 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 dateválido o utilitário para tratar anos anteriores a 1901?

Recebo erros semelhantes para datas após 19 de janeiro de 2038

Jasdeep Singh
fonte
Não recebo nenhum erro. Estou usando o coreutils 8.10, talvez um bug antigo?
Xenoterracide
@xenoterracide você é um sistema de 64 bits?
Mikel
@Mikel sim, eu sou
xenoterracide

Respostas:

15

Boa pergunta.

A documentação diz que deve ser permitido.

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

Por meses numéricos, o formato ISO 8601 `ANO-MÊS-DIA 'é permitido, onde ANO é qualquer número positivo, ...

Um zero à esquerda deve estar presente se um número for menor que dez.

Se YEAR for 68 ou menor, 2000 será adicionado a ele; caso contrário, se YEAR for menor que 100, 1900 será adicionado a ele.

Você está em um sistema de 32 bits?

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

date -d '2038-01-20'

Nesse caso, parece que a data do GNU está usando um valor de tempo de 32 bits.

Não tenho certeza de como você pode corrigir isso, usando um sistema de 64 bits ou uma ferramenta diferente, por exemplo, DateTime em Perl ou datetime em Python.

Alguns antecedentes:

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

Mais informações em:

Mikel
fonte
Obrigado Mikel, acredito que estou em uma máquina de 32 bits. Na verdade, eu estou trabalhando em um servidor remoto e o servidor não revelará muitas informações, mesmo com unamecomando, exceto pelo fato de ele dizer que é uma máquina i686, que eu presumo serem máquinas de 32 bits. Quanto ao problema 2038, sim, esse problema existe no servidor remoto. Mais uma vez obrigado pela sua contribuição! Muito apreciado!!
Jasdeep Singh
Sim, o i686 é de 32 bits. Feliz em ajudar. Se você precisar de ajuda para lidar com datas anteriores, tente os módulos Python e Perl que sugeri e poste outra pergunta se não conseguir fazê-lo funcionar.
Mikel
7

Seu sistema (ou pelo menos essa versão da 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 assinado de 32 bits.

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

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

Chris Johnsen
fonte