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