Unix 時間(エポック秒)と日付の変換

Unix 時間(1970 年 1 月 1 日 0 時 UTC からの秒数)を日付に直したり、日付から Unix 時間を作ったりします。時差を入れると、その地域の時刻として読み書きします。日本なら 9 です。

Unix 時間と日付を相互に変換します。Unix 時間とは、1970 年 1 月 1 日 0 時 0 分 0 秒(UTC)からの経過秒数のことです。エポック秒、Unix タイムスタンプとも呼びます。

u=86400n+3600h+60m+s3600zu = 86400 n + 3600 h + 60 m + s - 3600 z

nn は日付の通日、hhmmss は時・分・秒、zz は UTC からの時差、uu が Unix 時間です。日付を秒に直し、その地域の時差を外して UTC に合わせます。

なぜ秒で持つのか

時刻を 1 つの整数にしてしまえば、暦も時差も持ち歩かずに記録でき、大小の比較も引き算もそのままできます。記録やデータベースで時刻をこの形で持つのは、そのためです。

Unix 時間 1767225600 は、時差 +9 の地域では 2026 年 1 月 1 日 9 時 00 分 00 秒、木曜日にあたります。

1767225600 を 86400 で割ると 20454 でちょうど割り切れます。つまり UTC では 2026 年 1 月 1 日 0 時 00 分です。ここに時差の 9 時間(32400 秒)を足して、その地域の 9 時 00 分になります。

2038 年問題

Unix 時間を 32 bit の符号つき整数で持つと、2038 年 1 月 19 日に上限を超えて負の数に回ります。今のシステムはほとんどが 64 bit で持つので問題になりませんが、古い機器や、古い記録の形式には残っています。

注意点

うるう秒は数えません。Unix 時間そのものが 1 日をつねに 86400 秒と定めているためで、これは仕様どおりの振る舞いです。