事象
CentOS7なEC2のサーバ上のPHPで、TimeZoneにUTCを指定して時刻を取得したのにJSTな時刻が取得された。
なお、OSのタイムゾーンは一応JSTです。
原因
タイムゾーンがおかしなことになってました。
$ timedatectl
Local time: Wed 2020-05-13 14:14:59 JST
Universal time: Wed 2020-05-13 05:14:59 UTC
RTC time: Wed 2020-05-13 05:13:52
Time zone: UTC (JST, +0900)
NTP enabled: yes
NTP synchronized: yes
RTC in local TZ: no
DST active: n/a
って感じで、TimezoneがUTC (JST, +0900)と不思議な値になってました。
どうしてこうなった
EC2は初期ではタイムゾーンがUTCになってます。
これをJSTに変更する方法はぐぐるといっぱい出てきますが、大きく2種類出てきます。
- /etc/localtimeを変更する方法
- timedatectlを使う方法
CentOS7の場合は、「timedatectlを使う方法」なんですが、「/etc/localtimeを変更する方法」をやってしまいました。
やったこと
- sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
- vi /etc/sysconfig/clock → そんなファイルないぞ?
ここで気づくべきでした(まぁ、ここできづいても遅いんですが・・・)
しかし、2をやらすにとりあえず、dateしてみると、JSTになってるからまぁいいかってことでタイムゾーンの変更完了!ってしちゃいました。
なにが起きたのか
実は、 /ect/localtime が /usr/share/zoneinfo/UTC のシンボリックリンクになってました。
つまり、
sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
で/usr/share/zoneinfo/UTCが/usr/share/zoneinfo/Japanで上書きされてしまいました。
結果、UTCの内容がJSTで+0900になってしまったということでした。
さらに、UCTとかUniversalとかZuluとかがUTCのハードリンクだったらしく、これらもJSTになっちゃってました・・・