현재 FreeBSD에 설정된 기본 시간대 확인

현재 FreeBSD에 설정된 기본 시간대 확인

sudo tzsetupFreeBSD에서 시간대 설정을 변경하라는 메시지가 표시된다는 것을 알고 있습니다 .

➥ 변경하지 않고 현재 시간대 설정을 보려면 어떻게 해야 합니까?

date현재 시간이 표시되는 것으로 알고 있습니다 . 예를 들어:

2018년 12월 9일 일요일 05:45:25 UTC

...현재 기본 시간대는 UTC라고 가정합니다.

하지만 이 경우:

2018년 12월 8일 토요일 21:52:04 PST

이것은 PST실제 시간대가 아닙니다. 이 2~4자 코드는 표준화되어 있지도 않고 고유하지도 않습니다. 실시간 시간대는 또는 Continent/Region형식 입니다 (참조:Europe/AfricaAfrica/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.

관련 정보