ソフトウェア開発時の協定世界時(UTC)とサマータイムについて

プログラム

UTC(Coordinated Universal Time)とJST(Japan Standard Time)という言葉はご存じでしょうか。ソフトウェア開発に携わっているなら、しっかり理解しておかないと痛い目を見るかもしれません。教養として、必ず押さえておきましょう。

本記事で分かること
  • UTCとは何か
  • JSTとは何か
  • タイムゾーンとサマータイムとは何か
  • C言語でサマータイムについての処理を組む場合のポイント
スポンサーリンク
スポンサーリンク

言葉の定義

はじめに、1つ1つの言葉を確認していきます。

UTC(協定世界時)

世界で統一した時間基準を設けようという議論の中で生まれたのが協定世界時、UTCです。厳密には、UT0(生の観測値)→UT1(経度補正)→UT2(季節補正)を経てのUTCということになっています。このUTCを基準時刻として、世界の国々は基準時刻からのプラスマイナスオフセット時間によって、現地時刻を表現することになっています。基準時刻は、UTC+0000、日本はUTC+0900となっています。

UTC+0000は、経度0度における時刻となっています。UTCからのオフセット範囲は、+14時間から-12時間まであります。

協定世界時(UTC)

JST(日本標準時)

UTCに+9時間した時刻が、日本の標準時とされており、これをJST – Japan Standard Time(日本標準時)と呼んでいます。ソフトウェアを開発時は、UTCに対して、通常、ローカルタイムと呼んで区別します。ローカルタイムは、日本のローカルタイム、アメリカのローカルタイム、というように、それぞれの国で別の表現となりますが、ローカルタイムをUTCに変換すると、同じ値になります。

つまり、表現だけを変えていて、時刻そのものはUTCで、同値になるのです。

日本標準時(JST)

タイムゾーン

世界の基準時刻としてUTCが生まれましたが、各国には時差があり、これをUTCで表現するために、オフセット時間(+9、-5…)を使っています。そして、このオフセット時間を同じくする地域の範囲をタイムゾーンといいます。

自分たちが作成するソフトウェアが、どのタイムゾーンで動作するのか、ということは本来なら気にする必要はなかったはずですが、実際にはそうはいきません。サマータイムが存在するからです。

サマータイム

サマータイムとは、夏の一定期間、時間を1時間進める制度のことを指します。昼の日照時間を有効活用することを目的としています。サマータイムを採用するのは欧米が中心ですが、ここではアメリカを例に説明します。

アメリカ本土は、横に長い国土を持つので、タイムゾーンも4つ存在します。また、ハワイ、アラスカも特別なタイムゾーンに属しています。また、下表にはありませんが、アリゾナ州などは特殊で、サマータイムを採用していない州となります。

時刻名称UTCオフセットサマータイム導入
東部標準時UTC-0500有り
中部標準時UTC-0600有り
山地標準時UTC-0700有り
太平洋標準時UTC-0800有り
アラスカ時間UTC-0900有り
ハワイ時間UTC-1000無し
アメリカのタイムゾーン

サマータイムの時刻修正は、以下のタイミングで行われます。Windowsは、サマータイムに対応しているため、時刻調整は自動です。

● 時刻を進める …

 3月第2日曜 AM2:00 に AM3:00へ進める (アメリカでは、Spring Forwardという)

● 時刻を戻す …

 11月第1日曜日 AM2:00に AM1:00へ戻す (アメリカでは、Fall Backという)

開発するソフトウェアがサマータイム導入地域で動作する場合、以下の点に留意すべきです。

POINT!

作成するソフトウェアは、時刻を前提にして動作することはあるか?もしYESなら、サマータイムで時刻が進んだり、戻ったりしても誤動作しないか?(タイマーなどは問題ないが、ローカルタイムを参照し、1時間毎の処理を行う場合は要注意)

夏時間

日本でのみ使われるなら問題ない?

話を日本に戻します。例えば、

  • 開発したシステムが日本国内でしか使われない。
  • 海外拠点にあるシステムとのやり取りもない。

ということであれば、サマータイムを意識せずとも問題にはならないでしょう。しかし、グローバル化した現代、日本で稼働するシステムに、海外からクラウドを通じてアクセスする、という運用があったりすると、ローカルタイムだけでは、限界があります。

また、JST前提で作られたソフトウェアを海外へ輸出した場合、設置場所のタイムゾーンによっては、システムに不具合が生じる可能性もあります。

プログラミング時(C言語)のポイント

C言語プログラムで、処理したい時刻(年月日時分秒)をローカルタイムで作り出す場合は、struct tm構造体を使います。使用する関数を以下に示します。

(1)C言語でローカルタイムをUTC時刻に変換するには、mktime関数を使います。time_t型の時刻情報がUTCです。

mktime関数:struct tm構造体をtime_t型に変換する

(2)UTC時刻のデータは、localtime関数を使うと、ローカルタイム(struct tm)に変換できます。

localtime関数:time_t型をstruct tm構造体に変換する

mktimeに渡すstruct tm型のパラメーターには”tm_isdat”(夏時間フラグ)があるので、これを活用すると、サマータイムに対応することができます。

  • tm_isdat = 0 の場合、標準時間であると指定
  • tm_isdat > 0 の場合、夏時間であると指定
  • tm_isdat < 0 の場合、標準/夏時間か不明(Cランタイム側で判定させる場合)

タイムゾーンがJSTになっているWindows マシンでは、サマータイムの確認はできませんから、自分の環境で確認する場合は、サマータイム有りのタイムゾーンに変更してから動作確認してください!

まとめ

UTCとJST、タイムゾーンとサマータイム、そしてプログラム上の留意点について整理しました。下記の点が重要となりますので、よく理解しておきましょう。

稼働システムのタイムゾーンが、JST以外の場合、サマータイムが導入されているのか確認する

コメント

タイトルとURLをコピーしました