2つのISO8601日付間の時間差(小数点の2番目の部分を含む)

2つのISO8601日付間の時間差(小数点の2番目の部分を含む)

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

関連情報