Timestamps
帶有小數秒部分的兩個 ISO8601 日期之間的時間差
我從 Alpine Linux 收到以下時間戳:
2017-04-25T07:19:53.946109551Z 2017-04-25T07:19:53.946155414Z
我如何解碼它們並知道它們之間經過了多少時間?
連結的問題談論的是紀元時間,而這裡顯然不是。
在 GNU 系統上:
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
會給你時間差作為浮點數秒。
警告:數字將使用句點 (
.
) 作為小數分隔符,即使在它是逗號 (,
) 的語言環境中也是如此。您可以通過管道將該輸出
tr . "$(locale decimal_point)"
進行修復。或者,使用
zsh
,您可以執行以下操作:printf '%.9f\n' $(($(date -d "$d2" +%s.%N) - $(date -d "$d1" +%s.%N)))
相反,它將在您的語言環境中為您提供一個帶有正確小數分隔符的數字。
但是,從那時起
zsh
使用double
處理器的數字格式,您可能會發現它給出了不同的數字,因為數字1493104793.946109551
達到了這些數字的精度限制。bc
沒有問題,因為它使用任意精度。
zsh
具有內置的時間解析功能,因此也可以編寫一個適用於非 GNU 系統的解決方案,例如: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))