strptime

Section: C Library Functions (3)
Updated: 2026-04-06
Index JM Home Page roff page
 

名前

strptime - 文字列であらわされている時間を tm 構造体の時間に変換する  

ライブラリ

標準 C ライブラリ (libc-lc)  

書式

#define _XOPEN_SOURCE       /* feature_test_macros(7) 参照*/
#include <time.h>

char *strptime(const char *restrict s, const char *restrict format,
               struct tm *restrict tm);
 

説明

strptime() 関数は strftime(3) の逆関数である。 ポインター s が指す文字列を format で指定されたフォーマットを使って「要素別の時刻」に変換し、tm が指す構造体に格納します。

要素別の時刻構造体 tmtm(3type) 内で定義されています。

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
数字表現の月 (1n12)。
%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 safetyMT-Safe env locale
 

標準

POSIX.1-2008.  

履歴

POSIX.1-2001, SUSv2.  

注意

原則として、この関数は tm の初期化はせずに、指定された値のみを格納します。つまり、この関数の呼び出しの前に tm を初期化しなければなりません。他の UNIX システムとは、細かい点で異なります。glibc の実装では、明示的に指定されないフィールドは変更されません。例外として、年・月・日のいずれかの要素が変更された場合に tm_wdaytm_yday が再計算されます。

'y' (1 世紀中の年) の指定は、glibc 2.0 では、 1950-2049 の範囲として解釈されます。glibc 2.1 からは 1969-2068 の範囲として解釈されます。  

glibc での注意

一貫性を持たせるため、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%l%I と等価に扱われます。また、%P%p と等価に扱われます。さらに以下も定義されています。

%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)


 

Index

名前
ライブラリ
書式
説明
返り値
属性
標準
履歴
注意
glibc での注意
関連項目

This document was created by man2html, using the manual pages.