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ファイル一般的に、私たちは次のような小さな塊を見つけました。
2番目のヘッダーとデータの後には、ファイルに保存された最後の変換時間以降の瞬間を処理する改行で囲まれた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
。