aboutsummaryrefslogblamecommitdiff
path: root/ja_JP.eucJP/man/man3/time2posix.3
blob: a4406daf1c0182a38dae88699dbe1a9479bdc0c8 (plain) (tree)
1
             
























































































                                                                             
.\" $FreeBSD$
.Dd May 1, 1996
.Dt TIME2POSIX 3
.Os
.Sh 名称
.Nm time2posix ,
.Nm posix2time
.Nd 基準時点からの秒数を変換
.Sh 書式
.Fd #include <time.h>
.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