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`の両方を同時に設定もできます。

![スクリーンショット 2016-12-22 12.00.28.png](https://qiita-image-store.s3.amazonaws.com/0/145420/791b892b-2679-0b9e-bd61-bdc278ae37d5.png)


```
$ 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`を変更する必要がありそうです。