PARSEDATE(3)

名前
parsedate - 時刻と日付の文字列の数値への変換

形式
#include <sys/types.h>
typedef struct _TIMEINFO {
    time_t	time;
    long	usec;
    long	tzone;
} TIMEINFO;
time_t
parsedate(text, now)
    char	*text;
    TIMEINFO	*now;

機能説明
parsedate は多数存在する一般的な日付の表記を 1970 年 1 月 1 日 00:00:00 UTC からの経過秒数に変換します — すなわち 、 time_t 形式に変換します。 time(2) を参照してください。

parsedate の戻り値は時間で、エラーの場合、-1 となります。 text は時刻と日付を含む文字列です。 now は相対的な時間を計算するために使用しなければいけない TIMEINFO 構造体へのポインタです。 now が NULL の場合、 libinn(3) の GetTimeInfo を使用して現在時刻とタイムゾーンを取得します。

文字列は 0 個以上の次のような形式の表記から構成されます。

time
    hh[:mm[:ss]] [am|pm] [zone] あるいは hhmm [am|pm] [zone] の形式の日時です。 am あるいは pm が指定されていなければ、 hh は 24 時間での時刻と解釈されます。

date
    月日の形式の表記で、年は省略できます。 使用可能な形式は mm/dd[/yy] 、 yyyy/mm/dd 、 monthname dd[, yy] 、 dd monthname [yy] および day, dd monthname yy です。 デフォルトの年は現在時刻を取得した年です。 年が 100 より小さいと、1900 を加算し、21 より小さいと 2000 を加算します。

relative time
    現在時刻からの相対の形式の表記です。 形式は number unit で、使用可能な unit は year、 month、 week、 day、 hour、 minute (あるいは min )および second (あるいは sec )です。 unit は 3 weeks のように単数でも複数でも表記することができます。

実際の日時は次のような手順にしたがって計算されます。 最初に、絶対的な日付および/あるいは時刻を処理し、変換します。 その日時をもとにしたものを使用して、曜日の表記を加えます。 次に、相対的な表記を使用します。 日付あるいは日の表記を使用していて絶対的あるいは相対的な時刻がなければ、午前 0 時を使用します。 最後に、夏時間の差分を考慮したのち、その日の正しい時刻を生成します。

すべての文字列を解析する場合、 parsedate は大文字、小文字は区別しません。 理解できない文字列は知らないタイムゾーンとみなし、GMT として扱われます。 月と曜日は最初の 3 文字に省略することができ、最後に省略可能なピリオドを付けることもできます。 タイムゾーンや am あるいは pm でのピリオドは無視されます。

バグ
parsedate はすべての期待した文字列あるいはあいまいな文字列を理解するわけではありません。 しかし、``February 31'' のように意味的に正しくない日付は理解されます。

夏時間はすべて 1 時間単位としていますが、地域によってはこれは正しくありません。 時刻が変わる時に時間を解析したり、 日付が変わる時に解析すると、時差の修正が正しくなくなることがあります。

履歴
オリジナルは Steven M. Bellovin <smb@research.att.com> が Chapel Hill のノースカロライナ大にいた時に記述され、 getdate という名前で配布されていました。

1990 年の 8 月に Rich $alz <rsalz@bbn.com> と Jim Berets <jberets@bbn.com> により大きな手直しが行われました。

さらに一年後に InterNetNews 用に Rich (現在は <rsalz@osf.org>) により(おもに使用しなくなった形式とタイムゾーンを削除するために)改版され、 名前も変更されました。

関連項目
date(1)、 ctime(3)、 libinn(3)、 time(2)