Verwenden Sie einfach date
und vertrauenswürdige Sekunden:
Wie Sie zu Recht betonen, sind viele Details der zugrunde liegenden Berechnung verborgen, wenn Sie sich auf die englische Zeitarithmetik verlassen. ZB -d yesterday
und -d 1 day ago
wird ein anderes Verhalten haben.
Stattdessen können Sie sich zuverlässig auf die (genau dokumentierten) Sekunden seit der Unix-Epoche UTC und die Bash-Arithmetik verlassen, um den gewünschten Moment zu erhalten:
date -d @$(( $(date +"%s") - 24*3600)) +"%Y-%m-%d"
Darauf wurde in einer anderen Antwort hingewiesen . Dieses Formular ist plattformübergreifend mit unterschiedlichen date
Befehlszeilenflags portabler, sprachunabhängig (z. B. "gestern" vs "hier" im französischen Gebietsschema) und offen gesagt (auf lange Sicht) leichter zu merken, weil Sie weiß es schon. Sie könnten sich sonst immer wieder fragen: "War es -d 2 hours ago
oder -d 2 hour ago
wieder?" oder "Ist es -d yesterday
oder -d 1 day ago
das ich will?"). Das einzig schwierige hier ist das @
.
Bewaffnet mit Bash und sonst nichts:
Bash nur auf Bash, können Sie auch die gestrige Zeit über die eingebaute printf erhalten:
%(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.
So,
# 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 ))
oder äquivalent zu einer temporären Variablen (äußere Unterschale optional, hält aber Umgebungsvariablen sauber).
(
now=$(printf "%(%s)T" -1);
printf "%(%Y-%m-%d)T\n" $((now - 24*3600));
)
Hinweis: Obwohl auf der Manpage angegeben ist, dass kein Argument für den %()T
Formatierer einen Standardwert -1
annimmt, erhalte ich stattdessen eine 0 (danke, Bash-Handbuch Version 4.3.48).