strptime() — ストリングから日付/時刻への変換

フォーマット

#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *tm);

言語レベル

XPG4

スレッド・セーフ

はい

ロケール依存

この関数の振る舞いは、現行ロケールの LC_CTYPE、LC_TIME、および LC_TOD カテゴリーの影響を受ける可能性があります。この関数は、コンパイル・コマンドに対して LOCALETYPE(*CLD) が指定されている場合には使用できません。詳細については、CCSID およびロケールの理解を参照してください。

説明

strptime() 関数は、format で指定された形式を使用し、 buf により示される文字ストリングを、tm で 示される tm 構造体に保管される値に変換します。

format には、ゼロ以上のディレクティブが含まれます。1 つの ディレクティブには、普通文字 (% または空白文字以外) または変換指定が 含まれます。それぞれの変換指定は、% 文字の後に変換文字が 1 つ以上続く形で構成されています。これによって、必要な置き換えを指定します。 関数が予想どおりに振る舞うことを保証するには、 bufformat の両方に空白文字または その他の区切り文字がなければなりません。2 つの string-to-number 変換の 間には区切り文字がなければなりません。そうしないと、最初の数値変換が、 2 番目の変換指定子に属する文字を変換する可能性があります。

ディレクティブが書式ストリングまたは入力ストリングのいずれかで 走査される前に検出される空白文字 (isspace() で指定される) は、 無視されます。普通文字のディレクティブは、入力ストリング内の次の走査済み 文字と完全に一致しなければなりません。普通文字ディレクティブのマッチング時には、大/小文字が区別されます。書式ストリングの普通文字ディレクティブが入力ストリングの文字と一致しない場合、strptime() は正常に行われていません。文字はこれ以上走査されません。

その他の変換指定のマッチングは、入力ストリング内の文字を走査して、その指定で使用可能な文字でない文字が検出されるまで、または文字を走査できなくなるまで行われます。指定が string-to-number であった場合、有効な文字範囲は +、-、または isdigit() で指定される文字です。数値指定子は、先行ゼロが 必要ありません。指定が現行ロケールのフィールドと一致する必要がある 場合は、一致が検出されるまで走査が繰り返されます。ロケールのフィールドを マッチングするとき、大/小文字の区別は無視されます。一致が検出されると、 tm により示される構造体が、対応するロケール情報で 更新されます。一致が検出されない場合には、strptime() は正常に行われていません。文字はこれ以上走査されません。

tm 構造体内の欠落したフィールドは、十分な情報が提供されると、strptime() によって充てんされる場合があります。例えば、日付が指定されると、 tm_yday が計算されます。

標準変換指定は、それぞれ該当する文字で置き換えられます。次の表を参照してください。

指定子 意味
%a 曜日の名前で、フルネームまたは 省略形にできます。
%A %a と同じ。
%b 月の名前で、フルネームまたは省略形に できます。
%B %b と同じ。
%c ロケールの形式の日付/時刻。
%C 世紀数 [00-99]。2 桁の年が使用される場合に 年を計算します。
%d 日 [1-31]。
%D 日付形式で、%m/%d/%y と同じ。
%e %d と同じ。
%g ISO 日付の 2 桁の年の部分 [00-99]。
%G ISO 日付の 4 桁の年の部分。負になる 場合があります。
%h %b と同じ。
%H 24 時間形式の時間 [0-23]。
%I 12 時間形式の時間 [1-12]。
%j ユリウス日付 [1-366]。
%m 月 [1-12]。
%M 分 [0-59]。
%n 改行文字が検出されるまで、すべての空白文字を スキップします。
%p 12 時間形式が使用されている場合に時間の計算に 使用される AM または PM ストリング。
%r ロケールの AM/PM 形式の時刻。ロケールの時刻形式で 使用できない場合、POSIX 時刻 AM/PM 形式である %I:%M:%S %p をデフォルトとします。
%R 秒を含まない 24 時間の時刻形式で、 %H:%M と同じ。
%S 秒 [00-61]。秒の範囲は、うるう秒および 二重うるう秒を考慮に入れています。
%t タブ文字が検出されるまで、すべての空白文字をスキップします。
%T 秒を含む 24 時間の時刻形式で、 %H:%M:%S と同じ。
%u 曜日 [1-7]。月曜が 1 で、日曜が 7。
%U 日曜を週の初日とした 1 年の週数 [0-53]。 ユリウス日付を計算する際に使用します。
%V 1 年の ISO 週数 [1-53]。月曜が 週の初日。1 月 1 日の週に新年の 4 日以上が含まれる場合、 この週は週 1 と考慮されます。そうでない場合、この週は前年の最終週となり、 次の週が新年の週 1 となります。ユリウス日付を計算する際に使用します。
%w 曜日 [0 -6]。日曜が 0。
%W 1 年の週数 [0-53]。月曜が 週の初日。ユリウス日付を計算する際に使用します。
%x ロケールの形式の日付。
%X ロケールの形式の時刻。
%y 2 桁の年 [0-99]。
%Y 4 桁の年。負になる 場合があります。
%z UTC オフセット。出力は、+HHMM または -HHMM の形式のストリングで、+ は GMT の東、- は GMT の西、HH は GMT からの時間数、MM は GMT からの分数をそれぞれ 表します。
%Z 時間帯名。
%% % 文字。

