strftime

時間や日時情報を指定された書式に従って変換し,文字配列に格納します.

#include <time.h>
size_t strftime(
    char * restrict s,
    size_t maxsize,
    const char * restrict format,
    const struct tm * restrict timeptr
)

strftime 関数は timeptr で示された時間や日付情報を format で指定された書式に従って変換し,s が指す配列に格納します.このとき,時間・日付の変換はロケール情報の LC_TIME カテゴリに基づいて解釈されます.なお,maxsize を超えるサイズの文字列を配列に格納することは出来ません.

引数

  • s: 文字配列 (ここに結果を格納)
  • maxsize: s の最大要素数
  • format: 書式文字列 (詳しくは以下を参照してください)
  • timeptr: 時間・日付情報

書式文字列

書式文字列には通常の多バイト文字 (multibyte character) と変換指定子を記述できます.

変換指定子と変換指定子によって置き換わる文字列は以下の通りです.

書式置き換わる文字列
%aロケールの簡略化された曜日の名前
%Aロケールの簡略化されていない曜日の名前
%bロケールの簡略化された月の名前
%Bロケールの簡略化されていない月の名前
%cロケールの適切な日付と時刻 (dd hh:mm:ss)
%C西暦の年を 100 で除算し整数で切り捨てた 10 進数 (00 〜 99)
%d10 進数で月の日 (01〜31)
%D"%m/%d/%y"と等価な日付表現
%e10 進数で月の日 ( 1〜31) 1 桁の場合は空白文字を前につける
%F"%Y-%m-%d" と等価な日付表現
%g暦週に基づく年の下 2 桁を表す 10 進数 (00 〜 99)
%G暦週に基づく年を表す 10 進数 (例.2007)
%h"%b" と等価な表現
%H24 時間制の時間を表す 10 進数 (00 〜 23)
%I12 時間制の時間を表す 10 進数 (01 〜 12)
%j年間通した日(001 〜 366)
%m月(01 〜 12)
%M分(00 〜 59)
%n改行文字
%pロケールの 12 時間制に関連した午前/午後の表記 (AM / PM)
%rロケールの 12 時間制での時刻表現
%S秒 (00 〜 60)
%t水平タブ文字
%T"%H:%M:%S" に等価な時刻表現
%u暦週の中の日の序数 (1 〜 7) 月曜日は 1
%U年間の経過した週の数 (最初の日曜日を 1 日目としてカウント)
%V暦週の序数 (01 〜 53)
%w曜日 (日曜日を 0 として 0 〜 6)
%W年間の経過した週の数 (最初の月曜日を 1 日目としてカウント)
%xロケールの適切な日付表現 (yy/MM/dd)
%Xロケールの適切な時刻 (hh:mi AM/PM)
%y西暦の下 2 桁の年 (yy)
%Y西暦 (yyyy)
%zUTCからの時差
%Zタイムゾーンの名前
%%%
%Ecロケールでの日付及び時刻の代替表現
%ECロケールでの代替表現である年号
%Exロケールでの日付の代替表現
%EXロケールでの時刻の代替表現
%Eyロケールでの代替表現である %EC (年号) に対応した年
%EYロケールでの年の完全形式の代替表現
%Odロケールでの代替数値記号を使った日の表現 (必要に応じて 0 を前置)
%Oeロケールでの代替数値記号を使った日の表現 (必要に応じて空白を前置)
%OHロケールでの代替数値記号を使った時間 (24 時間制)
%OIロケールでの代替数値記号を使った時間 (12 時間制)
%Omロケールでの代替数値記号を使った月
%OMロケールでの代替数値記号を使った分
%OSロケールでの代替数値記号を使った秒
%Ouロケールでの代替表現による暦週の中の序数 (月曜日が 1)
%OUロケールでの代替数値記号を使った週番号
%OVロケールでの代替数値記号を使った暦週の序数
%Owロケールでの代替数値記号を使った曜日
%OWロケールでの代替数値記号を使った年の週番号
%Oyロケールでの代替数値記号を使った西暦の下2桁の年

戻り値

  • 成功時: 文字列バッファに書き込んだ文字数 (終端のナル文字を含まない)
  • 失敗時: 0

C言語サンプルプログラム

strftime 関数を使用して時間や日時情報を変換するサンプルプログラムを示します.

/* header files */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/* macros */
#define N 256

/* main */
int main(void) {
    char s[N] = {'\0'};
    time_t timer;
    struct tm *timeptr;

    timer = time(NULL);
    timeptr = localtime(&timer);
    strftime(s, N, "%Y年%m月%d日 %H時%M分%S秒", timeptr);

    printf("%s\n", s);

    return EXIT_SUCCESS;
}

実行例

サンプルプログラムの実行結果は以下のようになります.

2008年05月03日 19時33分14秒

Cプログラマの必読書

たくさんあるC言語関連の書籍の中でも特に役に立った本です.よかったら参考にしてみてください.

C実践プログラミング 第3版

C言語の実践的参考書.少々値段は張りますが初心者を脱しようとしている人は絶対に読むべきです.
文法だけでなく,コーディングスタイルやデバッグなど文字通り「実践的」なことが書かれているので非常にためになります. オライリーの本は,読みにくい本が多いのですが本書はとても読みやすくオススメです.


C言語ポインタ完全制覇 (標準プログラマーズライブラリ)

ポインタの解説書としては最高の書籍です.
この1冊でポインタを完全に理解することができます.全くの初学者が読むには敷居が高いですが,入門書を読み終えた後に読むと非常に有益です.