web-dev-qa-db-ja.com

FreeBSDで設定されている現在のデフォルトのタイムゾーンを特定する

知っている Sudo tzsetupは、FreeBSDのタイムゾーン設定を変更するように要求します。

changes変更を加えずに現在のタイムゾーン設定を確認するにはどうすればよいですか?

dateは現在の時刻を示しています。例えば:

2018年12月9日05:45:25 UTC

…これは、現在のデフォルトのタイムゾーンがUTCであることを意味します。

しかし、この場合:

2018年12月8日21:52:04 PST

PSTは実際のタイムゾーンではありません。このような2〜4文字のコードは、標準化されておらず、一意でもありません。真のタイムゾーンはContinent/Regionなどの形式Europe/AfricaまたはAfrica/TunisWikipedia を参照)。

デフォルトとして設定されている実際のタイムゾーンを確認するにはどうすればよいですか?

この投稿 環境変数TZの使用について言及しています。

export TZ=America/Los_Angeles

しかし、私のFreeBSD 11.2マシンにはそのような変数セットがありません。だから私はそれが原動力ではないと思います。

3
Basil Bourque

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からコピーされます。

これらのファイルは contrib/tzdata のテキスト記述に由来します

次に、この情報は zic を使用してバイナリ形式にコンパイルされ、形式は tzfile で指定されます

このファイルを直接解析する組み込みユーティリティについては知りません。しかし、手元にあるドキュメントを使って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を使って金を見つけるのが少し足りないところに立ち寄りました

しかし、 tzfile 仕様の一番下を見ると、次の小さなナゲットが見つかります。

2番目のヘッダーとデータの後に、改行で囲まれたPOSIX-TZ-environment-変数スタイルの文字列が続きます。これは、ファイルに格納された最後の遷移時間後のインスタントの処理に使用します(POSIX表現がない場合は改行の間に何もありません)そのような瞬間のために)。

したがって、次のように簡単です。

$ tail -n1 /etc/localtime
CET-1CEST,M3.5.0,M10.5.0/

よく見ると、/etc/localtimeContinent/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パラメータを使用すると、何も表示されず、値を使用して終了するだけです。値がゼロの場合、名前を出力します。名前を印刷するときは、cutを使用して最初の21文字を削除し、Continent/Regionを取得します

5
Claus Andersen

タイムゾーンが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でテストしました。

2
Björn Albers

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
1
Kusalananda

シンプルなクロスプラットフォームソリューションは、date

$ date +"%Z"
CET
$ date +"%z"
+0100

あなたの場合、あなたはおそらくPSTを再び得るでしょう-しかし、私はこの答えはそれを受け入れることができる人にとっても同様に重要だと思います。 TZが環境で設定されている場合は、これが考慮されます。そして実際の使用では、オフセットはContinent/Regionよりも使いやすいことがよくあります。

0
Claus Andersen