STRPTIME(3) | Linux Programmer's Manual | STRPTIME(3) |
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 をつけても構わないが必ずしも必要ではない。
E や O という修飾子を使うことで変更できるフィールドディスクリプターもある。 これらの修飾子は、別のフォーマットや仕様を使うことを指示する。 別のフォーマットや仕様が現在のロケールに存在しないときは、 変更していないフィールドディスクリプターが使われる。
E 修飾子は、ロケールに依存した日付と時刻の別の表現形式が 入力文字列に含まれていることを指定する。
O 修飾子は、ロケールに依存した別のフォーマットの中に 数値の入力があることを指定する。
この関数の返り値は、関数の中で処理されなかった最初の文字へのポインターである。 フォーマット文字列が必要する以上の文字が入力文字列に含まれている場合、 返り値は最後に処理された入力文字の次の文字を指す。 すべての入力文字列が処理された場合、 返り値は文字列末尾のヌルバイトを指す。 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 フィールドは変更されない。使用可能なフォーマット文字を以下に示す。
同様に、 strftime(3) の GNU 版での拡張に対応するために、 %k は %H、 %P は %p と等価に扱われる。また、 %l は %I と等価に扱われるようになるはずである。 さらに以下も定義されている。
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/ に書かれている。
2020-11-01 | GNU |