
Я получаю следующие временные метки от 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))