Zeitdifferenz zwischen zwei ISO8601-Daten mit Sekundenbruchteilen

Zeitdifferenz zwischen zwei ISO8601-Daten mit Sekundenbruchteilen

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 zshSie 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 zshdas doubleZahlenformat Ihres Prozessors verwendet wird, stellen Sie möglicherweise fest, dass eine andere Zahl zurückgegeben wird, wenn Zahlen wie 1493104793.946109551die Genauigkeitsgrenze dieser Zahlen erreichen. bctritt dieses Problem nicht auf, da eine beliebige Genauigkeit verwendet wird.

zshverfü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))

verwandte Informationen