strftime() — 日付/時刻からストリングへの変換
フォーマット
#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format,
const struct tm *timeptr);
言語レベル
ANSI
スレッド・セーフ
はい
ロケール依存
この関数の振る舞いは、現行ロケールの LC_CTYPE、LC_TIME、および LC_TOD カテゴリーの影響を受ける可能性があります。詳細については、CCSID およびロケールの理解を参照してください。
説明
strftime() 関数は、format が指す制御ストリングで指定された形式で、 s が指す配列にバイトを入れます。書式ストリングは、ゼロ個以上の変換指定と 普通文字で構成されています。変換指定は、% 文字と 変換の振る舞いを決定する終了変換文字で構成されています。 すべての普通文字 (終了ヌル・バイトおよびマルチバイト文字を含む) は、 変更されないまま配列にコピーされます。オーバーラップしたオブジェクト間で コピーが行われる場合には、振る舞いは予期できません。 maxsize までのバイトが配列に入ります。 該当する文字は、timeptr が指す構造体に含まれる値 と現行ロケールに保管された値によって決定されます。
標準変換指定は、それぞれ該当する文字で置き換えられます。次の表を参照してください。
指定子 | 意味 |
---|---|
%a | 曜日の省略名。 |
%A | 曜日のフルネーム。 |
%b | 月の省略名。 |
%B | 月のフルネーム。 |
%c | ロケールの形式の日付/時刻。 |
%C | 世紀数 [00-99] (100 で除算し、整数に切り捨てた年)。 |
%d | 日 [01-31]。 |
%D | 日付形式で、%m/%d/%y と同じ。 |
%e | 1 桁の場合は前にスペースが入ることを除き、 %d と同じ [1-31]。 |
%g | ISO 日付の 2 桁の年の部分 [00,99]。 |
%F | ISO 日付形式で、%Y-%m-%d と同じ。 |
%G | ISO 日付の 4 桁の年の部分。負になる 場合があります。 |
%h | %b と同じ。 |
%H | 24 時間形式の時間 [00-23]。 |
%I | 12 時間形式の時間 [01-12]。 |
%j | ユリウス日付 [001-366]。 |
%m | 月 [01-12]。 |
%M | 分 [00-59]。 |
%n | 改行文字 |
%p | 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 年の週数 [00-53]。日曜が週の初日。 |
%V | 1 年の ISO 週数 [01-53]。月曜が週の初日。1 月 1 日の週に新年の 4 日以上が含まれる場合、 この週は週 1 と考慮されます。そうでない場合、この週は前年の最終週となり、 次の週が新年の週 1 となります。 |
%w | 曜日 [0,6] で、日曜が 0。 |
%W | 1 年の週数 [00-53]。月曜が週の初日。 |
%x | ロケールの形式の日付。 |
%X | ロケールの形式の時刻。 |
%y | 2 桁の年 [00,99]。 |
%Y | 4 桁の年。負になる 場合があります。 |
%z | UTC オフセット。出力は、+HHMM または -HHMM の形式のストリングで、+ は GMT の東、- は GMT の西、HH は GMT からの時間数、MM は GMT からの分数をそれぞれ 表します。 |
%Z | 時間帯名。 |
%% | % 文字。 |
変更された変換指定子
いくつかの変換指定子は、E または O 修飾子文字により変更可能です。 この変更を行うことで、通常使用されている未変更変換指定子の変わりに、代替の形式や指定方法 が使用されるべきであることを示すことができます。 変換された変換指定子が 現行ロケールで使用不可になっているフィールドを使用する場合、 振る舞いは未変更変換指定が使用されたかのようになります。 例えば、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。 |
%OW | 代替数字を使用した 1 年の週数。 月曜が週の初日。 |
%Oy | 代替数字を使用した 2 桁の年。 |
%OZ | 時間帯名が現行ロケールに存在する場合、これは %Z と同じです。存在しない場合、現行ジョブの 省略された時間帯名が戻されます。 |
戻り値
終了ヌル・バイトを含む結果バイトの合計数が maxsize を超えない場合、strftime() は、終了ヌル・バイトを含まない、 s が指す配列に配置されたバイト数を戻します。 それ以外の場合は、0 が戻され、配列の内容は 不確定となります。
変換エラーが発生した場合、errno は ECONVERT に設定される可能性があります。
例
#include <stdio.h>
#include <time.h>
int main(void)
{
char s[100];
int rc;
time_t temp;
struct tm *timeptr;
temp = time(NULL);
timeptr = localtime(&temp);
rc = strftime(s,sizeof(s),"Today is %A, %b %d.¥nTime: %r", timeptr);
printf("%d characters written.¥n%s¥n",rc,s);
return 0;
}
/*************************************************
The output should be similar to:
46 characters written
Today is Wednesday, Oct 24.
Time: 01:01:15 PM
************************************************************/
関連情報
- asctime() — 時間から文字ストリングへの変換
- asctime_r() — 時間から文字ストリングへの変換 (再始動可能)
- ctime() — 時間から文字ストリングへの変換
- ctime64() — 時間から文字ストリングへの変換
- ctime64_r() — 時間から文字ストリングへの変換 (再始動可能)
- ctime_r() — 時間から文字ストリングへの変換 (再始動可能)
- gmtime() — 時間の変換
- gmtime64() — 時間の変換
- gmtime64_r() — 時間の変換 (再始動可能)
- gmtime_r() — 時間の変換 (再始動可能)
- localtime() — 時間の変換
- localtime64() — 時間の変換
- localtime64_r() — 時間の変換 (再始動可能)
- localtime_r() — 時間の変換 (再始動可能)
- setlocale() — ロケールの設定
- strptime() — ストリングから日付/時刻への変換
- time() — 現在時刻の判別
- time64() — 現在時刻の判別
- <time.h>