Il suffit d'utiliser date
et de confiance secondes:
Comme vous le faites remarquer à juste titre, de nombreux détails sur le calcul sous-jacent sont cachés si vous vous fiez à l'arithmétique du temps anglaise. Par exemple -d yesterday
, et -d 1 day ago
aura un comportement différent.
Au lieu de cela, vous pouvez compter de manière fiable sur les secondes (précisément documentées) depuis l'époque unix UTC, et bash l'arithmétique pour obtenir le moment souhaité:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Cela a été souligné dans une autre réponse . Ce formulaire est plus portable sur les plates-formes avec différents date
indicateurs de ligne de commande, est indépendant de la langue (par exemple "hier" vs "hier" dans les paramètres régionaux français), et franchement (à long terme) sera plus facile à retenir, car bon, vous le sais déjà. Sinon, vous pourriez continuer à vous demander: "Était-ce -d 2 hours ago
ou -d 2 hour ago
encore?" ou "Est-ce -d yesterday
ou -d 1 day ago
que je veux?"). Le seul point délicat ici est le @
.
Armé de bash et rien d'autre:
Bash uniquement sur bash, vous pouvez également obtenir l'heure d'hier, via le printf intégré:
%(datefmt)T
causes printf to output the date-time string resulting from using
datefmt as a format string for strftime(3). The corresponding argu‐
ment is an integer representing the number of seconds since the
epoch. Two special argument values may be used: -1 represents the
current time, and -2 represents the time the shell was invoked.
If no argument is specified, conversion behaves as if -1 had
been given.
This is an exception to the usual printf behavior.
Alors,
# inner printf gets you the current unix time in seconds
# outer printf spits it out according to the format
printf "%(%Y-%m-%d)T\n" $(( $(printf "%(%s)T" -1) - 24*3600 ))
ou, de manière équivalente à une variable temp (sous-coque externe facultative, mais garde les variables d'environnement propres).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Remarque: malgré la page de manuel indiquant qu'aucun argument du %()T
formateur ne supposera une valeur par défaut -1
, il semble que je reçoive un 0 à la place (merci, bash version 4.3.48 du manuel)