분수 초 부분이 있는 두 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.946109551bc

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

관련 정보