知っている 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/Tunis
( Wikipedia を参照)。
デフォルトとして設定されている実際のタイムゾーンを確認するにはどうすればよいですか?
この投稿 環境変数TZ
の使用について言及しています。
export TZ=America/Los_Angeles
しかし、私のFreeBSD 11.2マシンにはそのような変数セットがありません。だから私はそれが原動力ではないと思います。
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/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
パラメータを使用すると、何も表示されず、値を使用して終了するだけです。値がゼロの場合、名前を出力します。名前を印刷するときは、cut
を使用して最初の21文字を削除し、Continent/Region
を取得します
タイムゾーンが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でテストしました。
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
シンプルなクロスプラットフォームソリューションは、date
!
$ date +"%Z"
CET
$ date +"%z"
+0100
あなたの場合、あなたはおそらくPSTを再び得るでしょう-しかし、私はこの答えはそれを受け入れることができる人にとっても同様に重要だと思います。 TZが環境で設定されている場合は、これが考慮されます。そして実際の使用では、オフセットはContinent/Region
よりも使いやすいことがよくあります。