.Dd May 1, 1996 .Dt TIME2POSIX 3 .Os .Sh 名称 .Nm time2posix , .Nm posix2time .Nd 基準時点からの秒数を変換 .Sh 書式 .Fd #include .Ft time_t .Fn time2posix "const time_t *t" .Ft time_t .Fn posix2time "const time_t *t" .Sh 解説 .St -p1003.1-88 は、 536457599 という値を "1986 年 12 月 31 日 23 : 59 : 59 " に対応させるように規定しています。これは、実際上 POSIX の time_t が うるう秒を含むことはできず、従ってシステム時間はうるう秒が起きるたびに 調整する必要があることを意味しています。 .Pp しかしながら、時間パッケージのうるう秒サポートが有効に設定されている場 合は、このような調整は必要がなく、time_t 値はうるう秒が 起きても正しく ( 真の「…からの秒数」で ) 進みます。 これは、これらの値が基準時点以後に挿入された 正味のうるう秒だけ POSIX によって要求される値と異なることを意味します。 .Pp 通常は、タイプ time_t は ( ほとんどの場合 ) 不透明です \(em すなわち time_t 値は .Xr time 2 , .Xr localtime 3 , .Xr mktime 3 , .Xr difftime 3 などの関数からのみ取得し、またそれらの関数のみに渡すように 考えられているので、このことは問題になりません。 しかしながら、プログラムによっては time_t 値を与えられた日付 / 時間から 直接計算する数式が与えられ、同じ関係を前提条件にしているものがあります。 このような関係を使ってtime_tの作成 / 分析を行っているプログラムでは、通 常はうるう秒の間隔を正しく処理できません。 .Pp .Fn time2posix および .Fn posix2time 関数は、ローカルの time_t 値とそれに相当する POSIX 等価の値との間で 変換を行って、この time_t のミスマッチに対応するために 用意されたものです。これは、うるう秒の挿入や 削除に応じて POSIX システムに起きたタイムベース変更の回数を数える ことにより行います。これらの変換値は、 古いアプリケーションを訂正する代りに、あるいは POSIX 準拠システムと 通信するときに用いることができます。 .Pp .Fn time2posix 関数は単一の値を持ちます。すなわち、すべてのローカルの time_t は、 単一の POSIX time_t に対応します。 .Fn posix2time 関数の動作は、それほど行儀よくありません。 正のうるう秒に出会うとその結果は 1 つにはならず、 また負のうるう秒に対しては対応する time_t が存在しないために それに近い値が返されます。これらの 2 つの例は、POSIX による 表現の欠陥度を示すよい指標であるといえます。 .Pp 次の表は、 1993 年 6 月末に挿入されたうるう秒に対して、 time_t と その POSIX 表現への変換値、およびそれを再変換して戻した値との関係を示します。 .ta \w'93/06/30 'u +\w'23:59:59 'u +\w'A+0 'u +\w'X=time2posix(T) 'u 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 .Pp [注: posix2time(B+1) => A+0 or A+1] .Pp うるう秒サポートが有効になっていない場合は、 ローカルの time_t と POSIX の time_t は等価となり、 .Fn time2posix および .Fn posix2time 関数はともに恒等関数となります。 .Sh 参照 .Xr difftime 3 , .Xr localtime 3 , .Xr mktime 3 , .Xr time 3