Tage seit dem 1.1.1970 berechnen


10

Wie können Sie die Anzahl der Tage seit dem 1.1.1970 berechnen? Dies dient zum Aktualisieren des shadowLastChange- Attributs in OpenLDAP.

Gibt es eine Möglichkeit, dies mit dem Befehl linux date zu tun ?


In Bash und den meisten modernen von Bourne abgeleiteten Shells $()wird aus Gründen der Lesbarkeit und aus anderen Gründen Backticks vorgezogen . echo $(( $(date ...) / 86400 ))
Bis auf weiteres angehalten.

Ich habe noch keine 2000 ... kann jemand den Titel bearbeiten und korrigieren :-)
Ring Ø

Antworten:


20

ring0 hat mich ein paar Sekunden geschlagen, aber der vollständige Befehl lautet:

echo $(($(date --utc --date "$1" +%s)/86400))

Dies läuft nach UTC-Zeit. Ergebnis:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

Eine schnelle Überprüfung mit WolframAlpha zeigt, dass dies der richtige Wert ist.


1
Was ist mit Schaltsekunden? :)
Netvope

1
@netvope Nach einer zusätzlichen Schaltsekunde wird die Unix-Zeit erneut um eins zurückgesetzt. Jeder Tag fügt also genau 86400 Unix-Sekunden hinzu. Jedoch 915148800 UNIX Zeit für beide UTC stehen kann 1998-12-31T23: 59: 60 und 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

Der dateBefehl kann Ihnen die Anzahl der Sekunden seitdem geben 1970-01-01 00:00:00 UTC.

  date +"%s"

Sie können das Ergebnis durch dividieren 3600*24, um die Anzahl der Tage (UTC) zu erhalten.

ZB in Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

um die Anzahl der Tage anzuzeigen.


9

Ich denke, das ist die einfachste Methode:

expr $(date +%s) / 86400

Warum wird das abgelehnt? Es ist die beste und kürzeste und einfachste Antwort
Tom Corelis

1

Ich musste das auch lösen, aber ich wollte unabhängig von der Tageszeit den gleichen Wert für den Tag # erhalten. Bei Ansätzen wie den hier gezeigten ändert sich der Wert um Mitternacht UTC anstelle von Mitternacht Ortszeit. Dies scheint wahrscheinlich weniger ein Problem in der EU oder an der Ostküste der USA zu sein, die nahe genug an UTC liegen, dass sich der Tageswert nicht in der Mitte des typischen Arbeitstages ändert, sondern beispielsweise in Kalifornien die Tagesänderung würde um 16 Uhr PST auftreten, was unpraktisch sein könnte. Ich kann mir vorstellen, dass die Australier besonders verärgert wären, wenn sich der Tageswert am späten Morgen ändern würde.

Wenn wir das korrigieren wollen, müssen wir den Versatz von UTC addieren, bevor wir durch Sekunden / Tag dividieren. Glücklicherweise enthält der Linux-Datumsbefehl eine Sequenz im % z- Format, die den Versatz von UTC meldet. Während das Standardformat (dieses Ergebnis ist für Denver Zeit, MDT):

$ date +%z
-0600

. . . ist nicht direkt in einer Berechnung verwendbar, die richtigen Modifikatoren ergeben das, was wir wollen:

$ date +%-:::z
-6

Kombinieren Sie dies mit den üblichen Sekunden / Stunden / Tagen-Konvertierungen, und ich glaube, dass die Tage seit dem 1.1.1970 wie folgt ausgegeben werden sollten, wobei der 1.1.1970 selbst Tag Null ist und der Wert um Mitternacht Ortszeit erhöht wird:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

Diese einfache Berechnung funktioniert nicht für Zeitzonen, die nicht um ganze Stunden von UTC versetzt sind (z. B. Indien, TZ = Asien / Kolkata), da das von erzeugte "+5: 30" date +%-:::zeinen Fehler "Ungültiges Zeichen im Ausdruck" erzeugt wenn in der obigen Aussage verwendet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.