TIME2POSIX(3)

名称
time2posix, posix2time - 基準時点からの秒数を変換

ライブラリ
libc

書式
<time.h> time_t time2posix(const time_t *t) time_t posix2time(const time_t *t)

解説
p1003.1-88 は、536457599 という time_t 値を "1986 年 12 月 31 日 23:59:59" に対応させるように規定しています。これは、実際上 POSIX の time_t が うるう秒を含むことはできず、従ってシステム時間はうるう秒が起きるたびに 調整する必要があることを意味しています。

しかしながら、時間パッケージのうるう秒サポートが有効に設定されている 場合は、このような調整は必要がなく、time_t 値はうるう秒が 起きても正しく (真の「…からの秒数」で) 進みます。 これは、これらの値が基準時点以後に挿入された 正味のうるう秒だけ POSIX によって要求される値と異なることを意味します。

通常は、タイプ time_t は (ほとんどの場合) 不透明なので — すなわち time_t 値は time(3), localtime(3), mktime(3), difftime(3) などの関数からのみ取得し、またそれらの関数のみに渡すように 考えられているので — このことは問題になりません。 しかしながら、 p1003.1-88 は、日付/時間から time_t 値を直接計算する数式を与えており、 プログラムによってはこの関係を前提条件にしているものがあります。 通常、この関係を使って time_t の作成/分析を行っているプログラムでは、 うるう秒をまたがる間隔を正しく処理できません。

time2posix() および posix2time() 関数は、ローカルの time_t 値とそれに相当する POSIX 等価の値との間で 変換を行って、この time_t のミスマッチに対応するために 用意されたものです。これは、うるう秒の挿入や 削除に応じて POSIX システムに起きたタイムベース変更の回数を数える ことにより行います。これらの変換値は、 古いアプリケーションを訂正する代りに、あるいは POSIX 準拠システムと 通信するときに用いることができます。

time2posix() 関数は単一の値を持ちます。すなわち、すべてのローカルの time_t は、 単一の POSIX time_t に対応します。 posix2time() 関数の動作は、それほど行儀よくありません。 正のうるう秒に出会うとその結果は 1 つにはならず、 また負のうるう秒に対しては対応する time_t が存在しないために それに近い値が返されます。これらの 2 つの例は、POSIX による 表現の欠陥度を示すよい指標であるといえます。

次の表は、1993 年 6 月末に挿入されたうるう秒に対して、time_t と その POSIX 表現への変換値、およびそれを再変換して戻した値との関係を示します。
DATE | TIME | T | X=time2posix(T) | posix2time(X)
93/06/30 | 23:59:59 | A+0 | B+0 | A+0
93/06/30 | 23:59:60 | A+1 | B+1 | A+1 or A+2
93/07/01 | 00:00:00 | A+2 | B+1 | A+1 or A+2
93/07/01 | 00:00:01 | A+3 | B+2 | A+3

うるう秒削除は次のようになります。
DATE | TIME | T | X=time2posix(T) | posix2time(X)
??/06/30 | 23:59:58 | A+0 | B+0 | A+0
??/07/01 | 00:00:00 | A+1 | B+2 | A+1
??/07/01 | 00:00:01 | A+2 | B+3 | A+2

    [注: posix2time(B+1) => A+0 or A+1]

うるう秒サポートが有効になっていない場合は、 ローカルの time_t と POSIX の time_t は等価となり、 time2posix() および posix2time() 関数はともに恒等関数となります。

関連項目
difftime(3), localtime(3), mktime(3), time(3)