Pourquoi le temps est-il interrompu avec la date “- 1 jour”?

Cela convertit le datetime donné en epoch time (secondes)

date -d"2015-07-24 11:29:00" +%s // gives 1437762540 

Maintenant, je veux faire la même chose, mais soustrais un jour. Normalement, c’est aussi simple que d’append “- 1 jour”. Cependant, au lieu de soustraire un jour, cela ajoute un jour.

 date -d"2015-07-24 11:29:00 - 1 day" +%s // gives 1437848940 (notice, this value is great than the one above) 

Si je retire la partie temps de mon horodatage, cela fonctionne très bien. La portion de temps semble toutefois la rompre. Je sais que je peux le faire en deux étapes distinctes et éviter ce problème. Cependant, j’espérais le faire en une seule commande. Est-ce possible?

Il y a une certaine ambiguïté dans la commande de date sur la façon d’interpréter le jeton- - 1 dans votre chaîne de date. Il le résout comme une spécification de fuseau horaire

 $ date -d "2015-07-24 11:29:00 -1" Fri Jul 24 08:29:00 EDT 2015 $ date -d "2015-07-24 11:29:00 UTC-1" Fri Jul 24 08:29:00 EDT 2015 $ date -d "2015-07-24 11:29:00 - 2" Fri Jul 24 09:29:00 EDT 2015 $ date -d "2015-07-24 11:29:00 UTC-2" Fri Jul 24 09:29:00 EDT 2015 $ TZ=UTC date -d "2015-07-24 11:29:00 -1" Fri Jul 24 12:29:00 UTC 2015 

(vos résultats peuvent varier en fonction de votre réglage TZ )

La partie day est alors interprétée comme signifiant append un jour

 $ date -d "2015-07-24 11:29:00 - 1 day" Sat Jul 25 12:29:00 EDT 2015 $ date -d "2015-07-24 11:29:00 UTC-1 + 1 day" Sat Jul 25 12:29:00 EDT 2015 

Ajoutez une spécification de fuseau horaire à votre chaîne de date, comme le suggère @amdixon, pour résoudre l’ambiguïté et obtenir les résultats attendus.

Pour référence, la page d’informations de GNU coreutils pour “Formats d’entrée de date”: https://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html

Je n’ai pas de réponse précise. Je sais que l’parsing syntaxique de forme libre est difficile. Jouer avec date:

 $ date -d"2015-07-24 11:29:00 - 1 day" "+%F %T" 2015-07-25 08:29:00 $ date -d"2015-07-24 - 1 day" "+%F %T" 2015-07-23 00:00:00 $ date -d"11:29:00 - 1 day" "+%F %T" 2015-07-25 08:29:00 $ date -d"2015-07-24 - 1 day 11:29:00" "+%F %T" 2015-07-23 11:29:00 

Ainsi, la soustraction d’un jour à une date semble fonctionner, mais la soustraction d’un jour à une heure pose problème.