Estaba jugando para date
intentar convertir expresiones como "2 horas" a 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 las horas 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
se podrían haber obtenido los tres últimos resultados. ¿Alguien entiende la lógica entre esos resultados?
Respuesta1
Creo que lo está tomando + x
como especificador de zona horaria (por ejemplo, considere 2013-04-25 19:52:36 +4
que es una marca de tiempo válida, en una zona horaria 4 horas antes de UTC).
Luego ve la palabra "minutos" y la trata como sinónimo de minuto, por lo que le da un minuto más tarde.
Si ingresa un especificador de zona horaria explícito, funciona:
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s"
-60
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s"
60
Tenga en cuenta el UTC
campo después de los segundos. También puedes poner un segundo +0
:
anthony@Zia:~$ 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 puede poner un Z
después de los segundos, etc. En realidad, no necesita que la TZ
variable de entorno esté configurada en UTC en los ejemplos anteriores.