プログラムで時刻を扱う時にお世話になる「UNIX時間」と2038年問題について
投稿日:2017年07月01日
最終更新日:
もくじ
- 「UNIX時間」とは?
- 「UNIX時間」の使い方の例
- 2038年問題とは?
「UNIX時間」とは?
「UNIX時間」は、協定世界時1970年1月1日午前0時0分0秒(真夜中)を起点とし、うるう秒を無視した経過秒数である時刻を表そうというものです。これにより、時刻情報を何の変哲もない整数で取り扱えるようになるので、データベースなどに時刻情報を保存するのも容易となります。時差の影響も受けないので、サーバー等で時刻情報を保持するときにはUNIX時間を使うと都合が良いのです。
なお、実際にユーザーに時刻を表示するときなどはUNIX時刻を普段見慣れている時刻表記(例:2017年04月16日 13時00分)に直す必要が生じますが、PHPなどではそのための関数が用意されていたりします。また、データベースで時刻情報を元にデータを検索する場合は、普段見慣れている時刻表記(例:2017年04月16日 13時00分)をUNIX時刻に直さなければならない場合があります。その場合は、Unixtime相互変換ツール – konisimple toolsやUnixtime 日付変換ツール – Digitraなどのサービスを使いましょう。
「UNIX時間」の使い方の例
以下、プログラムは全てPHPで書かれています。
例1 前回のアクセスからの経過時間を計算する [PHP] [/PHP]
2038年問題とは?
さて、UNIX時間はある時刻を協定世界時1970年1月1日午前0時0分0秒(真夜中)からの(うるう秒を無視した)経過秒数で表すものであると説明しましたが、コンピューターが取り扱うことが出来る整数値の大きさはデータを保存するために使用するビットの数によって規定されます。昔のシステムでは時刻データを符号付き32bit整数型(扱える最大値は2^31 -1 = 21億4748万3647)で管理していたので、UNIX時間の起点から21億4748万3647秒≒68年で経過時間が符号付き32bitでの最大値を越えてしまい、何らかの対策をしなければ時刻を正しく管理することができなくなります。これが2038年問題です。
この問題を回避する方法はいくつかありますが、現時点でベストなのは時刻データを符号つき64bit整数型で管理することでしょう。符号付き64bitであれば扱える最大値が2^63 -1 = 922京3372兆0368億5477万5807 となり、西暦3000億年くらいまで持つようになります。時刻を取り扱うプログラムを組むなどの場合には、時刻を取り扱うデータ型が2038年問題を引き起こさないように気をつけて設計するべきです(かくいう私もMonacoinのfaucetを作る時にDBの設定で時刻データを32bit整数値で保管していました…現在は64bit整数値で保管するように修正してあるはず)。