Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

  1. トップページ
  2. C言語辞典
  3. strftime() / asctime() / ctime()

strftime() / asctime() / ctime()

時刻を文字列に変換するための関数です。『<time.h>』に定義されており、ログファイルへのタイムスタンプ記録や日時の表示など幅広い用途に使われます。

構文
// struct tm を書式文字列に従って文字列に変換します。
// 戻り値: 書き込んだ文字数(終端の '\0' を除く)。バッファが足りない場合は 0。
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *tm);

// struct tm を固定形式の文字列(英語)に変換します(スレッドアンセーフ)。
// 戻り値: 『Www Mmm dd hh:mm:ss yyyy\n』形式の静的な文字列へのポインタ。
char *asctime(const struct tm *tm);

// time_t を固定形式の文字列(英語)に変換します(スレッドアンセーフ)。
// 戻り値: asctime(localtime(timer)) と同等の文字列へのポインタ。
char *ctime(const time_t *timer);
strftime の主な書式指定子
指定子意味
%Y4桁の年2024
%m2桁の月(01〜12)03
%d2桁の日(01〜31)15
%H2桁の時(00〜23、24時間制)14
%M2桁の分(00〜59)30
%S2桁の秒(00〜60)05
%A曜日の完全名(ロケール依存)Friday
%a曜日の短縮名(ロケール依存)Fri
%B月の完全名(ロケール依存)March
%b月の短縮名(ロケール依存)Mar
%pAM/PM(ロケール依存)PM
%Zタイムゾーン名JST
%%リテラルの % 文字%
サンプルコード
#include <stdio.h>
#include <time.h>

int main(void) {
    time_t now = time(NULL);
    struct tm *local = localtime(&now);

    // strftime で自由な書式に変換します。
    char buf[128];

    // 日本語風の日時形式で出力します(%Y年%m月%d日 %H:%M:%S)。
    strftime(buf, sizeof(buf), "%Y\xe5\xb9\xb4%m\xe6\x9c\x88%d\xe6\x97\xa5 %H:%M:%S", local);
    printf("日時: %s\n", buf); // 例: 『2024年03月15日 10:30:05』

    // ISO 8601 形式(国際標準・ログに適しています)。
    strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S", local);
    printf("ISO 8601: %s\n", buf); // 例: 『2024-03-15T10:30:05』

    // ファイル名に使いやすい形式(スペースやコロンを避けます)。
    strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S", local);
    printf("ファイル名用: %s\n", buf); // 例: 『20240315_103005』

    // asctime で英語の固定形式に変換します。
    printf("asctime: %s", asctime(local)); // 末尾に '\n' が含まれます。
    // 例: 『Fri Mar 15 10:30:05 2024』

    // ctime で time_t を直接文字列に変換します(localtime + asctime と同等)。
    printf("ctime:   %s", ctime(&now));
    // 例: 『Fri Mar 15 10:30:05 2024』

    return 0;
}
概要

『strftime()』は書式指定子を使って任意の形式に変換できるため、3つの関数の中で最も柔軟で実用的です。ログへのタイムスタンプ記録には ISO 8601 形式(『%Y-%m-%dT%H:%M:%S』)が国際的に広く使われています。

『%A』(曜日名)や『%B』(月名)はロケール依存で、日本語ロケール環境では日本語で出力されることがあります。移植性を重視する場合は固定の配列(例:weekdays[] = {"Sun", "Mon", ...})を使うと安全です。

asctime() と ctime() はスレッドアンセーフです。内部の静的なバッファを返すため、複数スレッドから同時に呼び出すと競合します。また、asctime() が返す文字列の末尾には改行文字('\n')が含まれているため、printf() する際に改行が二重にならないよう注意してください。

struct tm の取得については『localtime() / gmtime() / mktime()』、time_t の取得については『time() / difftime() / clock()』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。