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

관련 정보