Ich habe ein Shell-Skript, das unter Linux ausgeführt wird und diesen Aufruf verwendet, um das gestrige Datum im YYYY-MM-DD
Format abzurufen:
date -d "1 day ago" '+%Y-%m-%d'
Es funktioniert die meiste Zeit, aber als das Skript gestern Morgen lief 2013-03-11 0:35 CDT
, kehrte es "2013-03-09"
statt zurück "2013-03-10"
.
Vermutlich ist die Sommerzeit (die gestern begann) schuld. Ich schätze , dass die Art und Weise "1 day ago"
durchgeführt wird 24 Stunden abgezogen und 24 Stunden vor dem 2013-03-11 0:35 CDT
war 2013-03-09 23:35 CST
, was zu dem Ergebnis führte "2013-03-09"
.
Was ist also ein guter DST-sicherer Weg, um das gestrige Datum in Bash unter Linux zu bekommen?
Antworten:
Ich denke, das sollte funktionieren, unabhängig davon, wie oft und wann Sie es ausführen ...
quelle
date -d yesterday 13:00 -I
Datum unter Mac OSX ist etwas anders.
Für gestern
Für letzte Woche
quelle
gdate
im Homebrew-coreutils
Paket verwenden.date
ist anders.Das sollte auch funktionieren, aber vielleicht ist es zu viel:
quelle
date
das keineyesterday
Syntax unterstützt ...Wenn Sie sicher sind, dass das Skript in den ersten Stunden des Tages ausgeführt wird, können Sie dies einfach tun
Übrigens, wenn das Skript täglich um 00:35 Uhr (über crontab?) Ausgeführt wird, sollten Sie sich fragen, was passieren wird, wenn eine DST-Änderung in diese Stunde fällt. Das Skript konnte nicht oder in einigen Fällen zweimal ausgeführt werden. Moderne Implementierungen von
cron
sind in dieser Hinsicht jedoch ziemlich clever .quelle
Sie können verwenden
Um das Datum von vor 30 Tagen zu erhalten, können Sie 30 durch x Tage ersetzen
quelle
%Y%m%d
es der Frage entspricht. Ich habe trotzdem gestimmt, da es richtig funktioniert hat.Hier eine Lösung, die auch mit Solaris und AIX funktioniert.
Das Manipulieren der Zeitzone ist möglich, um die Uhr einige Stunden zu ändern. Aufgrund der Sommerzeit kann 24 Stunden heute oder vorgestern sein.
Sie sind sicher, dass gestern vor 20 oder 30 Stunden war. Welcher? Nun, die jüngste, die es heute nicht gibt.
Der im Befehl echo verwendete Parameter -e wird für bash benötigt, funktioniert jedoch nicht mit ksh. In ksh können Sie denselben Befehl ohne das Flag -e verwenden.
Wenn Ihr Skript in verschiedenen Umgebungen verwendet wird, können Sie das Skript mit #! / Bin / ksh oder #! / Bin / bash starten. Sie können das \ n auch durch eine neue Zeile ersetzen:
quelle
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:
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:
So,
oder äquivalent zu einer temporären Variablen (äußere Unterschale optional, hält aber Umgebungsvariablen sauber).
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).quelle
So verwenden Sie dies später:
quelle
Sie können verwenden:
Oder wann immer Sie abrufen möchten, wird per Bash abgerufen.
Für Monat:
quelle
Da diese Frage markiert ist Bash "DST sicher"
Und
date
wenn Sie Fork verwenden, um die implizite Verzögerung zu befehlen, gibt es eine einfache und effizientere Möglichkeit, die integrierte Bash -Funktion zu verwenden:Dies ist viel schneller auf mehr Systemfreundlicher als zu mit Gabel zu
date
.Von BashV> = 5.0 , es gibt eine neue Variable
$EPOCHSECONDS
quelle