TIME2POSIX(3) | FreeBSD Library Functions Manual | TIME2POSIX(3) |
名称
time2posix, posix2time — 基準時点からの秒数を変換するライブラリ
Standard C Library (libc, -lc)解説
IEEE Std 1003.1-1988 (“POSIX.1”) は、536457599 という time_t 値を "Wed Dec 31 23:59:59 GMT 1986" (1986 年 12 月 31 日 23:59:59) に対応させるように規定しています。これは、実際上 POSIX の time_t が閏(うるう)秒を含むことはできないことを意味しています。従ってシステム時間は閏秒が起きるたびに調整しなければなりません。時間パッケージの閏秒サポートが有効に設定されている場合は、このような調整は必要がなく、time_t 値は閏秒のイベント (真の `…からの秒数' で) が終るまで増加し続けます。これは、これらの値が基準時点以来挿入された正味の閏秒だけ POSIX によって要求される値と異なることを意味します。
通常は、タイプ time_t は (ほとんどの場合) 不透明なので問題になりません。—すなわち time_t 値は time(3), localtime(3), mktime(3), difftime(3) などの関数からのみ取得し、またそれらの関数のみに渡すべきです。しかしながら、 IEEE Std 1003.1-1988 (“POSIX.1”) は、指定された日付/時間から time_t 値を直接計算する数式を与えており、同じ関係はいくつかの (通常古い) アプリケーションによって前提とされます。通常、この関係を使って time_t の作成/分析を行っているプログラムでは、閏秒をまたがる間隔を正しく処理できません。
time2posix() と posix2time() 関数は、ローカルの time_t 値とそれらに相当する POSIX 等価の値との間で変換を行って、この time_t のミスマッチを解決するために提供されています。これは、閏秒の挿入や削除のように POSIX システムに起きた時間ベース変更の回数を数えることにより行います。これらの変換値は、古いアプリケーションを修正する代りに、あるいは POSIX 準拠システムと通信するときに用いることができます。
time2posix() 関数は単一の値を持ちます。すなわち、すべてのローカルの time_t は、単一の POSIX time_t に対応します。 posix2time() 関数の動作は、それほど行儀よくありません。正の閏秒についてその結果はユニークではなく、また負の閏秒に対しては対応する POSIX time_t が存在しないためにそれに近い値が返されます。これらの両方とも、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() 関数は、ともに恒等(同一)関数となります。
September 11, 2005 | FreeBSD |