strftime関数は、tm構造体に設定されている日時情報を書式に従い編集します。なお、日時情報はgmtime関数とlocaltime関数で取得することができます。
#include <time.h>
size_t strftime(char *s, size_t max,
const char *format, const struct tm *tm);
*sは編集結果を格納する文字列を指定します。
maxは第1引数*sの長さを指定します。
*formatは書式を指定します。
*tmは日時情報を指定します。
戻り値として、第1引数*sに格納された文字数(終端のヌル文字は含まない)を返します。編集の結果、空文字の場合もありうるため、0が返ってきてもエラーとは限りません。
日時の編集には、次の変換指定文字を指定します。変換指定文字以外の文字はそのままコピーします。
| 変換指定文字 | 意味 |
|---|---|
| %a | 現在のロケールにおける曜日の省略名です。 |
| %A | 現在のロケールにおける曜日の完全な名前です。 |
| %b | 現在のロケールにおける月の省略名です。 |
| %B | 現在のロケールにおける月の完全な名前です。 |
| %c | 現在のロケールにおける一般的な日付・時刻の表記です。 |
| %d | 日です。(01~31) |
| %H | 24時間表記での時です。(00~23) |
| %I | 12時間表記での時です。(01~12) |
| %j | 年の初めから通算の日数です。(001~366) |
| %m | 月です。(01~12) |
| %M | 分です。(00~59) |
| %p | 現在のロケールにおける「午前」と「午後」に相当する文字列です。英語の場合には’AM’または、’PM’です。正午は午後、真夜中は午前として扱われます。 |
| %S | 秒です。(00~60) |
| %U | 年の初めからの通算の週数です。(00~53)その年の最初の日曜日を第1週の始まりとして計算します。 |
| %W | 年の初めからの通算の週数です。(00~53)その年の最初の月曜日を第1週の始まりとして計算します。 |
| %x | 現在のロケールにおける一般的な日付表記です。時刻は含みません。 |
| %X | 現在のロケールにおける一般的な時刻表記です。日付は含みません。 |
| %y | 西暦の下2桁(世紀部分を含まない年)です。(00~99) |
| %Y | 世紀部分を含めた(4桁の)西暦年です。 |
| %Z | タイムゾーンまたは、ゾーン名または、それらの省略名です。 |
ロケール(地域情報)はLC_TIMEカテゴリに応じて解釈されます。(LC_ALLが設定されている場合にはLC_TIMEよりもそちらが優先されます。)ロケールの設定・参照はsetlocale関数で行うことができます。
プログラム 例
#include <stdio.h>
#include <time.h>
#include <locale.h>
#include <stdlib.h>
int main()
{
time_t timep;
struct tm *time_inf;
char buff[100];
timep = time(NULL);
time_inf = localtime(&timep);
/* 表示 */
strftime(buff, sizeof(buff),
'%Y年%m月%d日(%a) %p%I時%M分%S秒 %Z', time_inf);
printf('%s\n', buff);
strftime(buff, sizeof(buff), '%c', time_inf);
printf('%s\n', buff);
strftime(buff, sizeof(buff), '%x %X', time_inf);
printf('%s\n', buff);
/* ロケールを環境変数から取得して設定 */
if (setlocale(LC_ALL, '') == NULL) {
fprintf(stderr, 'ロケールが設定できませんでした\n');
exit(EXIT_FAILURE);
}
printf('\nロケールを設定\n');
/* 表示 */
strftime(buff, sizeof(buff),
'%Y年%m月%d日(%a) %p%I時%M分%S秒 %Z', time_inf);
printf('%s\n', buff);
strftime(buff, sizeof(buff), '%c', time_inf);
printf('%s\n', buff);
strftime(buff, sizeof(buff), '%x %X', time_inf);
printf('%s\n', buff);
return 0;
}
例の実行結果
$ date 2008年 7月 25日 金曜日 15:22:31 JST $ $ ./strftime.exe 2008年07月25日(Fri) PM03時22分35秒 JST Fri Jul 25 15:22:35 2008 07/25/08 15:22:35 ロケールを設定 2008年07月25日(金) 午後03時22分35秒 JST 2008年07月25日 15時22分35秒 2008年07月25日 15時22分35秒 $