2015-09-11 1 views
2

Je me suis installé sur Mac OS et certains de mes scripts ne fonctionnent pas après Linux. Un script en particulier est très intéressant.OSX ne parvient pas à convertir ISO8601 à l'époque

Donc, je suis en train de convertir la date ISO8601 en unix époque. OSX manière native de le faire semble être

$ date -j -f "%FT%TZ" "2015-09-09T13:19:09Z" 
Wed 9 Sep 2015 13:19:09 NZST 

$ date -j -f "%FT%TZ" "2015-09-09T13:19:09Z" +%s 
1441761549 

semble bien sauf qu'il est mauvaise réponse. C'est exactement 12 heures de retard par rapport à la vraie réponse et mon fuseau horaire +12 alors comment le fuseau horaire du nuage influence-t-il l'époque d'unix?

Et moi-même vérifier

$ docker run -it --rm trusty date -d"2015-09-09T13:19:09Z" +%s 
1441804749 

mêmes outils sur linux donner réponse ...

Je veux juste comprendre ce qui ne va pas ici - suis-je manque quelque chose ou est-ce juste une chose brisée ?

OSX Yosemite 10.10.4

UPD: Juste quelques détails supplémentaires - je vous suggère qu'il ya une différence entre date util, sauf qu'il est non seulement date.

Stass-MacBook:~ void$ python -c 'import dateutil.parser; print dateutil.parser.parse("2015-09-09T13:19:09Z").strftime("%s")' 
1441761549 

Stass-MacBook:~ void$ docker run trusty python -c 'import dateutil.parser; print dateutil.parser.parse("2015-09-09T13:19:09Z").strftime("%s")' 
1441804749 

Répondre

0

La réponse courte est que la sortie que vous obtenez est la sortie attendue et correcte lorsque vous exécutez l'OS X BSD date utilitaire avec ces arguments. Parce que c'est différent de GNU date.

Pour un résultat similaire à partir de GNU date, vous auriez besoin d'ajouter l'option --utc, et l'exécuter comme ceci:

echo $(date --utc -d '2015-09-09T13:19:09Z' +"%a %-d %b %Y %H:%M:%S") $(date +%Z) 

Si votre fuseau horaire est réglé sur NZST, le sera ci-dessus émettent ce :

Wed 9 Sep 2015 13:19:09 NZST 

Conceptuellement, cette invocation est ce que vous pouvez imaginer BSD date faire lorsqu'il est exécuté comme date -j -f "%FT%TZ" "2015-09-09T13:19:09Z". Pour une chose, même si vous dites, mettez cette date/heure dans le format par défaut (et ne le changez pas autrement), il lance également un fuseau horaire là de toute façon.

Une autre façon de penser à ce qu'il fait est que par défaut BSD date est en fonctionnement comme si vous avez donné un équivalent de l'option qui --utc est, essentiellement à l'opposé de la valeur par défaut GNU date.

En d'autres termes, une différence importante avec BSD date -j -f est que ce vraiment signifie simplement: prendre cette chaîne dans cet autre format de date et vient de mettre dans le format de date par défaut que nous utilisons ici- sans tenir compte du fuseau horaire local pas du tout. Le fait que BSD date accroche dans un fuseau horaire local dans ce cas de la façon dont il le fait m'a toujours semblé au moins juste un genre de bizarre, quelque chose de déroutant.

mêmes outils sur linux donnant une réponse correcte ...

j'espère que de ce qui précède, il est plus clair OS X date et Linux date sont en fait pas les mêmes outils à tous, et vous que si vous attendez à se comporter de la même chose, vous allez être déçu ...


en ce qui se date dans vos scripts pour se comporter les mêmes plates-formes à travers, vous pouvez obtenir GNU date en utilisant homebrew pour installer le package coreutils:

brew install coreutils 

Cela rendra la version GNU disponible sur votre système OS X sous le nom gdate. Donc, vous pourriez remplacer date dans vos scripts avec $DATECMD (ou quelque chose), puis:

  • dans votre OS environnement X, set DATECMD=gdate
  • dans votre environnement Linux, set DATECMD=date

Bien sûr, vous pourrait plutôt faire alias date=gdate mais c'est non recommandé, parce que vous pouvez parfois vouloir exécuter des outils tiers qui attendent BSD date dans votre environnement.

+0

Mise à jour du post. C'était ma première supposition que juste 'date' util est différent mais, comme il est arrivé, j'ai essayé différents utils et tous donnant le même résultat sur OSX. Est-ce quelque part au fond d'une bibliothèque ou quoi? – flashvoid

+0

A propos de python, voir http://stackoverflow.com/questions/24732872/dateutil-parser-parse-and-lost-timezone-information et http://stackoverflow.com/questions/2335405/parse-timezone-abbreviation-to -utc A propos de la bibliothèque sous-jacente, voir 'man strptime'. Vous pouvez essayer d'écrire votre propre application C simple en utilisant 'strptime (3)', et voir si vous avez un comportement différent avec OS X sur un système Linux. – sideshowbarker