スポンサーリンク

TIME2POSIX(3) FreeBSD ライブラリ関数マニュアル TIME2POSIX(3)

名称

time2posix, posix2time − 基準時点からの秒数を変換

ライブラリ

標準 C ライブラリ (libc, −lc)

書式

#include <time.h>

time_t

time2posix(const time_t *t);

time_t

posix2time(const time_t *t);

解説

IEEE Std 1003.1-1988 (‘‘POSIX.1’’) は、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) などの関数からのみ取得 し、またそれらの関数のみに渡すように考えられているので — このことは問題に なりません。しかしながら、 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() 関数の動作は、 それほど行儀よくありません。正のうるう秒に出会うとその結果は 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)

FreeBSD 10.0 May 1, 1996 FreeBSD 10.0

スポンサーリンク