変更された変換指定子

一部の変換指定子は、修飾子文字 E または O によって変更できます。これによって、代替の形式または指定を使用するよう指示できます。変換された変換指定子が 現行ロケールで使用不可になっているフィールドを使用する場合、 振る舞いは未変更変換指定が使用されたかのようになります。 例えば、era ストリングが空ストリング "" (era は使用不可であることを意味します) である場合、 %EY が %Y のように振る舞います。

指定子 意味
%Ec 現在の時代の日付/時刻。
%EC 年代名。
%Ex 現在の時代の日付。
%EX 現在の時代の時刻。
%Ey 年代の年。これは基本の年からのオフセットです。
%EY 現在の時代の年。
%Od 代替数字を使用した日。
%Oe %Od と同じ。
%OH 代替数字を使用した 24 時間形式の時間。
%OI 代替数字を使用した 12 時間形式の時間。
%Om 代替数字を使用した月。
%OM 代替数字を使用した分。
%OS 代替数字を使用した秒。
%Ou 代替数字を使用した曜日。月曜が 1 で、日曜が 7。
%OU 代替数字を使用した 1 年の週数。 日曜が週の初日。
%OV 代替数字を使用した 1 年の ISO 週数。 ISO 週数の説明については、%V を参照してください。
%Ow 代替数字を使用した曜日。日曜が 0 で、土曜が 6。
%OW 代替数字を使用した 1 年の週数。 月曜が週の初日。
%Oy 代替数字を使用した 2 桁の年。
%OZ 時間帯の省略名。

戻り値

正常終了の場合は、strptime() 関数は、解析済みの最終文字の次の文字への ポインターを戻します。それ以外の場合は、NULL ポインターが戻されます。 errno の値は ECONVERT (変換エラー) に設定される可能性があります。

#include <stdio.h>
#include <locale.h>
#include <time.h>

int main(void)
{
    char buf[100];
    time_t t;
    struct tm *timeptr,result;

    setlocale(LC_ALL,"/QSYS.LIB/EN_US.LOCALE");
    t = time(NULL);
    timeptr = localtime(&t);
    strftime(buf,sizeof(buf), "%a %m/%d/%Y %r", timeptr);

    if (strptime(buf, "%a %m/%d/%Y %r",&result) == NULL)
          printf("¥nstrptime failed¥n");
    else
    {
          printf("tm_hour:  %d¥n",result.tm_hour);
          printf("tm_min:  %d¥n",result.tm_min);
          printf("tm_sec:  %d¥n",result.tm_sec);
          printf("tm_mon:  %d¥n",result.tm_mon);
          printf("tm_mday:  %d¥n",result.tm_mday);
          printf("tm_year:  %d¥n",result.tm_year);
          printf("tm_yday:  %d¥n",result.tm_yday);
          printf("tm_wday:  %d¥n",result.tm_wday);
    }
 
    return 0;
}

/************************************************************
     The output should be similar to:
     Tue 10/30/2001 10:59:10 AM
     tm_hour:  10
     tm_min:  59
     tm_sec:  10
     tm_mon:  9
     tm_mday:  30
     tm_year:  101
     tm_yday:  302
     tm_wday:  2
************************************************************/