Estaba jugando con date
para tratar de convertir expresiones como "2 horas" en una cantidad de segundos como 7200. Pensé que podría realizar esto con invocaciones como:
date -d "1970-01-01 00:00:00 + 2 hours" +"%s"
Sin embargo, noté resultados extremadamente extraños mientras lo hacía. (Mi /etc/timezone
contiene "Europa/París", de ahí el uso de TZ
para forzar la hora UTC).
omega:~$ TZ=utc date -d "1970-01-01 00:00:00" +"%s"
0
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 0 minutes" +"%s"
60
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + -1 minutes" +"%s"
3660
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 1 minutes" +"%s"
-3540
El primer resultado es bastante razonable, pero estoy totalmente desconcertado acerca de cómo date
podría haber llegado a los tres últimos resultados. ¿Alguien entiende la lógica entre esos resultados?
Respuesta aceptada:
Creo que está tomando tu + x
como especificador de zona horaria (por ejemplo, considere 2013-04-25 19:52:36 +4
es una marca de tiempo válida, en una zona horaria 4 horas antes de UTC).
Entonces es ver la palabra 'minutos' y tratarla como sinónimo de minuto, por lo que le da un minuto más tarde.
Si coloca un especificador de zona horaria explícito, funciona:
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"
0
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s"
-60
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s"
60
Tenga en cuenta el UTC
después del campo de segundos. También puedes poner un segundo +0
:
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60
… pero al menos personalmente, eso es mucho más difícil de leer.
O puedes poner una Z
después de los segundos, etc. En realidad no necesitas el TZ
variable de entorno que se establecerá en UTC en los ejemplos anteriores.