¿Por qué hay una diferencia con la fecha Unix entre 2 y 3 meses?


16

¿Cómo es esto posible y cómo lo enfrento? Estoy haciendo un script de respaldo que depende de Unix datey he descubierto un error interesante:

[root@web000c zfs_test]# date +%y-%m-%d --date='2 months ago'
14-04-01
[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago'
14-02-28
[root@web000c zfs_test]# date
Sun Jun  1 00:08:50 CEST 2014

¿Podría ser un año bisiesto / 29 de febrero error? Es poco probable en una herramienta como date...
Mark Henderson

Respuestas:


44

Estás viendo este comportamiento debido al horario de verano (horario de verano).

Debido a que actualmente se encuentra en horario de verano, donde su reloj tiene una hora de anticipación, cuando lo solicitó hace tres meses justo después de la medianoche del primero de junio, el tiempo termina siendo una hora "antes" porque no era el horario de verano tres Hace meses.

La documentación de la fecha GNU sugiere evitar esto usando las 12:00 del mediodía y el 15 del mes como puntos de partida, cuando se solicitan días o meses relativos, respectivamente. Por ejemplo:

date +%y-%m-%d --date="$(date +%Y-%m-15) -3 month"

gracias. Sí, exactamente "hace 3 meses" a las 01 am:[root@web000c zfs_test]# date +%y-%m-%d --date='3 months ago' 14-03-01 [root@web000c zfs_test]# date Sun Jun 1 01:00:15 CEST 2014
Shirker

Doh! Creo que necesito revisar algunos de mis scripts, ya que sospecho que he pasado por alto esta sugerencia sobre el dateuso.
Caleb

14

Si el tiempo absoluto es su principal preocupación, probablemente sea mejor trabajar fuera de UTC, ya que existe para ese propósito. La respuesta de Michael es muy útil para cuando tienes que trabajar dentro del problema, pero generalmente es una buena idea evitarlo por completo donde puedas.

Cuando su sistema no está configurado en UTC de manera predeterminada, la forma más simple de pasar la zona horaria es anteponiendo su comando con la TZvariable de entorno. Esto limita el cambio de zona a un solo comando y evita que la variable se filtre en los comandos posteriores.

$ NOW=$(date '+%s')
$ date -d @$NOW
Wed Jun 11 23:44:35 EDT 2014
$ TZ=UTC date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014

Lo que no debe hacer es exportar la TZvariable, ya que esto puede hacer que las cosas sean muy confusas para solucionar problemas, como lo demuestra lo siguiente.

$ export TZ=UTC
$ date -d @$NOW
Thu Jun 12 03:44:35 UTC 2014
$ TZ=EDT date -d @$NOW
Thu Jun 12 03:44:35 EDT 2014

-3

En este año específico en que su computadora cree que está funcionando, y en la fecha específica que eligió para una prueba de "Hace 1 mes, hace 2 meses y hace 3 meses, sí, es probable que sea una detección del 29 de febrero. No siempre un error, pero ..

Ahora, hoy NO es 2014-06-01. Inténtalo de nuevo. Establezca la fecha de la computadora en 2013-06-01. Inténtalo de nuevo.
Establezca la fecha de la computadora en 2014-09-01. Inténtalo de nuevo.


66
Si proporciona fechas en MDYformato americano , utilice los platos /para separar. Aún mejor, como somos una comunidad internacional aquí, use fechas ISO adecuadas como 2014-09-01.
glglgl
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.