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