strptime -
文字列であらわされている時間を
tm
構造体の時間に変換する
#define _XOPEN_SOURCE /*
feature_test_macros(7) 参照 */
#include <time.h>
char *strptime(const char *s, const char
*format, struct tm *tm);
strptime() 関数は
strftime(3)
の逆関数である。
ポインター
s
が指す文字列を
format
で指定されたフォーマットを使って「要素別の時刻」に変換し、
tm
が指す構造体に格納する。
要素別の時刻構造体
tm は
<time.h>
内で以下の様に定義されている。
struct tm {
int tm_sec; /* 秒 (0-60) */
int tm_min; /* 分 (0-59) */
int tm_hour; /* 時間 (0-23) */
int tm_mday; /* 月内の日付 (1-31) */
int tm_mon; /* 月 (0-11) */
int tm_year; /* 年 - 1900 */
int tm_wday; /* 曜日 (0-6, 日曜 = 0) */
int tm_yday; /* 年内通算日 (0-365, 1 月 1 日 = 0) */
int tm_isdst; /* 夏時間 */
};
tm 構造体の詳細は
ctime(3) を参照。
format 引数は、
scanf(3)
で使われているような、
フィールドディスクリプターとテキスト文字で構成されている文字列である。
個々のフィールドディスクリプターは
%
とそれに続く文字からなり、
後者にフィールドディスクリプターを置き換える内容を指定する。
format
文字列中の他の全ての文字には、入力文字列にマッチする文字がなければならない。
フォーマット文字列中にある空白は例外であり、
入力文字列中の 0
個以上の空白とマッチする。
2
つのフィールドディスクリプターの間には、
空白・英字・数字がなければならない。
strptime()
関数は、入力文字列を左から右へ処理する。
入力された 3 つの要素
(空白・文字・フォーマット)
は、順に処理される。
入力がフォーマット文字列とマッチできない場合、関数は停止する。
残りのフォーマット文字列と入力文字列は処理されない。
使用可能なフィールドディスクリプターを以下に挙げる。
(曜日や月の名前といった)
文字列をマッチさせる場合、
大文字と小文字は区別せずに比較する。
数をマッチさせる場合、前に
0
をつけても構わないが必ずしも必要ではない。
- %%
- 文字としての
%。
-
%a または %A
- 現在のロケールでの曜日名
(省略名または完全な名前)。
-
%b または %B
または %h
- 現在のロケールでの月名
(省略名または完全な名前)。
- %c
- 現在のロケールでの日付と時刻の表現。
- %C
- 1 世紀中の年
(0–99)。
-
%d または %e
- 月内の日付
(1–31)。
- %D
- 日付。 %m/%d/%y
と同じ。
(これはアメリカ式の日付形式で、
ヨーロッパでは特に
%d/%m/%y
という形式が広く使われているために、
アメリカ人以外には紛らわしく感じられる。
ISO 8601 規格では %Y-%m-%d
という形式である。)
- %H
- 時間 (0–23)。
- %I
- 12 時間制での時間
(1–12)。
- %j
- 年の初めからの通算の日付
(1–366)。
- %m
- 数字表現の月
(1–12)。
- %M
- 分 (0–59)。
- %n
- 任意の空白。
- %p
- ロケールの AM
(午前) と PM (午後)
に対応するもの。
(注意:
対応するものがないかもしれない。)
- %r
- (ロケールの AM と PM
を使った) 12
時間制の時間。 POSIX
ロケールでは %I:%M:%S %p
と同じ。
現在のロケールにおいて
LC_TIME パートの t_fmt_ampm
が定義されていない場合、
動作は未定義である。
- %R
-
%H:%M と同じ。
- %S
- 秒 (0–60; 60
は閏秒を示す。以前は
61 も指定できた)。
- %t
- 任意の空白。
- %T
-
%H:%M:%S と同じ。
- %U
- 日曜日を週の始まりとした年通算での週数
(0–53)。 1
月の最初の日曜日を第
1
週目の最初の日する。
- %w
- 曜日を表す数字
(0–6)、日曜日 が 0。
- %W
- 月曜日を週の始まりとした年通算での週数
(0–53)。 1
月の最初の月曜日を第
1
週目の最初の日する。
- %x
- 日付。ロケールの日付フォーマットを使う。
- %X
- 時刻。ロケールの時刻フォーマットを使う。
- %y
- 1 世紀中の年
(0–99)。
世紀が指定されない場合、
値が 69–99
の範囲のときは 20
世紀の年 (1969–1999)、
値が 00–68
の範囲のときは 21
世紀の年 (2000–2068)
とする。
- %Y
- 年。世紀の部分を含む
(例: 1991)。
E や O
という修飾子を使うことで変更できるフィールドディスクリプターもある。
これらの修飾子は、別のフォーマットや仕様を使うことを指示する。
別のフォーマットや仕様が現在のロケールに存在しないときは、
変更していないフィールドディスクリプターが使われる。
E
修飾子は、ロケールに依存した日付と時刻の別の表現形式が
入力文字列に含まれていることを指定する。
- %Ec
- 日付と時刻。ロケールに依存した別の表現形式を使う。
- %EC
- 基準年 (期間)
の名前。ロケールに依存した別の表現形式を使う。
- %Ex
- 日付。ロケールに依存した別の表現形式を使う。
- %EX
- 時刻。ロケールに依存した別の表現形式を使う。
- %Ey
-
%EC (年のみ)
からのオフセット。ロケールに依存した別の表現形式を使う。
- %EY
- 完全な形式の年。別の表現型式を使う。
O
修飾子は、ロケールに依存した別のフォーマットの中に
数値の入力があることを指定する。
-
%Od または %Oe
- 月の初めからの通算の日付。ロケールに依存した別の数値シンボルを使う。
0
を頭につけてもよいが、必須ではない。
- %OH
- 時間 (24
時間制)。ロケールに依存した別の数値シンボルを使う。
- %OI
- 時間 (12
時間制)。ロケールに依存した別の数値シンボルを使う。
- %Om
- 月。ロケールに依存した別の数値シンボルを使う。
- %OM
- 分。ロケールに依存した別の数値シンボルを使う。
- %OS
- 秒。ロケールに依存した別の数値シンボルを使う。
- %OU
- 年の初めからの通算の週数
(日曜日を週の始めとする)。
ロケールに依存した別の数値シンボルを使う。
- %Ow
- 曜日を表す数字
(日曜日 が 0)、
ロケールに依存した別の数値シンボルを使う。
- %OW
- 年の初めからの通算の週数
(月曜日を週の始めとする)。
ロケールに依存した別の数値シンボルを使う。
- %Oy
- 年 (%C
からのオフセット)。ロケールに依存した別の数値シンボルを使う。
この関数の返り値は、関数の中で処理されなかった最初の文字へのポインターである。
フォーマット文字列が必要する以上の文字が入力文字列に含まれている場合、
返り値は最後に処理された入力文字の次の文字を指す。
すべての入力文字列が処理された場合、
返り値は文字列末尾のヌルバイトを指す。
strptime()
がフォーマット文字列のすべての比較に失敗し、
エラーが起こった場合、関数はヌルポインターを返す。
この節で使用されている用語の説明については、
attributes(7) を参照。
インターフェース |
属性 |
値 |
strptime() |
Thread safety |
MT-Safe env locale |
POSIX.1-2001, POSIX.1-2008, SUSv2.
原則として、この関数は
tm
の初期化はせずに、
指定された値のみを入れる。
つまり、この関数の呼び出しの前に
tm
を初期化しなければならない。
他の UNIX
システムとは、細かい点で異なる。
glibc
の実装では、明示的に指定されないフィールドは変更されない。
例外として、年・月・日のいずれかの要素が変更された場合に
tm_wday と
tm_yday
が再計算される。
'y' (1 世紀中の年)
の指定は、 glibc 2.0 では、
1950–2049
の範囲として解釈される。
glibc 2.1 からは 1969–2068
の範囲として解釈される。
一貫性を持たせるため、glibc
では
strptime() に
strftime(3)
と同じフォーマット文字をサポートさせようとしている。多くの場合、対応するフィールドが解釈されるが、
tm
フィールドは変更されない。使用可能なフォーマット文字を以下に示す。
- %F
-
%Y-%m-%d と同じ。ISO 8601
の日付形式。
- %g
- ISO
週数に対応した西暦年。世紀は含まず
(0–99) の範囲。
- %G
- ISO
週数に対応した西暦年
(例えば 1991)。
- %u
- 10 進数表記の曜日
(1–7 で月曜日を 1
とする)。
- %V
- ISO 8601:1988
形式での年通算の 10
進数表記での週数
(1–53)。 1 月 1 日を含む
(月曜日から始まる)
週に 4
日以上が含まれている場合は、
その週を第 1
週とする。 3
日以下しか含まれていない場合は、1
月 1
日を含む週を前年の最終の週として、
次の週を第 1
週とする。
- %z
- RFC-822/ISO 8601
標準タイムゾーンを指定する。
- %Z
- タイムゾーン名。
同様に、
strftime(3) の GNU
版での拡張に対応するために、
%k は
%H、 %P は
%p
と等価に扱われる。また、
%l は
%I
と等価に扱われるようになるはずである。
さらに以下も定義されている。
- %s
- 紀元 (Epoch; 1970-01-01 00:00:00 +0000 (UTC))
からの通算の秒数。
閏秒がサポートされていない限り、閏秒はカウントしない。
glibc における実装では、2
つのフィールド間の空白は必要ない。
以下の例は
strptime() と
strftime(3)
の使用法を示している。
#define _XOPEN_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int
main(void)
{
struct tm tm;
char buf[255];
memset(&tm, 0, sizeof(tm));
strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
strftime(buf, sizeof(buf), "%d %b %Y %H:%M", &tm);
puts(buf);
exit(EXIT_SUCCESS);
}
time(2),
getdate(3),
scanf(3),
setlocale(3),
strftime(3)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。