名稱空間
變體
操作

std::time_put<CharT,OutputIt>::put, std::time_put<CharT,OutputIt>::do_put

來自 cppreference.com
 
 
 
 
std::time_put
成員函式
time_put::puttime_put::do_put
 
定義於標頭檔案 <locale>
public:

iter_type put( iter_type out, std::ios_base& str,
               char_type fill, const std::tm* t,

               const CharT* fmtbeg, const CharT* fmtend ) const;
(1)
public:

iter_type put( iter_type out, std::ios_base& str,
               char_type fill, const std::tm* t,

               char format, char modifier = 0 ) const;
(2)
protected:

virtual iter_type do_put( iter_type out, std::ios_base& str,
                          char_type fill, const std::tm* t,

                          char format, char modifier ) const;
(3)

根據 格式字串 [fmtbeg, fmtend),將儲存在 std::tm 物件(由 t 指向)中的日曆日期和時間轉換為字串。格式字串與 std::strftime 使用的相同,但每個格式說明符都透過對 do_put() 的單獨呼叫進行處理,這可以透過擴充套件此 facet 來定製。

1) 遍歷字元序列 [fmtbeg, fmtend),檢查字元。每個不屬於格式序列的字元都會立即寫入輸出迭代器 out。為了識別格式序列,此函式將 [fmtbeg, fmtend) 中的下一個字元 c 窄化,就像透過 std::ctype<char_type>(str.getloc()).narrow(c, 0) 一樣,如果它等於 '%',則將接下來的一到兩個字元與 std::strftime 識別的格式序列列表以及此區域設定支援的任何其他實現定義的格式進行比較。對於每個有效的格式序列,都會呼叫 do_put(out, str, fill, t, format, modifier),其中 format 是格式序列字元,modifier 是可選的格式序列修飾符('E''O')。如果修飾符不存在,則使用 '\0' 的值。
2) 呼叫最派生類的 do_put 成員函式。
3) 將儲存在 std::tm 物件(由 t 指向)中的日曆日期和時間轉換為字串,根據由連線 '%'modifier(如果不是 '\0')的值和 format 的值組成的格式轉換序列。格式的解釋方式與函式 std::strftime 相同,但描述為與區域設定相關的格式由當前區域設定定義,並且可能支援額外的格式說明符(為這些實現定義的格式說明符提供了 fill 引數)。字串寫入輸出迭代器 out

目錄

[編輯] 引數

out - 寫入轉換結果的輸出迭代器
str - 此函式在需要時用於獲取區域設定 facet 的流物件,例如 std::ctype 來窄化字元
t - 指向 std::tm 物件的指標,從中獲取日期/時間值
fmtbeg - 指向指定 轉換格式char_type 字元序列的第一個字元的指標
fmtend - 指向指定 轉換格式char_type 字元序列的最後一個字元之後的一個位置的指標
fill - 填充字元(通常為空格)
format - 命名 轉換說明符 的字元
modifier - 可能出現在 %轉換說明符 之間的可選修飾符

[編輯] 格式字串

格式字串由零個或多個轉換說明符和普通字元(除了 %)組成。所有普通字元,包括終止空字元,都將不加修改地複製到輸出字串中。每個轉換規範以 % 字元開頭,可選地後跟 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

[編輯] 返回值

指向所生成字串最後一個字元之後一個位置的迭代器。

[編輯] 注意

不提供錯誤處理。

提供 fill 字元是為了那些實現定義的格式說明符,以及使用填充邏輯的使用者定義的 do_put() 過載。此類實現通常利用 str 中的格式化標誌。

[編輯] 示例

#include <iostream>
#include <sstream>
#include <iomanip>
#include <ctime>
 
void try_time_put(const std::tm* t, const std::string& fmt)
{
    std::cout.imbue(std::locale());
    std::cout << "In the locale '" << std::cout.getloc().name() << "' : '";
 
    std::use_facet<std::time_put<char>>(std::cout.getloc()).put(
        {std::cout}, std::cout, ' ', t, &fmt[0], &fmt[0] + fmt.size());
 
    std::cout << "'\n";
}
 
int main()
{
    std::time_t t = std::time(NULL);
    std::tm tm = *std::localtime(&t);
 
    std::string fmt = "%c";
    std::cout << "Using the format string '" << fmt
              << "' to format the time: " << std::ctime(&t) << '\n';
 
    std::locale::global(std::locale("de_DE.utf8"));
    try_time_put(&tm, fmt);
 
    std::locale::global(std::locale("el_GR.utf8"));
    try_time_put(&tm, fmt);
 
    std::locale::global(std::locale("ja_JP.utf8"));
    try_time_put(&tm, fmt);
}

可能的輸出

Using the format string '%c' to format the time: Mon Feb 11 22:58:50 2013
 
In the locale 'de_DE.utf8' : 'Mo 11 Feb 2013 23:02:38 EST'
In the locale 'el_GR.utf8' : 'Δευ 11 Φεβ 2013 11:02:38 μμ EST'
In the locale 'ja_JP.utf8' : '2013年02月11日 23時02分38秒'

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 164 C++98 引數 fill 的目的不明確 已明確

[編輯] 另請參閱

(C++11)
根據指定格式格式化並輸出日期/時間值
(函式模板) [編輯]
[virtual] (C++11)
根據指定格式從輸入流中提取日期/時間元件
(std::time_get<CharT,InputIt> 的虛保護成員函式) [編輯]