最近(2018/8) サマータイム導入が議論されていて、賛否両論いろいろあるみたいですが、
Linux の多くのディストリビューション(以下 OS)では、すでに対応済みになっています。
元々は国際化対応 (internationalization,i18n) の中で、国ごとの時刻表示に対応する
必要があり、ロケール の一環としてサマータイム対応されています。
各国のサマータイムの情報や、時差の情報は IP アドレスの割り当て等を管理している
IANA で収集していて、Time Zone Database (以下、tzdata) として公開しています。
[1] , [2]
日本でも GHQ 占領時代に一時サマータイムが実施されたことがあり [3] 、その時の
データが収録されています。 [4] JDT (Japan Daylight Saving Time) という、
日本のタイムゾーンを表す3文字コードも収録されています。 [5]
なので、少なくとも OS 上は、サマータイムが制定されていつから始まり、いつ終わる
のかが決定されれば、アップデートに従って tzdata が更新されてサマータイム対応完了
となるはずです。ただし、DBMS などの個々のミドルウェアに関しては時刻に関する
扱いが異なる可能性があるため注意が必要です。
例えば JAVA は OS とは別に tzdata を持っており、別途対応するようになっています。
それでは、試験的にサマータイムを導入してみたいと思います。
環境¶
今回実施した環境は以下の通りです。
-
- ディストリビューション
- Amazon Linux 2
-
- AMI
- amzn2-ami-hvm-2.0.20180622.1-x86_64-gp2 (ami-a9d09ed1)
(yum update 実施済み)
-
- リージョン
- us-west-2 (オレゴン)
-
- インスタンスタイプ
- m5.large
-
- kernel
- kernel-4.14.59-68.43.amzn2.x86_64
-
- glibc
- glibc-2.26-28.amzn2.0.1.x86_64
-
- tzdata
- tzdata-2018c-1.amzn2.noarch
ほかのディストリビューションでも RHEL,CentOS,Fedora 等 RedHat 系であれば、
ほぼ同じ手順で実施できると思います。
準備¶
配布物ではデータはバイナリ形式で配布されているため、ソースからリビルドします。
まず rpmdevtools をインストールします。後述の
1 |
<span></span>sudo yum install -y rpmdevtools.noarch |
次に rpm パッケージビルド用のツリーを作成します。
1 |
<span></span>rpmdev-setuptree |
tzdata のソースパッケージをダウンロードします。
1 |
<span></span>yumdownloader --source tzdata |
リビルド用の依存パッケージもインストールします。
1 |
<span></span>sudo yum-builddep -y tzdata |
ソースパッケージの展開¶
ソースパッケージを展開します。
1 |
<span></span>rpm -ivh tzdata-2018c-1.amzn2.src.rpm |
SPECS ディレクトリに移動します。
1 |
<span></span><span class="nb">cd</span> ~/rpmbuild/SPECS |
今回ソースを書き換えたいので、一旦ソースを展開します。
1 |
<span></span>rpmbuild -bp tzdata.spec |
BUILD ディレクトリに移動します。
1 |
<span></span><span class="nb">cd</span> ~/rpmbuild/BUILD |
tzdata-2018c というディレクトリができているので、後でパッチにできるように
一旦退避します。
1 |
<span></span>cp -rf tzdata-2018c tzdata-2018c.orig |
タイムゾーンデータの書き換え¶
それでは書き換えましょう。
とりあえず tzdata-2018c ディレクトリに移動します。
1 |
<span></span><span class="nb">cd</span> tzdata-2018c |
今回はテストということで、特にこだわりがないので、アメリカ東部時間から
コピーして修正した以下の2行を asia ファイルに追記しました。
各項目の詳しい意味などを知りたい方は、man 8 zic [6] 等をご参照ください。
1 2 3 4 5 6 7 8 9 10 11 12 |
<span></span><span class="gh">diff -urpN tzdata-2018c.orig/asia tzdata-2018c/asia</span> <span class="gd">--- tzdata-2018c.orig/asia 2018-08-10 00:36:59.134904538 +0000</span> <span class="gi">+++ tzdata-2018c/asia 2018-08-10 01:13:46.414776249 +0000</span> <span class="gu">@@ -1475,6 +1475,8 @@ Rule Japan 1948 only - May Sat>=1 24:00</span> Rule Japan 1948 1951 - Sep Sun>=9 0:00 0 S Rule Japan 1949 only - Apr Sat>=1 24:00 1:00 D Rule Japan 1950 1951 - May Sat>=1 24:00 1:00 D <span class="gi">+Rule Japan 2018 max - Mar Sun>=8 2:00 1:00 D</span> <span class="gi">+Rule Japan 2018 max - Nov Sun>=1 2:00 0 S</span> # From Hideyuki Suzuki (1998-11-09): # 'Tokyo' usually stands for the former location of Tokyo Astronomical |
差分をパッチにして SOURCES ディレクトリに保存します。
1 2 |
<span></span>diff -urpN tzdata-2018c.orig tzdata-2018c > jp_dst_test.patch mv jp_dst_test.patch ../SOURCES/ |
パッケージのビルド¶
SPECS ディレクトリに移動します。
1 |
<span></span><span class="nb">cd</span> ~/rpmbuild/SPECS |
先ほど作成した、パッチが反映されるように tzdata.spec ファイルを変更します。
差分は以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<span></span><span class="gh">diff -urpN tzdata.spec.orig tzdata.spec</span> <span class="gd">--- tzdata.spec.orig 2018-08-10 01:40:52.947461616 +0000</span> <span class="gi">+++ tzdata.spec 2018-08-10 01:44:11.139083595 +0000</span> <span class="gu">@@ -11,6 +11,7 @@ Source0: ftp://ftp.iana.org/tz/releases/</span> Source1: ftp://ftp.iana.org/tz/releases/tzcode%{tzcode_version}.tar.gz Patch002: 0002-Fix-have-snprintf-error.patch <span class="gi">+Patch003: jp_dst_test.patch</span> BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: gawk, glibc, perl <span class="gu">@@ -43,6 +44,7 @@ This package contains timezone informati</span> %prep %setup -q -c -a 1 %patch002 -p1 <span class="gi">+%patch003 -p1</span> mkdir javazic tar zxf %{SOURCE3} -C javazic |
パッケージをビルドします。
1 |
<span></span>rpmbuild -ba tzdata.spec |
パッケージのインストール¶
無事ビルドできたようなので、 RPMS/noarch ディレクトリに移動します。
1 |
cd ~/rpmbuild/RPMS/noarch/ |
パッケージを置き換えます。
今回パッケージ名等を修正しなかったので、"--replacepkgs --replacefiles" という
あまり使用しないオプションを追加してパッケージの置き換えを実施しています。
1 |
<span></span>sudo rpm -ivh --replacepkgs --replacefiles tzdata-2018c-1.amzn2.noarch.rpm |
動作確認¶
zdump コマンドでデータが反映されていることを確認します。
1 2 3 4 5 6 7 8 |
<span></span>zdump -v Japan ................ Japan Sat Mar <span class="m">10</span> <span class="m">16</span>:59:59 <span class="m">2018</span> <span class="nv">UT</span> <span class="o">=</span> Sun Mar <span class="m">11</span> <span class="m">01</span>:59:59 <span class="m">2018</span> JST <span class="nv">isdst</span><span class="o">=</span><span class="m">0</span> <span class="nv">gmtoff</span><span class="o">=</span><span class="m">32400</span> Japan Sat Mar <span class="m">10</span> <span class="m">17</span>:00:00 <span class="m">2018</span> <span class="nv">UT</span> <span class="o">=</span> Sun Mar <span class="m">11</span> <span class="m">03</span>:00:00 <span class="m">2018</span> JDT <span class="nv">isdst</span><span class="o">=</span><span class="m">1</span> <span class="nv">gmtoff</span><span class="o">=</span><span class="m">36000</span> Japan Sat Nov <span class="m">3</span> <span class="m">15</span>:59:59 <span class="m">2018</span> <span class="nv">UT</span> <span class="o">=</span> Sun Nov <span class="m">4</span> <span class="m">01</span>:59:59 <span class="m">2018</span> JDT <span class="nv">isdst</span><span class="o">=</span><span class="m">1</span> <span class="nv">gmtoff</span><span class="o">=</span><span class="m">36000</span> Japan Sat Nov <span class="m">3</span> <span class="m">16</span>:00:00 <span class="m">2018</span> <span class="nv">UT</span> <span class="o">=</span> Sun Nov <span class="m">4</span> <span class="m">01</span>:00:00 <span class="m">2018</span> JST <span class="nv">isdst</span><span class="o">=</span><span class="m">0</span> <span class="nv">gmtoff</span><span class="o">=</span><span class="m">32400</span> Japan Sat Mar <span class="m">9</span> <span class="m">16</span>:59:59 <span class="m">2019</span> <span class="nv">UT</span> <span class="o">=</span> Sun Mar <span class="m">10</span> <span class="m">01</span>:59:59 <span class="m">2019</span> JST <span class="nv">isdst</span><span class="o">=</span><span class="m">0</span> <span class="nv">gmtoff</span><span class="o">=</span><span class="m">32400</span> ................ |
環境変数 TZ を設定して date コマンドで サマータイムが反映されていることを確認します。
通常、UTC に対して +9:00 されますが、+10:00 になっていることが確認できました。
また、タイムゾーンの表示もサマータイムを示す JDT に変わっています。
1 2 3 |
<span></span><span class="nv">TZ</span><span class="o">=</span>Japan date <span class="o">&&</span> date Fri Aug <span class="m">10</span> <span class="m">12</span>:26:06 JDT <span class="m">2018</span> Fri Aug <span class="m">10</span> <span class="m">02</span>:26:06 UTC <span class="m">2018</span> |
いくつかのミドルウェアでも確認してみる¶
php でも大丈夫そうです。参考までに date コマンドも一緒に出力しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<span></span><span class="nv">TZ</span><span class="o">=</span>Japan date <span class="p">;</span> php -r <span class="s1">'date_default_timezone_set("Japan"); print_r(localti</span> <span class="s1">me(time(),TRUE));'</span> Fri Aug <span class="m">10</span> <span class="m">14</span>:09:13 JDT <span class="m">2018</span> Array <span class="o">(</span> <span class="o">[</span>tm_sec<span class="o">]</span> <span class="o">=</span>> <span class="m">13</span> <span class="o">[</span>tm_min<span class="o">]</span> <span class="o">=</span>> <span class="m">9</span> <span class="o">[</span>tm_hour<span class="o">]</span> <span class="o">=</span>> <span class="m">14</span> <span class="o">[</span>tm_mday<span class="o">]</span> <span class="o">=</span>> <span class="m">10</span> <span class="o">[</span>tm_mon<span class="o">]</span> <span class="o">=</span>> <span class="m">7</span> <span class="o">[</span>tm_year<span class="o">]</span> <span class="o">=</span>> <span class="m">118</span> <span class="o">[</span>tm_wday<span class="o">]</span> <span class="o">=</span>> <span class="m">5</span> <span class="o">[</span>tm_yday<span class="o">]</span> <span class="o">=</span>> <span class="m">221</span> <span class="o">[</span>tm_isdst<span class="o">]</span> <span class="o">=</span>> <span class="m">1</span> <span class="o">)</span> |
ruby でも大丈夫そうです。
1 2 3 |
<span></span><span class="nv">TZ</span><span class="o">=</span>Japan date <span class="p">;</span> <span class="nv">TZ</span><span class="o">=</span>Japan ruby -e <span class="s1">'puts Time.now.localtime'</span> Fri Aug <span class="m">10</span> <span class="m">14</span>:19:55 JDT <span class="m">2018</span> <span class="m">2018</span>-08-10 <span class="m">14</span>:19:55 +1000 |
python も同様
1 2 3 |
<span></span><span class="nv">TZ</span><span class="o">=</span>Japan date <span class="p">;</span> <span class="nv">TZ</span><span class="o">=</span>Japan python -c <span class="s1">'import time; print(time.localtime())'</span> Fri Aug <span class="m">10</span> <span class="m">14</span>:24:32 JDT <span class="m">2018</span> time.struct_time<span class="o">(</span><span class="nv">tm_year</span><span class="o">=</span><span class="m">2018</span>, <span class="nv">tm_mon</span><span class="o">=</span><span class="m">8</span>, <span class="nv">tm_mday</span><span class="o">=</span><span class="m">10</span>, <span class="nv">tm_hour</span><span class="o">=</span><span class="m">14</span>, <span class="nv">tm_min</span><span class="o">=</span><span class="m">24</span>, <span class="nv">tm_sec</span><span class="o">=</span><span class="m">32</span>, <span class="nv">tm_wday</span><span class="o">=</span><span class="m">4</span>, <span class="nv">tm_yday</span><span class="o">=</span><span class="m">222</span>, <span class="nv">tm_isdst</span><span class="o">=</span><span class="m">1</span><span class="o">)</span> |
node これも問題なさそうです。
1 2 3 4 |
<span></span><span class="nv">TZ</span><span class="o">=</span>Japan date <span class="p">;</span> <span class="nv">TZ</span><span class="o">=</span>Japan node -e <span class="s1">'d=new Date(); console.log(d.getFullYear()+</span> <span class="s1">"-"+(d.getMonth()+1)+"-"+d.getDate()+" "+d.getHours()+":"+d.getMinutes()+":"+d.getSeconds())'</span> Fri Aug <span class="m">10</span> <span class="m">15</span>:01:10 JDT <span class="m">2018</span> <span class="m">2018</span>-8-10 <span class="m">15</span>:1:10 |
最後に¶
以上、OS 的にはサマータイムに対応する機構がすでに実装されているため、
データを追加するだけで問題なく、サマータイムに対応できることが確認できました。
そのため、サマータイムが実施されても tzdata を更新することで基本的には対応完了
となります。
ただ、ドキュメントや運用ルールなどシステム外の部分に対してはいろいろ対応が必要
かと思います。また OS に同梱されているミドルウェアなどでは別途確認、対応が必要に
なるケースがあるかと思います。ご注意ください。
以上です。
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?