Pourquoi ces 2 commandes de date donnent-elles des résultats différents?

9
$ date -d "Apr 1 2016 - 1 month" +%B

me donne "mars", ce qui est formidable - le mois qui précède avril est mars. Si je fais cela cependant:

$ date -d "$(date -d "Apr 1 2016") - 1 month" +%B

ça me donne "février". Cela provoque un bogue dans un code plus complexe que j'ai. Pourquoi ces 2 commandes affichent-elles des résultats différents?

Tal
la source
Les deux m'ont donnéMarch
cuonglm
1
Comme expliqué par Thomas, cela dépend de votre fuseau horaire. Mon heure d'été change le 13 mars - le vôtre ne le fait probablement pas, donc vous ne pouvez pas voir ce comportement aux mêmes dates, ou peut-être pas du tout si vous n'avez pas de changement d'heure d'été.
Tal

Réponses:

11

Vous pouvez voir le problème en activant la trace du shell:

+ date -d 'Apr 1 2016 - 1 month' +%B
March
++ date -d 'Apr 1 2016'
+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month' +%B
February

Lorsque vous utilisez la sortie de la datecommande interne , c'est au tout début du mois d'avril, et lorsque vous soustrayez un mois, la discontinuité est due à la modification EST / EDT:

+ date -d 'Fri Apr  1 00:00:00 EDT 2016 - 1 month'
Mon Feb 29 23:00:00 EST 2016

Vos résultats, bien sûr, varieront en fonction de vos paramètres de fuseau horaire local. L'activation de la trace affichera le fuseau horaire (dans mon cas, EDT).

La raison pour laquelle les résultats diffèrent est que dans ce dernier cas, vous avez donné plus d'informations date, rendu son paramètre plus spécifique , c'est-à-dire l'heure spécifique de la journée. Dans la première partie, cela n'a pas été spécifié, ce qui donne dateplus de latitude sur la façon de déterminer la date / heure à afficher.

Thomas Dickey
la source
Je me rends compte maintenant que cela a à voir avec l'heure d'été (les miens sont ici: timeanddate.com/time/zone/canada/edmonton ), mais je ne comprends toujours pas pourquoi la commande date semble interpréter la même date différemment dans un sous-shell que dans la coque principale. Si j'exécute un script avec date -d "Apr 1 2016"; date -d "$(date -d "Apr 1 2016")":, j'obtiens exactement le même résultat, y compris la même balise de fuseau horaire - pourquoi supprimer un mois des deux donne des résultats différents?
Tal
Oh - votre dernier montage le montre clairement. Merci
Tal