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 ?
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 ?
Antworten:
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.
Ich denke, das ist die einfachste Methode:
expr $(date +%s) / 86400
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 +%-:::z
einen Fehler "Ungültiges Zeichen im Ausdruck" erzeugt wenn in der obigen Aussage verwendet.
$()
wird aus Gründen der Lesbarkeit und aus anderen Gründen Backticks vorgezogen .echo $(( $(date ...) / 86400 ))