読むだけでちょっと賢くなる、架空のまとめスレ

【疑問】サーバーの時刻が9時間ずれて見える。/etc/localtime・/usr/share/zoneinfo・TZ と tzselect、timedatectl【LPICレベル1】

19レスカテゴリ:Linux
1: 名無しさん

サーバーのログの時刻が、日本の時刻と9時間ずれてる
時計が狂ってるんかな

2: 名無しさん

前提のおさらい。ロケールは LANG や LC_* で言語や表示のしかたを決める。タイムゾーンはそれとは別の設定で、時刻をどの地域の時間で表示するか

3: 名無しさん

>>1
時計は合ってて、タイムゾーンが UTC になってるだけのことが多い。日本時間(JST)は UTC より9時間進んでる
UTC で6時なら

で、日本では15時

4: 名無しさん

>>3
システムのタイムゾーンはどこで決まってるん

5: 名無しさん

>>4
/etc/localtime。中身は /usr/share/zoneinfo の下にあるタイムゾーンのデータ
試したマシンでは /etc/localtime -> /usr/share/zoneinfo/Asia/Tokyo のシンボリックリンクで、file コマンドで見ると timezone data のバイナリやった

6: 名無しさん

>>5
Debian にはもう1つ /etc/timezone があって、Asia/Tokyo みたいに名前が文字で書いてある。Red Hat 系にはない

7: 名無しさん

>>5
変えるときは?

8: 名無しさん

>>7
systemd のシステムなら timedatectl set-timezone Asia/Tokyo。/etc/localtime のリンクを張り替えてくれる。名前の一覧は timedatectl list-timezones
手でやるなら ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime。Debian なら dpkg-reconfigure tzdata でも選べる
試したマシンは systemd が動いてないから、timedatectl は使われへんかった。設定も変えてない

9: 名無しさん

自分のシェルだけ別の国の時間で見たい

10: 名無しさん

>>9
環境変数 TZ。TZ=America/New_York date ならそのコマンドだけ、~/.profile に export TZ='Asia/Tokyo' を書けば自分のログインのたびに効く
TZ はシステムの /etc/localtime より優先される

11: 名無しさん

>>10
date +'%Z %z' で名前とずれを試した
Asia/Tokyo:JST +0900
UTC:UTC +0000
Europe/London:GMT +0000(夏の間は BST +0100)
America/New_York:夏時間の間は EDT -0400、それ以外は EST -0500

12: 名無しさん

>>11
存在しない TZ=Nowhere/Fake を入れたら、エラーも出ずに +0000 として扱われた。綴りを間違えても気付きにくい

13: 名無しさん

>>11
TZ=JST-9 って書き方も見たけど、マイナスで +9 時間?

14: 名無しさん

>>13
POSIX の書き方で「略称 と UTC との差」。符号は逆で、JST-9 は UTC+9。試したら JST +0900 になった。普段は Asia/Tokyo のような地域の名前を使うほうが、夏時間も自動で扱えて安全

15: 名無しさん

tzselect ってのは?

16: 名無しさん

>>15
大陸と国を番号で選んでいくと、TZ に入れる値を教えてくれる対話式のコマンド。Asia(5)、Japan を選んだら TZ='Asia/Tokyo' will be used. と出て、最後に Asia/Tokyo を標準出力に出した
端末で使うと、~/.profile に export TZ='Asia/Tokyo' を足せばずっと使えるって案内も出る(スクリプトの中身で確認)。システムの設定は変えない

17: 名無しさん

>>8
ハードウェアの時計とか NTP は、また別の話?

18: 名無しさん

>>17
別。タイムゾーンは表示のしかたで、時計そのものが合ってるかは NTP の話。ハードウェアクロックを UTC で持つか地方時で持つかも別の設定(timedatectl set-local-rtc)

19: 名無しさん

>>10
システムは /etc/localtime(zoneinfo へのリンク)、Debian は /etc/timezone も、自分だけなら TZ、値を調べるのは tzselect、変えるのは timedatectl set-timezone。9時間は UTC やったか

管理人のひとこと