名稱空間
變體
操作

std::put_time

來自 cppreference.com
< cpp‎ | io‎ | 操縱器
 
 
 
輸入/輸出操縱器
浮點格式化
整數格式化
布林格式化
欄位寬度和填充控制
其他格式化
空白字元處理
輸出重新整理
(C++20)  

狀態標誌操作
時間與金錢 I/O
(C++11)
(C++11)
(C++11)
put_time
(C++11)
帶引號的操縱器
(C++14)
 
定義於標頭檔案 <iomanip>
template< class CharT >
/*unspecified*/ put_time( const std::tm* tmb, const CharT* fmt );
(C++11 起)

當在表示式 out << put_time(tmb, fmt) 中使用時,根據輸出流 out 中當前嵌入的 std::time_put 面(facet),透過呼叫 std::strftimestd::wcsftime 或其類似函式(取決於 CharT),將給定日曆時間 tmb 中的日期和時間資訊按照格式字串 fmt 轉換為字元字串。

目錄

[編輯] 引數

tmb - 指向從 std::localtimestd::gmtime 獲取的日曆時間結構體
fmt - 指向一個指定轉換格式的空終止 CharT 字串

[編輯] 格式字串

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[編輯] 返回值

一個未指定型別的物件,使得

  • 如果 outstd::basic_ostream<CharT, Traits> 型別,表示式 out << put_time(tmb, fmt)
    • 具有型別 std::basic_ostream<CharT, Traits>&
    • 值為 out
    • 其行為如同呼叫了 f(out, tmb, fmt)

其中函式 f 定義為

template<class CharT, class Traits>
void f(std::basic_ios<CharT, Traits>& str, const std::tm* tmb, const CharT* fmt)
{
    using Iter = std::ostreambuf_iterator<CharT, Traits>;
    using TimePut = std::time_put<CharT, Iter>;
 
    const TimePut& tp = std::use_facet<TimePut>(str.getloc());
    const Iter end = tp.put(Iter(str.rdbuf()), str, str.fill(), tmb,
        fmt, fmt + Traits::length(fmt));
 
    if (end.failed())
        str.setstate(std::ios_base::badbit);
}

[編輯] 示例

#include <ctime>
#include <iomanip>
#include <iostream>
 
int main()
{
    std::time_t t = std::time(nullptr);
    std::tm tm = *std::localtime(&t);
 
    std::cout.imbue(std::locale("ru_RU.utf8"));
    std::cout << "ru_RU: " << std::put_time(&tm, "%c %Z") << '\n';
 
    std::cout.imbue(std::locale("ja_JP.utf8"));
    std::cout << "ja_JP: " << std::put_time(&tm, "%c %Z") << '\n';
}

可能的輸出

ru_RU: Ср. 28 дек. 2011 10:21:16 EST
ja_JP: 2011年12月28日 10時21分16秒 EST

[編輯] 參閱

std::tm 的內容格式化為字元序列輸出
(類模板) [編輯]
(C++11)
解析指定格式的日期/時間值
(函式模板) [編輯]
std::tm 物件轉換為自定義文字表示
(函式) [編輯]
std::tm 物件轉換為自定義寬字串文字表示
(函式) [編輯]