방금 유닉스 시간을 발견했습니다윤초 제외. 그렇게 하면 UTC에서 서서히 멀어지기 때문에 이는 매우 놀라운 일이라고 생각합니다. 하지만 제 질문의 요점은 그게 아닙니다.
편집(3x): 간단히 말해서 자세한 내용은 아래 및 설명을 참조하세요.
시스템 시계가 Unix/POSIX 시간(아니요date
"실제" UTC), Unix 시대( 또는 다른 프로그램 에서) 이후 경과된 실제 시간(초)을 어떻게 알 수 있나요 ?
아니면 적어도 수동으로 다운로드하지 않고도 윤초를 얻을 수 있는 "윤초" 파일이 Linux에 있습니까?
내 시스템 시계가 Unix 시간으로 설정되어 있다는 결론에 도달한 방법에 대한 설명:
따라서 과거 그레고리력 및 UTC 시간 척도를 기준으로 신기원을 가장 정확하게 결정하려면,사용자는 명백한 NTP 또는 POSIX 에포크에서 관련 오프셋을 빼야 합니다.IERS에서 제공.
date --utc +%s
실제로 "Unix 타임스탬프"라고 부르는 것을 제공하는 결론에 도달한 방법에 대한 설명:
첫 번째 윤초는 1972년 6월 30일에 도입되었습니다.
1970년 1월 1일(유닉스 시대) 00:00:00부터 1972년 7월 1일 00:00:00 사이에는 365 + 365 + (31+29+31+30+ 31+30)이 있다는 것을 쉽게 계산할 수 있습니다. ) 일 + 1 윤초 = 912일 + 1 윤초 = 78796801초. 지금 시도해 보십시오 date -R --utc -d @78796801
... 출력: 1972년 7월 1일 토요일 00:00:01!!(내가 전에 했던 것처럼) Unix 타임스탬프가 1970년 1월 1일 00:00:00 이후 현실 세계에서 경과된 초 수를 직접적으로 제공한다고 생각한다면...그건 틀렸습니다!
이 예에서는 date
다음 값이 @
실제 Unix 타임스탬프로 처리되고 POSIX 시간 정의에 따라 올바른 해당 날짜를 제공한다는 것을 보여줍니다. 하지만 같은 값을 사용하는 방법그리고타임스탬프가 아니라 에포크 이후의 실제 시간(초)이라고 할까요? ...
[다음 내용은 읽지 마세요. 초기 가정이 틀렸으니 '기억'으로 간직하겠습니다.]
date -R --utc && date -R --utc -d @$(date --utc +%s)
명령줄 설명:
첫 번째는 내 컴퓨터에 설정된 UTC 날짜를 Unix 시대 이후의 초 수로 date
제공합니다.$(date ...)
줄이다(오늘 25) 윤초; date
윤초가 올바르게 관리되지 않으면 이 Unix 시간을 인수로 사용하면 첫 번째 명령과 비교하여 25초 전의 날짜를 제공해야 합니다. 이는 사실이 아니므로 date
"윤초 인식"은 필수입니다.
답변1
내 문제에 대한 쉬운 해결책을 찾지 못했기 때문에 이를 해결하기 위해 작은 Bash 스크립트를 작성했습니다. 아래 링크에 제공된 윤초 파일을 다운로드하여 스크립트와 함께 배치하거나 경로를 변경해야 합니다. 아직 써본 적은 없지만 utc2unix.sh
적응하기 쉽습니다. 주저하지 말고 의견을 제시하거나 제안해 주세요.
unix2utc.sh:
#!/bin/bash
# Convert a Unix timestamp to the real number of seconds
# elapsed since the epoch.
# Note: this script only manage additional leap seconds
# Download leap-seconds.list from
# https://github.com/eggert/tz/blob/master/leap-seconds.list
# Get current timestamp if nothing is given as first param
if [ -z $1 ]; then
posix_time=$(date --utc +%s)
else
posix_time=$1
fi
# Get the time at which leap seconds were added
seconds_list=$(grep -v "^#" leap-seconds.list | cut -f 1 -d ' ')
# Find the last leap second (see the content of leap-seconds.list)
# 2208988800 seconds between 01-01-1900 and 01-01-1970:
leap_seconds=$(echo $seconds_list | \
awk -v posix_time="$posix_time" \
'{for (i=NF;i>0;i--)
if (($i-2208988800) < posix_time) {
print i-1; exit
}
} END {if (($(i+1)-2208988800) == posix_time)
print "Warning: POSIX time ambiguity:",
posix_time,
"matches 2 values in UTC time!",
"The smallest value is given." | "cat 1>&2"
}')
# echo $leap_seconds
# Add the leap seconds to the timestamp
seconds_since_epoch=$(($posix_time + $leap_seconds))
echo $seconds_since_epoch
몇 가지 테스트:
date --utc +%s && ./unix2utc.sh
-> 오늘부터 2015년 6월까지 차이는 25초입니다../unix2utc.sh 78796799
->78796799
./unix2utc.sh 78796801
->78796802
./unix2utc.sh 78796800
->78796800
+ 표준 오류의 경우:Warning: POSIX time ambiguity: 78796800 matches 2 consecutive values in UTC time! Only the smallest value is given.