
Ich erhalte folgende Zeitstempel von Alpine Linux:
2017-04-25T07:19:53.946109551Z
2017-04-25T07:19:53.946155414Z
Wie kann ich sie entschlüsseln und feststellen, wie viel Zeit zwischen ihnen vergangen ist?
In der verknüpften Frage ist von Epochenzeit die Rede, was hier eindeutig nicht der Fall ist.
Antwort1
Auf GNU-Systemen:
d1=2017-04-25T07:19:53.946109551Z
d2=2017-04-25T07:19:53.946155414Z
printf '%s - %s\n' "$(date -d "$d2" +%s.%N)" "$(date -d "$d1" +%s.%N)" | bc
Würde Ihnen den Zeitunterschied als Gleitkommazahl in Sekunden geben.
.
Vorbehalt: Die Zahl wird mit einem Punkt ( ) als Dezimaltrennzeichen angegeben, selbst in Gebietsschemas, in denen ,
stattdessen ein Komma () verwendet wird.
Sie können die Ausgabe umleiten, um tr . "$(locale decimal_point)"
das Problem zu beheben.
Oder zsh
Sie können mit Folgendes tun:
printf '%.9f\n' $(($(date -d "$d2" +%s.%N) - $(date -d "$d1" +%s.%N)))
Dadurch erhalten Sie eine Zahl mit dem richtigen Dezimaltrennzeichen in Ihrer Region.
Da dann jedoch zsh
das double
Zahlenformat Ihres Prozessors verwendet wird, stellen Sie möglicherweise fest, dass eine andere Zahl zurückgegeben wird, wenn Zahlen wie 1493104793.946109551
die Genauigkeitsgrenze dieser Zahlen erreichen. bc
tritt dieses Problem nicht auf, da eine beliebige Genauigkeit verwendet wird.
zsh
verfügt über integrierte Zeitanalysefunktionen, sodass man auch eine Lösung schreiben kann, die auf Nicht-GNU-Systemen funktioniert, wie:
parse_iso8601_full() {
local t
typeset -Fg REPLY
zmodload zsh/datetime
TZ=UTC0 strftime -r -s t %Y-%m-%dT%H:%M:%S ${1%.*} &&
REPLY=$t.${${1%Z}##*.}
}
parse_iso8601_full $d1; t1=$REPLY
parse_iso8601_full $d2; t2=$REPLY
printf '%.9f\n' $((t2 - t1))