名稱空間
變體
操作

strftime

來自 cppreference.com
< c‎ | 時間
定義於標頭檔案 <time.h>
size_t strftime( char*          str, size_t count,
                 const char*          format, const struct tm*          tp );
(直到 C99)
size_t strftime( char* restrict str, size_t count,
                 const char* restrict format, const struct tm* restrict tp );
(C99 起)

根據格式字串 format,將給定日曆時間 tp 中的日期和時間資訊轉換為以 null 結尾的多位元組字串 str。最多寫入 count 個位元組。

目錄

[編輯] 引數

str - 指向用於輸出的字元陣列第一個元素的指標
count - 要寫入的最大位元組數
format - 指向指定轉換格式的以 null 結尾的多位元組字串的指標
tp - 指向 struct tm 物件的指標,該物件指定要格式化的時間

[編輯] 格式字串

格式字串由零個或多個轉換說明符和普通字元(除了 %)組成。所有普通字元,包括終止 null 字元,都會不加修改地複製到輸出字串中。每個轉換規範以 % 字元開頭,可選地後跟 EO 修飾符(如果區域設定不支援則忽略),然後是確定說明符行為的字元。可用的格式說明符如下:

轉換
說明符
解釋 使用的欄位
% 寫入字面量 %。完整的轉換說明符必須是 %%
n
(C99)
寫入換行符
t
(C99)
寫入水平製表符
Y 年份寫入為十進位制數字,例如 2017 tm_year
EY
(C99)
以替代表示形式寫入年份,例如在 ja_JP 區域設定中是 平成23年(Heisei 23 年)而不是 2011年 tm_year
y 年份的後兩位數字寫入為十進位制數字(範圍 [00,99] tm_year
Oy
(C99)
使用替代數字系統寫入年份的後兩位數字,例如在 ja_JP 區域設定中是 十一 而不是 11 tm_year
Ey
(C99)
年份寫入為區域設定替代日曆週期 %EC 的偏移量(取決於區域設定) tm_year
C
(C99)
年份的前兩位數字寫入為十進位制數字(範圍 [00,99] tm_year
EC
(C99)
以區域設定的替代表示形式寫入基準年份(週期)的名稱,例如在 ja_JP 中是 平成(Heisei 時代) tm_year
G
(C99)
寫入 ISO 8601 基於周的年份,即包含指定周的年份。

在ISO 8601中,周以星期一開始,一年的第一週必須滿足以下要求

  • 包含1月4日
  • 包含一年中的第一個星期四
tm_year, tm_wday, tm_yday
g
(C99)
寫入 ISO 8601 基於周的年份的後兩位數字,即包含指定周的年份(範圍 [00,99])。

在ISO 8601中,周以星期一開始,一年的第一週必須滿足以下要求

  • 包含1月4日
  • 包含一年中的第一個星期四
tm_year, tm_wday, tm_yday
b 寫入月份縮寫名稱,例如 Oct(取決於區域設定) tm_mon
Ob
(C23)
以區域設定的替代表示形式寫入縮寫月份名稱 tm_mon
h
(C99)
b 的同義詞 tm_mon
B 寫入月份全稱名稱,例如 October(取決於區域設定) tm_mon
OB
(C23)
以區域設定的替代表示形式寫入適當的完整月份名稱 tm_mon
m 月份寫入為十進位制數字(範圍 [01,12] tm_mon
Om
(C99)
使用替代數字系統寫入月份,例如在 ja_JP 區域設定中是 十二 而不是 12 tm_mon
U 年份的週數寫入為十進位制數字(星期日是一週的第一天)(範圍 [00,53] tm_year, tm_wday, tm_yday
OU
(C99)
使用替代數字系統寫入年份的週數,如 %U 所定義,例如在 ja_JP 區域設定中是 五十二 而不是 52 tm_year, tm_wday, tm_yday
W 年份的週數寫入為十進位制數字(星期一是一週的第一天)(範圍 [00,53] tm_year, tm_wday, tm_yday
OW
(C99)
使用替代數字系統寫入年份的週數,如 %W 所定義,例如在 ja_JP 區域設定中是 五十二 而不是 52 tm_year, tm_wday, tm_yday
V
(C99)
寫入 ISO 8601 年份的週數(範圍 [01,53])。

在ISO 8601中,周以星期一開始,一年的第一週必須滿足以下要求

  • 包含1月4日
  • 包含一年中的第一個星期四
tm_year, tm_wday, tm_yday
OV
(C99)
使用替代數字系統寫入年份的週數,如 %V 所定義,例如在 ja_JP 區域設定中是 五十二 而不是 52 tm_year, tm_wday, tm_yday
年/月中的日
j 年份中的天數寫入為十進位制數字(範圍 [001,366] tm_yday
d 月份中的天數寫入為十進位制數字(範圍 [01,31] tm_mday
Od
(C99)
使用替代數字系統寫入基於零的月份中的天數,例如在 ja_JP 區域設定中是 二十七 而不是 27

單個字元前面有一個空格。

tm_mday
e
(C99)
月份中的天數寫入為十進位制數字(範圍 [1,31])。

單個數字前面有一個空格。

tm_mday
Oe
(C99)
使用替代數字系統寫入基於一的月份中的天數,例如在 ja_JP 區域設定中是 二十七 而不是 27

單個字元前面有一個空格。

tm_mday
星期幾
a 寫入星期幾縮寫名稱,例如 Fri(取決於區域設定) tm_wday
A 寫入星期幾全稱名稱,例如 Friday(取決於區域設定) tm_wday
w 星期幾寫入為十進位制數字,其中星期日是 0(範圍 [0-6] tm_wday
Ow
(C99)
使用替代數字系統寫入星期幾,其中星期日是 0,例如在 ja_JP 區域設定中是 二 而不是 2 tm_wday
u
(C99)
星期幾寫入為十進位制數字,其中星期一是 1(ISO 8601 格式)(範圍 [1-7] tm_wday
Ou
(C99)
使用替代數字系統寫入星期幾,其中星期一是 1,例如在 ja_JP 區域設定中是 二 而不是 2 tm_wday
時、分、秒
H 小時寫入為十進位制數字,24 小時制(範圍 [00-23] tm_hour
OH
(C99)
使用替代數字系統寫入 24 小時制小時,例如在 ja_JP 區域設定中是 十八 而不是 18 tm_hour
I 小時寫入為十進位制數字,12 小時制(範圍 [01,12] tm_hour
OI
(C99)
使用替代數字系統寫入 12 小時制小時,例如在 ja_JP 區域設定中是 六 而不是 06 tm_hour
M 分鐘寫入為十進位制數字(範圍 [00,59] tm_min
OM
(C99)
使用替代數字系統寫入分鐘,例如在 ja_JP 區域設定中是 二十五 而不是 25 tm_min
S 寫入為十進位制數字(範圍 [00,60] tm_sec
OS
(C99)
使用替代數字系統寫入,例如在 ja_JP 區域設定中是 二十四 而不是 24 tm_sec
其他
c 寫入標準日期和時間字串,例如 Sun Oct 17 04:41:13 2010(取決於區域設定) 所有
Ec
(C99)
寫入替代日期和時間字串,例如在 ja_JP 區域設定中使用 平成23年(Heisei 23 年)而不是 2011年 所有
x 寫入本地化日期表示(取決於區域設定) 所有
Ex
(C99)
寫入替代日期表示,例如在 ja_JP 區域設定中使用 平成23年(Heisei 23 年)而不是 2011年 所有
X 寫入本地化時間表示,例如 18:40:20 或 6:40:20 PM(取決於區域設定) 所有
EX
(C99)
寫入替代時間表示(取決於區域設定) 所有
D
(C99)
等價於 "%m/%d/%y" tm_mon, tm_mday, tm_year
F
(C99)
等價於 "%Y-%m-%d"(ISO 8601 日期格式) tm_mon, tm_mday, tm_year
r
(C99)
寫入本地化 12 小時制時間(取決於區域設定) tm_hour, tm_min, tm_sec
R
(C99)
等價於 "%H:%M" tm_hour, tm_min
T
(C99)
等價於 "%H:%M:%S"(ISO 8601 時間格式) tm_hour, tm_min, tm_sec
p 寫入本地化 a.m. 或 p.m.(取決於區域設定) tm_hour
z
(C99)
以 ISO 8601 格式寫入 UTC 偏移量(例如 -0430),如果時區資訊不可用則不寫入任何字元 tm_isdst
Z 寫入取決於區域設定的時區名稱或縮寫,如果時區資訊不可用則不寫入任何字元 tm_isdst

[編輯] 返回值

成功時,寫入到由 str 指向的字元陣列中的位元組數,不包括終止符 '\0'。如果在儲存整個字串之前達到 count,則返回 0,並且內容不確定。

[編輯] 示例

#include <locale.h>
#include <stdio.h>
#include <time.h>
 
int main(void)
{
    char buff[70];
    struct tm my_time = { .tm_year=112, // = year 2012
                          .tm_mon=9,    // = 10th month
                          .tm_mday=9,   // = 9th day
                          .tm_hour=8,   // = 8 hours
                          .tm_min=10,   // = 10 minutes
                          .tm_sec=20    // = 20 secs
    };
 
    if (strftime(buff, sizeof buff, "%A %c", &my_time))
        puts(buff);
    else
        puts("strftime failed");
 
    setlocale(LC_TIME, "el_GR.utf8");
 
    if (strftime(buff, sizeof buff, "%A %c", &my_time))
        puts(buff);
    else
        puts("strftime failed");
}

可能的輸出

Sunday Sun Oct  9 08:10:20 2012
Κυριακή Κυρ 09 Οκτ 2012 08:10:20 πμ EST

[編輯] 參考

  • C23 標準 (ISO/IEC 9899:2024)
  • 7.27.3.5 strftime 函式 (p: TBD)
  • C17 標準 (ISO/IEC 9899:2018)
  • 7.27.3.5 strftime 函式 (p: 288-291)
  • C11 標準 (ISO/IEC 9899:2011)
  • 7.27.3.5 strftime 函式 (p: 394-397)
  • C99 標準 (ISO/IEC 9899:1999)
  • 7.23.3.5 strftime 函式 (p: 343-347)
  • C89/C90 標準 (ISO/IEC 9899:1990)
  • 4.12.3.5 strftime 函式

[編輯] 另請參閱

(C23 中已廢棄)(C11)
tm 物件轉換為文字表示
(函式) [編輯]
(C23 中已廢棄)(C11)
time_t 物件轉換為文字表示形式
(函式) [編輯]
tm 物件轉換為自定義寬字串文字表示
(函式) [編輯]
C++ 文件,關於 strftime