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秒
$