Ich möchte ein Skript oder eine Funktion schreiben, um mir mitzuteilen, wie viele Tage von jetzt bis zu einem bestimmten Datum in der Zukunft vergangen sind. Was ich kämpfe, um herauszufinden, ist, wie man das gegebene Datum verarbeitet und es mit dem gegenwärtigen Datum vergleicht ... Ich stelle mir so etwas vor
read -p "enter the date in the format YYYY-MM-DD "
Und dann gehe ich davon aus, dass ich einen String habe, der für die Shell bedeutungslos ist, und ich muss einige Auswertungen durchführen wie ... ?? (Dies ist nur ein Beispiel; ich denke, es bc
wäre nötig)
i=$(($(date +%Y)-${REPLY%%-*}))
j=$(($(date +%m)-${REPLY:5:2}))
k=$(($(date +%d)-${REPLY##*-}))
Und dann weiß ich nicht, was ich mit diesen Zahlen anfangen soll ... ??
if $i > 1 then assign l=$((i*365)) and else what?? # what about leap years?
Using $j somehow assign m # confused before I've started
Using $k somehow assign n # just as bad
echo $((l+m+n))
Ich mache es mir sicher zu schwer; wahrscheinlich gibt es ein Textverarbeitungswerkzeug, das Daten versteht und sie vergleichen kann.
Wie kann ich das machen?
Antworten:
Epochenzeit
Im Allgemeinen sind Zeitberechnungen am einfachsten, wenn wir die Zeit zuerst in (Unix-) Epochenzeit (Sekunden von 1-1-1970) konvertieren. In Python haben wir Werkzeuge, um die Zeit in die Epochenzeit und zurück in ein beliebiges Datumsformat zu konvertieren.
Wir können einfach ein Format einstellen, wie:
... und heute definieren:
und schreiben Sie anschließend eine Funktion, um die Arbeit zu erledigen:
Dann ist die Ausgabe von:
... das ist, wie erwähnt, die Anzahl der Sekunden seit dem 1.1.1970
Berechnung der Tage zwischen zwei Daten
Wenn wir dies heute und zu einem späteren Zeitpunkt tun, berechnen Sie anschließend die Differenz:
Die Ausgabe wird nach Datum berechnet , da wir das Format verwenden
%Y-%m-%d
. Das Runden auf Sekunden würde möglicherweise einen falschen Datumsunterschied ergeben, wenn wir uns zum Beispiel 24 Stunden nähern.Terminal-Version
... und die Zenity-Option
Und nur zum Spaß ...
Eine winzige Anwendung. Fügen Sie es zu einer Verknüpfung hinzu, wenn Sie es häufig verwenden.
Das Drehbuch:
orangedays.py
Starte es:
Zum einpacken
Verwenden Sie für das winzige Anwendungsskript die folgende
.desktop
Datei:orangedays.desktop
in~/.local/share/applications
In der Schlange
Setze den tatsächlichen Pfad zum Skript ...
quelle
Das GNU-
date
Dienstprogramm ist in solchen Dingen ziemlich gut. Es ist in der Lage, eine Vielzahl von Datumsformaten zu analysieren und dann in einem anderen Format auszugeben. Hier geben wir%s
die Anzahl der Sekunden seit der Epoche aus. Es ist dann eine einfache Sache der Arithmetik,$now
vom zu subtrahieren$future
und durch 86400 Sekunden / Tag zu teilen:quelle
-u
Parameter zu hinzudate
.Sie können versuchen
awk
, mit dermktime
Funktion etwas zu tunDas awk erwartet das Lesen des Datums von der Standardeingabe im Format "JJJJ MM TT HH MM SS" und druckt dann die Differenz zwischen der angegebenen Zeit und der aktuellen Zeit in Tagen.
mktime
konvertiert einfach eine Zeit (im angegebenen Format) in die Anzahl der Sekunden von einer Referenzzeit (1970-01-01 00:00:00 UTC); systime simple gibt die aktuelle Uhrzeit im selben Format an. Subtrahieren Sie eine von der anderen und Sie erhalten in Sekunden, wie weit sie voneinander entfernt sind. Teilen Sie durch 86400 (24 * 60 * 60), um in Tage umzurechnen.quelle
Hier ist eine Ruby-Version
Beispiellauf:
Ein Beispiel für die Ausführung des Skripts finden Sie weiter
ruby ./day-difference.rb
unten (vorausgesetzt, Sie haben es gespeichert alsday-difference.rb
).Mit einem zukünftigen Datum
Mit einem verstrichenen Datum
Wann ist das heutige Datum vergangen?
Hier ist eine schöne Website, um die Unterschiede des Datums zu überprüfen http://www.timeanddate.com/date/duration.html
quelle
Es gibt ein
dateutils
Paket, das für den Umgang mit Daten sehr praktisch ist. Lesen Sie mehr darüber hier github: dateutilsInstallieren Sie es durch
sudo apt install dateutils
Für Ihr Problem einfach,
dateutils.ddiff <start date> <end date> -f "%d days"
wobei die Ausgabe als Sekunden, Minuten, Stunden, Tage, Wochen, Monate oder Jahre gewählt werden kann. Es kann bequem in Skripten verwendet werden, in denen die Ausgabe für andere Aufgaben verwendet werden kann.
Beispielsweise,
quelle
Sie können die awk Velour-Bibliothek verwenden :
Oder:
quelle
Eine kurze Lösung, wenn beide Daten zum selben Jahr gehören, ist:
unter Verwendung des "% j" -Formats, das die Position des Datums in Tagen im Jahr zurückgibt, dh 135 für das aktuelle Datum. Es vermeidet Rundungsprobleme und behandelt Datumsangaben in der Vergangenheit, was zu negativen Ergebnissen führt.
Das Überschreiten der Jahresgrenzen wird jedoch scheitern. Sie können 365 manuell für jedes Jahr oder 366 für jedes Schaltjahr addieren (oder subtrahieren), wenn der letzte Februar überschritten ist. Dies ist jedoch fast so ausführlich wie bei anderen Lösungen.
Hier die reine Bash-Lösung:
Shellcheck schlägt viele doppelte Anführungszeichen vor, aber für Tage, die das Jahr 9999 überschreiten, sollten Sie einen anderen Ansatz in Betracht ziehen. In der Vergangenheit wird es für Daten vor dem 1970.01.01 stillschweigend fehlschlagen. Das Desinfizieren von Benutzereingaben wird dem Benutzer als Übung überlassen.
Die beiden Funktionen können in eine überarbeitet werden, was das Verständnis jedoch erschwert.
Bitte beachten Sie, dass das Skript umfangreiche Tests benötigt, um Schaltjahre in der Vergangenheit korrekt zu handhaben. Ich würde nicht wetten, dass es richtig ist.
quelle