Je jouais avec date
pour essayer de convertir des expressions telles que "2 heures" en un nombre de secondes comme 7200. Je pensais pouvoir le faire avec des invocations telles que :
date -d "1970-01-01 00:00:00 + 2 hours" +"%s"
Pourtant, j'ai remarqué des résultats extrêmement étranges en le faisant. (Mon /etc/timezone
contient "Europe/Paris", d'où l'utilisation de TZ
pour forcer les heures 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
Le premier résultat est assez raisonnable, mais je suis vraiment totalement perplexe sur la façon dont date
aurait pu trouver les trois derniers résultats. Est-ce que quelqu'un comprend la logique entre ces résultats ?
Réponse acceptée :
Je pense que ça prend votre + x
comme spécificateur de fuseau horaire (par exemple, considérez 2013-04-25 19:52:36 +4
est un horodatage valide, dans un fuseau horaire de 4 heures en avance sur UTC).
Il s'agit alors de voir le mot "minutes" et de le traiter comme un synonyme de minute, ce qui vous donne une minute plus tard.
Si vous mettez un spécificateur de fuseau horaire explicite, cela fonctionne :
[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
Notez le UTC
après le champ des secondes. Vous pouvez également mettre un second +0
:
[email protected]:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60
… mais au moins personnellement, c'est beaucoup plus difficile à lire.
Ou vous pouvez mettre un Z
après les secondes, etc. Vous n'avez pas vraiment besoin du TZ
variable d'environnement à définir sur UTC dans les exemples ci-dessus.