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 (%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 月の 1st が含まれている週が、新しい年に 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>