兩個 ISO8601 日期之間的時間差(帶有小數第二部分)

兩個 ISO8601 日期之間的時間差(帶有小數第二部分)

我從 Alpine Linux 收到以下時間戳記:

2017-04-25T07:19:53.946109551Z    
2017-04-25T07:19:53.946155414Z

我如何解碼它們並知道它們之間已經過去了多少時間?

連結的問題談論的是紀元時間,而這裡顯然不是。

答案1

在 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))

相關內容