fecha: los años anteriores a 1901 se consideran inválidos

11

Tengo date (GNU coreutils) 7.1 instalado en mi sistema.

Si trato de verificar las fechas anteriores al 14 de diciembre de 1901, aparece un error de "fecha no válida". Por ejemplo,

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

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

¿Qué debo hacer para que la dateutilidad para tratar años anteriores a 1901 sea válida?

Recibo errores similares para fechas posteriores al 19 de enero de 2038

Jasdeep Singh
fuente
No recibo ningún error Estoy usando coreutils 8.10, ¿tal vez un error viejo?
xenoterracide
@xenoterracide ¿eres un sistema de 64 bits?
Mikel
@Mikel sí, lo estoy
xenoterracide

Respuestas:

15

Buena pregunta.

La documentación dice que debería permitirse.

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

Para meses numéricos, se permite el formato ISO 8601 'AÑO-MES-DÍA', donde AÑO es cualquier número positivo, ...

Un cero inicial debe estar presente si un número es menor que diez.

Si el AÑO es 68 o menor, entonces se le agrega 2000; de lo contrario, si AÑO es inferior a 100, se le agrega 1900.

¿Estás en un sistema de 32 bits?

¿También obtiene un error con las fechas posteriores al 2038-01-20, p. Ej.

date -d '2038-01-20'

Si es así, parece que la fecha GNU está usando un valor de tiempo de 32 bits.

No estoy seguro de cómo puede solucionar esto aparte de usar un sistema de 64 bits o usar una herramienta diferente, por ejemplo, DateTime en Perl o datetime en Python.

Algunos antecedentes:

Los tiempos Unix cuentan el número de segundos desde el 1 de enero de 1970 utilizando un valor entero. Si el sistema usa números enteros de 32 bits, solo puede contar 2.100 millones de segundos hacia adelante (hasta 2038-01-19 03:14:02 UTC) y 2.100 millones de segundos hacia atrás (hasta 1901-12-13 20:45:52 UTC).

Mas información en:

Mikel
fuente
Gracias Mikel, creo que estoy en una máquina de 32 bits. En realidad, estoy trabajando en un servidor remoto y el servidor no revelará mucha información incluso con el unamecomando, excepto el hecho de que dice que es una máquina i686, que supongo que son máquinas de 32 bits. En cuanto al problema 2038, sí, ese problema existe de hecho en el servidor remoto. ¡Gracias de nuevo por tu aportación! ¡¡Muy apreciado!!
Jasdeep Singh
Sí, i686 es de 32 bits. Encantado de ayudar. Si necesita ayuda para lidiar con fechas anteriores, pruebe los módulos de Python y Perl que sugerí, y publique otra pregunta si no puede hacerlo funcionar.
Mikel
7

Su sistema (o al menos esa versión de fecha ) probablemente esté utilizando un valor de tiempo interno de 32 bits.

La época de Unix (valor de tiempo cero) es 1970-01-01 00:00:00 UTC. Este punto de partida coloca 1901-12-13 00:00 EST justo fuera del rango de un valor de tiempo de 32 bits con signo.

1901-12-14 00:00:00 EST es -2147454000
1901-12-13 15:45:52 EST es -2147483648 (también conocido INT_MINen C, el entero con signo mínimo de 32 bits)
1901-12-13 00:00: 00 EST es -2147540400

Puede intentar usar 1901-12-13 15:45:52 EST. Debería funcionar, pero un segundo antes probablemente fallará de la misma manera que 1901-12-13 00:00.

Chris Johnsen
fuente