Amazon Linux AMIとUbuntuでのTimeZone設定 date PHP Ruby JavaでのTimeZone出力確認


Amazon Linux AMIとUbuntuでのTimeZone設定と設定によってPHP Ruby Javaの出力の違いを確認してみました。

Amazon Linux AMIの初期設定 確認

Amazon Linux AMIの初期設定は/etc/localtime /etc/sysconfig/clock共にUTCになっています。

/etc/localtime /etc/sysconfig/clockの初期設定

$ cat /etc/localtime
TZif2UTCTZif2UTC
UTC0

$ cat /etc/sysconfig/clock 
ZONE="UTC"
UTC=true

date PHP Ruby Javaでの確認

$ date
2016年 xx月 xx日 x曜日 xx:xx:xx UTC

$ php -a
php > echo date_default_timezone_get();
UTC

$ irb
irb(main):001:0> Time.now.zone
=> "UTC"

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="UTC",...]

Ubuntuの初期設定 確認

Ubuntuには/etc/sysconfig/clockが存在しない代わりに/etc/timezoneが存在します。

/etc/localtime /etc/timezoneの初期設定

$ cat /etc/localtime
TZif2UTCTZif2UTC
UTC0

$ cat /etc/timezone
UTC

date PHP Ruby Javaでの確認

$ date
xx xx:xx:xx UTC 2016

$ php -a
php > echo date_default_timezone_get();
UTC

$ irb
irb(main):001:0> Time.now.zone
=> "UTC"

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="UTC",...]

Amazon Linux AMIとUbuntuのlocaltimeの変更

Amazon Linux AMIとUbuntu共に/usr/share/zoneinfo以下の中から設定したいTimeZoneを選び、/etc/localtimeにリンクを張ります。

TimeZoneをAmerica/Los_Angelesに変更

$ ls /usr/share/zoneinfo
Africa      Chile    Factory    Iceland      MET       posix       UCT
America     CST6CDT  GB     Indian       Mexico    posixrules  Universal
Antarctica  Cuba     GB-Eire    Iran         MST       PRC     US
Arctic      EET      GMT    iso3166.tab  MST7MDT   PST8PDT     UTC
...

$ sudo ln -sf /usr/share/zoneinfo/America/Los_Angeles /etc/localtime

localtimeをAmerica/Los_Angelesに変更後Amazon Linux AMIで確認

/etc/localtimeをAmerica/Los_Angelesに変更後/etc/localtime /etc/sysconfig/clockの確認

$ cat /etc/localtime
...
PST8PDT,M3.2.0,M11.1.0

$ cat /etc/sysconfig/clock 
ZONE="UTC"
UTC=true

date PHP Ruby Javaでの確認

$ date
2016年 xx月 xx日 x曜日 xx:xx:xx PST

$ php -a
php > echo date_default_timezone_get();
America/Los_Angeles

$ irb
irb(main):001:0> Time.now.zone
=> "PST"

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="UTC",...]

localtimeをAmerica/Los_Angelesに変更後Ubuntuで確認

/etc/localtimeをAmerica/Los_Angelesに変更後/etc/localtime /etc/timezoneの確認

$ cat /etc/localtime
...
PST8PDT,M3.2.0,M11.1.0

$ cat /etc/timezone
UTC

date PHP Ruby Javaでの確認

$ date
xx xx:xx:xx PST 2016

$ php -a
php > echo date_default_timezone_get();
America/Los_Angeles

$ irb
irb(main):001:0> Time.now.zone
=> "PST"

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="UTC",...]

Javaに変更したTimeZoneを適用

JavaのTimeZone出力では/etc/localtimeを変更しただけではTimeZoneが変更されませんでした。
Amazon Linux AMIでは/etc/sysconfig/clock、Ubuntuでは/etc/timezoneも変更します。

Amazon Linux AMIの場合は/etc/sysconfig/clockを変更します。

$ sudo vim /etc/sysconfig/clock 
ZONE="America/Los_Angeles"
UTC=true

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="America/Los_Angeles",...]

Ubuntuの場合は/etc/timezoneを変更します。

$ sudo vim /etc/timezone
America/Los_Angeles

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="America/Los_Angeles",...]

またUbuntuの場合はdpkg-reconfigure tzdataをすることで/etc/localtime /etc/timezoneの両方を同時に設定もできます。

$ dpkg-reconfigure tzdata
# 上記設定画面が表示されAmerica/Los_Angelesを設定

# Java System.out.println(TimeZone.getDefault());
sun.util.calendar.ZoneInfo[id="America/Los_Angeles",...]

結果

TimeZoneを変更する際には/etc/localtimeの他にAmazon Linux AMIでは/etc/sysconfig/clock Ubuntuでは/etc/timezoneを変更する必要がありそうです。