Разница во времени между двумя датами 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))

Связанный контент