Ich möchte oft einige schnelle Datumsberechnungen durchführen, wie zum Beispiel:
- Was ist der Unterschied zwischen diesen beiden Daten?
- Was ist das Datum n Wochen nach diesem anderen Datum?
Normalerweise öffne ich einen Kalender und zähle die Tage, aber ich denke, es sollte ein Programm / Skript geben, mit dem ich diese Art von Berechnungen durchführen kann. Irgendwelche Vorschläge?
Antworten:
Die "n Wochen nach einem Datum" sind mit GNU date (1) einfach:
Ich kenne keine einfache Methode, um die Differenz zwischen zwei Daten zu berechnen, aber Sie können date (1) mit einer Shell-Funktion in eine kleine Logik umschließen.
Tauschen Sie
d1
undd2
wenn Sie die Datumsberechnung in die andere Richtung wollen, oder etwas ausgefeilter, damit es keine Rolle spielt. Darüber hinaus ist einer der Tage nur 23 Stunden lang, wenn in dem Intervall ein Übergang von der Sommerzeit zur Winterzeit stattfindet . Sie können dies kompensieren, indem Sie der Summe einen halben Tag hinzufügen.quelle
Probieren Sie für eine Reihe von tragbaren Tools meine eigenen Dateutils . Ihre beiden Beispiele würden sich auf Einzeiler beschränken:
oder in Wochen und Tagen:
und
quelle
dateadd -i '%m%d%Y' 01012015 +1d
es nicht zu funktionieren scheint, es hängt nur auf unbestimmte Zeit dort ... es funktioniert, wenn die Datumsangaben durch einEin Python-Beispiel zur Berechnung der Anzahl der Tage, an denen ich den Planeten bereist habe:
quelle
ychaouche@ychaouche-PC ~ $ python -c "from datetime import date as d; print (d.today() - d(1980, 6, 14)).days"
12813
ychaouche@ychaouche-PC ~ $
Normalerweise bevorzuge ich die Angabe von Uhrzeit und Datum im Unix-Utime-Format (Anzahl der Sekunden seit Beginn der siebziger Jahre, UTC). Auf diese Weise läuft es immer auf einfache Subtraktion oder Addition von Sekunden hinaus.
Das Problem besteht normalerweise darin, ein Datum / eine Uhrzeit in dieses Format umzuwandeln.
In einer Shell-Umgebung / einem Skript können Sie es mit
date '+%s'
herunterladen. Zum Zeitpunkt des Schreibens ist die aktuelle Uhrzeit1321358027
.Zum Vergleich mit 2011-11-04 (mein Geburtstag)
date '+%s' -d 2011-11-04
, nachgebend1320361200
. Subtrahieren:expr 1321358027 - 1320361200
Gibt996827
Sekunden zurück, wasexpr 996827 / 86400
= vor 11 Tagen ist.Das Konvertieren von utime (1320361200-Format) in ein Datum ist mit Standardbibliotheken zum Beispiel in C, PHP oder Perl sehr einfach. Bei GNU
date
kann dem-d
Argument@
das Format "Sekunden seit der Epoche" vorangestellt werden.quelle
date -d @1234567890
Konvertiert mit GNU date von Sekunden seit der Epoche in das von Ihnen angegebene Datumsformat.info date
insbesondere die Sekunden seit dem Knoten " Epoche ": "Wenn Sie einer Zahl ein" @ "voranstellen, stellt dies einen internen Zeitstempel als Anzahl von Sekunden dar."Dies trat auf, als verwendet wurde
date -d "$death_date - $y years - $m months - $d days"
, um ein Geburtsdatum zu erhalten (für Genealogie). Dieser Befehl ist FALSCH. Monate sind also nicht alle gleich lang(date + offset) - offset != date
. Das Alter in Jahr / Monat / Tag ist ein Maß, das vom Geburtsdatum an voranschreitet.Das Datum gibt in beiden Fällen die richtige Ausgabe aus, aber im zweiten Fall haben Sie die falsche Frage gestellt. Es ist wichtig, WELCHE 11 Monate im Jahr +/- 11 umfassen, bevor Tage addiert / subtrahiert werden. Zum Beispiel:
Damit das Subtrahieren die inverse Operation des Addierens ist, müsste die Reihenfolge der Operationen umgekehrt werden. Durch Hinzufügen werden Jahre, DANN Monate, DANN Tage hinzugefügt. Wenn Sie die umgekehrte Reihenfolge beim Subtrahieren verwenden, kehren Sie zum Ausgangspunkt zurück. Dies ist nicht der Fall, und Sie tun es auch nicht, wenn der Tagversatz eine Monatsgrenze in einem Monat mit einer anderen Länge überschreitet.
Wenn Sie ab einem Enddatum und Alter rückwärts arbeiten müssen, können Sie dies mit mehreren Aufrufen von tun
date
. Subtrahieren Sie zuerst die Tage, dann die Monate und dann die Jahre. (Ich denke nicht, dass es sicher ist, die Jahre und Monate in einem einzigendate
Aufruf zu kombinieren , da Schaltjahre die Länge des Februar verändern.)quelle
Wenn ein grafisches Tool für Sie in Ordnung ist, empfehle ich es von ganzem Herzen
qalculate
(ein Taschenrechner mit Schwerpunkt auf Einheitenumrechnungen, mit GTK- und KDE-Schnittstelle, IIRC). Dort kann man zB sagenUm die Anzahl der Tage (140, da 1900 kein Schaltjahr war) zwischen den Daten zu ermitteln, können Sie dies natürlich auch für die folgenden Zeiten tun:
ergibt
8.4591667
Stunden oder, wenn Sie die Ausgabe Zeit Formatierung eingestellt8:27:33
.quelle
qalc
dannhelp days
.qcalc
Beispiel:qalc -t 'days(1900-05-21, 1900-01-01)'
-> 140Ich verwende häufig SQL für Datumsberechnungen. Zum Beispiel MySQL , PostgreSQL oder SQLite :
Manchmal habe ich einfach Lust auf JavaScript. Zum Beispiel SpiderMonkey , WebKit , Seed oder Node.js :
(Achten Sie darauf, wenn Sie den Monat an den
Date
Konstruktor des JavaScript- Objekts übergeben. Beginnt mit 0.)quelle
Eine andere Möglichkeit, die Differenz zwischen zwei Daten desselben Kalenderjahres zu berechnen, ist die folgende:
date
der Variablen DATEfirstnum den Wert von aus zu. Das-d
Flag zeigt die Zeichenfolge in einem Zeitformat an, in diesem Fall am 14. Mai 2014, und+"%j"
weistdate
an, die Ausgabe nur auf den Tag des Jahres (1-365) zu formatieren.DAYSdif
der Differenz der beiden Tage zu.DAYSdif
.Dies funktioniert mit der GNU-Version von
date
, jedoch nicht mit der PC-BSD / FreeBSD-Version. Ich habecoreutils
von Ports Tree aus installiert und/usr/local/bin/gdate
stattdessen den Befehl verwendet.quelle
DATEfirstnum=$(date -d "$1" +%s)
DATElastnum=$(date -d "$2" +%s)
Außerdem kann dieses Skript die Differenz zwischen zwei verschiedenen Jahren nicht berechnen.+%j
bezieht sich auf den Tag des Jahres (001..366),./date_difference.sh 12/31/2001 12/30/2014
gibt also -1 aus. Wie andere Antworten angemerkt haben, müssen Sie beide Daten seit 1970-01-01 00:00:00 UTC in Sekunden umrechnen.$
arithmetischen Ausdruck im Inneren:$((DATElastnum - DATEfirstnum))
funktioniert auch.Mit Hilfe von dannas solutions kann dies in einer Zeile mit folgendem Code erfolgen:
(Funktioniert sowohl in Python 2.x als auch in Python 3.)
quelle
date
und bash können Datumsunterschiede verursachen (OS X-Optionen werden angezeigt). Legen Sie das letztere Datum zuerst.quelle
Es gibt auch die Zeitberechnungen der GNU-Einheit in Kombination mit dem GNU-Datum:
(gunits ist Einheiten in Linux, gdate ist Datum)
quelle
datediff.sh auf github: gist
quelle
Die Antwort von camh erledigt das meiste, aber wir können den Umgang mit Rundungen, Zeitzonen usw. verbessern. Außerdem erhalten wir zusätzliche Präzision und die Möglichkeit, unsere Einheiten auszuwählen:
-d
gibt an,date
dass wir ein Datum und eine Uhrzeit für die Konvertierung angeben.+%s.%N
Ändert die Datums- und Uhrzeitangabe in Sekunden.nanosekunden seit 1970-01-01 00:00:00 UTC.bc
berechnet die Differenz zwischen den beiden Zahlen und der Teilungsfaktor ergibt die verschiedenen Einheiten.printf
Fügt bei Bedarf eine 0 vor der Dezimalstelle hinzu (bc
nicht) und stellt sicher, dass die Rundung auf die nächste Stelle erfolgt (bc
nur Kürzungen). Sie könnten auch verwendenawk
.Nun lassen Sie uns dies mit einem flippigen Testfall ausführen,
Da die Länge eines Monats oder Jahres nicht immer gleich ist, gibt es dort keine einzige "richtige" Antwort, obwohl man heutzutage 365,24 Tage als vernünftige Annäherung verwenden könnte.
quelle
Sie können die awk Velour-Bibliothek verwenden :
Oder:
Ergebnis:
quelle