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