sudo tzsetup
FreeBSD에서 시간대 설정을 변경하라는 메시지가 표시된다는 것을 알고 있습니다 .
➥ 변경하지 않고 현재 시간대 설정을 보려면 어떻게 해야 합니까?
date
현재 시간이 표시되는 것으로 알고 있습니다 . 예를 들어:
2018년 12월 9일 일요일 05:45:25 UTC
...현재 기본 시간대는 UTC라고 가정합니다.
하지만 이 경우:
2018년 12월 8일 토요일 21:52:04 PST
이것은 PST
실제 시간대가 아닙니다. 이 2~4자 코드는 표준화되어 있지도 않고 고유하지도 않습니다. 실시간 시간대는 또는 Continent/Region
형식 입니다 (참조:Europe/Africa
Africa/Tunis
위키피디아).
기본 설정의 실시간 시간대를 어떻게 확인할 수 있나요?
이 게시물환경 변수 사용에 대해 언급했습니다 TZ
.
export TZ=America/Los_Angeles
하지만 내 FreeBSD 11.2 시스템에는 그러한 변수 세트가 없습니다. 그래서 그 사람은 운전자가 아닌가 의심됩니다.
답변1
TLDR 답변은 다음과 같습니다.
$ POSIXTZ=$(tail -n1 /etc/localtime)
$ echo $POSIXTZ
CET-1CEST,M3.5.0,M10.5.0/3
$ TZNAME=$(find /usr/share/zoneinfo | while read fname; do cmp -s /etc/localtime "$fname" && echo "$fname" | cut -c 21- ; done)
$ echo $TZNAME
Europe/Copenhagen
현재 시간대는 파일에 저장됩니다 /etc/localtime
. @Kusalananda가 말했듯이 이것은 심볼릭 링크일 수 있습니다. 그러나 @JdeBP가 암시했듯이 FreeBSD에서는 이 파일이 일반적으로 /usr/share/zoneinfo
설치 중에 복사됩니다.
이 파일은 텍스트 설명에서 파생됩니다.기여/tzdata
그런 다음 이 정보를 사용하여 이진 형식으로 컴파일합니다.지크형식은 다음과 같이 지정됩니다.tz 파일
이 파일을 직접 구문 분석할 수 있는 내장 유틸리티가 있는지 모르겠습니다. 그러나 현재 문서에 따르면 C로 작성하는 것은 쉬울 것입니다. 상자에서 나오는 내용을 그대로 유지하려면 를 사용하여 볼 수 있습니다 hexdump
.
hexdump -v -C /etc/localtime
또는 매직 마커만 보고 싶다면 다음을 수행하세요.
$ hexdump -v -s 0 -n 5 -e '1/5 "%s\n"' /etc/localtime
TZif2
또는 필드:
tzh_ttisgmtcnt The number of UTC/local indicators stored in the file.
tzh_ttisstdcnt The number of standard/wall indicators stored in the file.
tzh_leapcnt The number of leap seconds for which data is stored in the file.
tzh_timecnt The number of ``transition times'' for which data is stored in the file.
tzh_typecnt The number of ``local time types'' for which data is stored in the file (must not be zero).
tzh_charcnt The number of characters of ``time zone abbreviation strings'' stored in the file.
사용:
hexdump -v -s 19 -n 4 -e '"tzh_ttisgmtcnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 23 -n 4 -e '"tzh_ttisstdcnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 27 -n 4 -e '"tzh_leapcnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 31 -n 4 -e '"tzh_timecnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 35 -n 4 -e '"tzh_typecnt: " 1/4 "%9u\n"' /etc/localtime
hexdump -v -s 39 -n 4 -e '"tzh_charcnt: " 1/4 "%9u\n"' /etc/localtime
내 사건 결과:
tzh_ttisgmtcnt: 0
tzh_ttisstdcnt: 6
tzh_leapcnt: 6
tzh_timecnt: 0
tzh_typecnt: 133
tzh_charcnt: 6
ttinfo
그런 다음 첫 번째가 시작되는 위치를 찾기 위해 다음 수학을 수행합니다 .
43 + (tzh_timecnt * 4) + (tzh_timecnt * 1)
43 + (0 * 4) + (0 * 1) = 43
바퀴가 천천히 떨어집니다.
$ hexdump -v -s 43 -n 6 -e '"ttinfo:\n tt_gmtoff: " 1/4 "%9u\n tt_isdst: " 1/1 "%1d\n tt_abbrind: " 1/1 "%1u\n"' /etc/localtime
ttinfo:
tt_gmtoff: 2350816009
tt_isdst: 96
tt_abbrind: 155
이 숫자로 인해 조금 어긋날 수 있습니다. 이는 그야말로 마조히즘적 접근이다. 그래서 금을 거의 발견했을 때 멈췄어요tt_abbrind
그런데 밑바닥을 보면tz 파일일반적으로 우리는 다음과 같은 작은 덩어리를 발견했습니다.
두 번째 헤더와 데이터 뒤에는 파일에 저장된 마지막 변환 시간 이후의 순간을 처리하는 줄바꿈으로 묶인 POSIX-TZ 환경 변수 스타일 문자열이 옵니다(POSIX 표현 없이, 콘텐츠 사이에 줄바꿈 없이).
그래서 간단합니다.
$ tail -n1 /etc/localtime
CET-1CEST,M3.5.0,M10.5.0/
자세히 살펴보면 /etc/localtime
아무런 Continent/Region
설정도 포함되어 있지 않다는 것을 알 수 있습니다! 하지만 파일이 복사되면 /usr/share/zoneinfo
이를 비교하여 가능한 파일을 찾을 수 있습니다. 중복된 내용이 포함되어 있는지 확인하기에는 아직 충분하지 않습니다 /usr/share/zoneinfo
. 하지만 나에게는 이것이 효과가 있다:
$ find /usr/share/zoneinfo | while read fname; do cmp -s /etc/localtime "$fname" && echo "$fname" | cut -c 21- ; done
Europe/Copenhagen
모든 파일을 반복하여 /usr/share/zoneinfo
와 비교합니다 /etc/localtime
. 매개변수를 cmp
사용하면 -s
아무 것도 표시되지 않고 값만 표시됩니다. 값이 0이면 이름을 인쇄합니다. 이름을 인쇄할 때 cut
처음 21자를 제거하여 이름을 얻습니다.Continent/Region
답변2
tzsetup
이 시간대가 설정된 경우현재 시간대 이름다른 이름으로 저장 /var/db/zoneinfo
:
$ sudo tzsetup Europe/Berlin
$ cat /var/db/zoneinfo
Europe/Berlin
이렇게 하면 시간대 파일을 다시 설치할 수 있습니다 /etc/localtime
.
$ sudo rm /etc/localtime
$ sudo tzsetup -r
$ ls -l /etc/localtime
-r--r--r-- 1 root wheel 2309 Feb 15 10:59 /etc/localtime
시간대 파일을 사용하지 않고 수동으로 복사한 경우 tzsetup
아래와 같이 해당 소스 파일의 이름을 찾아야 합니다.설명했다저자: 클라우스 안데르센:
$ cd /usr/share/zoneinfo && find . -type f -exec cmp -s /etc/localtime '{}' \; -print | sed 's,^\./,,'
Europe/Berlin
저는 이것을 FreeBSD 버전 11.3과 12.1에서 테스트했습니다.
답변3
FreeBSD, OpenBSD, NetBSD에서 사용되는 현재 기본 시간대는 기호 링크를 검사하면 분명하게 알 수 있습니다 /etc/localtime
. 이는 시간대 정의 파일을 가리킵니다 /usr/share/zoneinfo
.
예를 들어:
$ ls -l /etc/localtime
lrwxr-xr-x 1 root wheel 36 Aug 11 13:51 /etc/localtime -> /usr/share/zoneinfo/Europe/Stockholm
답변4
간단한 크로스 플랫폼 솔루션은 date
!
$ date +"%Z"
CET
$ date +"%z"
+0100
귀하의 경우 PST를 다시 받을 수도 있습니다. 하지만 이 답변은 이를 받아들일 수 있는 사람들에게도 중요하다고 생각합니다. 이는 환경에 TZ가 설정되어 있는지 여부를 고려합니다. 실제 사용 시 오프셋은 일반적으로 Continent/Region
.