std::formatter<std::chrono::month_day>
| 定義於標頭檔案 <chrono> |
||
| template< class CharT > struct formatter<std::chrono::month_day, CharT>; |
(C++20 起) | |
std::formatter 的特化,定義了 std::chrono::month_day 的格式化規則。
std::formatter 特化通常不直接訪問,而是透過格式化函式使用。
目錄 |
[編輯] 格式說明
格式規範的形式為
填充與對齊 (可選) 寬度 (可選) 精度 (可選) L(可選) 時間規範 (可選) |
|||||||||
填充與對齊、寬度和精度與標準格式說明中的含義相同。精度僅對錶示型別 Rep 為浮點型別的 std::chrono::duration 型別有效,否則丟擲 std::format_error。
用於格式化的區域設定確定如下:
- 如果格式規範中不存在
L,則使用預設的 "C" 區域設定, - 否則,如果傳遞給格式化函式,則使用 std::locale 所表示的區域設定,
- 否則(存在
L但沒有將 std::locale 傳遞給格式化函式),則使用全域性區域設定。
如果(普通或寬)字串字面量編碼是 Unicode 編碼形式,並且區域設定屬於實現定義的區域設定集合,則每個依賴於區域設定的替換都將執行,就像將替換字元序列轉換為字面量編碼一樣。
時間規範由一個或多個轉換說明符和普通字元(除了 {、} 和 %)組成。時間規範必須以轉換說明符開頭。所有普通字元都會不加修改地寫入輸出。每個未修改的轉換說明符以 % 字元開頭,後跟一個決定說明符行為的字元。一些轉換說明符具有修改形式,其中在 % 字元之後插入 E 或 O 修飾符字元。每個轉換說明符都按如下所述替換為輸出中的相應字元。
除非另有說明,如果 時間規範 為空,則時間物件將按照將其流式傳輸到型別為 std::basic_ostringstream<CharT> 的物件 os 的方式進行格式化,並使用格式化區域設定(std::locale::classic()、傳入的 std::locale 物件和 std::locale::global() 之一)進行設定,然後將 os.str() 複製到輸出緩衝區,並根據格式說明符進行額外的填充和調整。
以下格式說明符可用:
| 轉換 說明符 |
解釋 | |
|---|---|---|
%%
|
寫入字面量 % 字元。 | |
%n
|
寫入換行符。 | |
%t
|
寫入水平製表符。 | |
| 月 | ||
%b%h
|
寫入區域設定的縮寫月份名稱。 | |
%B
|
寫入區域設定的完整月份名稱。 | |
%m%Om
|
將月份作為十進位制數字寫入(一月為 01)。如果結果是一個數字,則在其前面加上 0。修改後的命令 | |
| 日 | ||
%d%Od
|
將月份中的日期作為十進位制數字寫入。如果結果是一個十進位制數字,則在其前面加上 0。 修改後的命令 | |
%e%Oe
|
將月份中的日期作為十進位制數字寫入。如果結果是一個十進位制數字,則在其前面加上一個空格。 修改後的命令 | |
以下說明符可識別,但會丟擲 std::format_error
| 轉換 說明符 |
解釋 | |
|---|---|---|
| 年 | ||
%C %EC
|
使用向下取整除法寫入年份除以 100 的結果。如果結果是一個十進位制數字,則在其前面加上 0。 修改後的命令 | |
%y %Oy %Ey
|
寫入年份的最後兩位十進位制數字。如果結果是一位數字,則在其前面加上 0。 修改後的命令 修改後的命令 | |
%Y %EY
|
將年份作為十進位制數字寫入。如果結果小於四位數字,則在其前面用 0 填充到四位數字。 修改後的命令 | |
| 星期幾 | ||
%a
|
寫入區域設定的縮寫工作日名稱。 | |
%A
|
寫入區域設定的完整工作日名稱。 | |
%u%Ou
|
將 ISO 工作日作為十進位制數字寫入 (1-7),其中星期一為 1。修改後的命令 | |
%w%Ow
|
將工作日作為十進位制數字寫入 (0-6),其中星期日為 0。修改後的命令 | |
| ISO 8601 基於周的年份 | ||
|
在ISO 8601中,周以星期一開始,一年的第一週必須滿足以下要求
| ||
%g
|
寫入 ISO 8601 基於周的年份的最後兩位十進位制數字。如果結果是一位數字,則在其前面加上 0。 | |
%G
|
將 ISO 8601 基於周的年份作為十進位制數字寫入。如果結果小於四位數字,則在其前面用 0 填充到四位數字。 | |
%V%OV
|
將 ISO 8601 年份的週數作為十進位制數字寫入。如果結果是一個數字,則在其前面加上 0。 修改後的命令 | |
| 年份中的周/天 | ||
%j
|
將年份中的日期作為十進位制數字寫入(1 月 1 日為 001)。如果結果小於三位數字,則在其前面用 0 填充到三位數字。 | |
%U%OU
|
將年份的週數作為十進位制數字寫入。年份的第一個星期日是第 01 周的第一天。在此之前的同年日期屬於第 00 周。如果結果是一個數字,則在其前面加上 0。 修改後的命令 | |
%W%OW
|
將年份的週數作為十進位制數字寫入。年份的第一個星期一是第 01 周的第一天。在此之前的同年日期屬於第 00 周。如果結果是一個數字,則在其前面加上 0。 修改後的命令 | |
| 日期 | ||
%D
|
等效於"%m/%d/%y"。 | |
%F
|
等同於 "%Y-%m-%d"。 | |
%x%Ex
|
寫入區域設定的日期表示。 修改後的命令 | |
| 日間時間 | ||
%H%OH
|
將小時(24 小時制)作為十進位制數字寫入。如果結果是一個數字,則在其前面加上 0。 修改後的命令 | |
%I%OI
|
將小時(12 小時制)作為十進位制數字寫入。如果結果是一個數字,則在其前面加上 0。 修改後的命令 | |
%M%OM
|
將分鐘作為十進位制數字寫入。如果結果是一個數字,則在其前面加上 0。 修改後的命令 | |
%S%OS
|
將秒作為十進位制數字寫入。如果秒數小於 10,則結果前面加上 0。 如果輸入的精度不能精確表示為秒,則格式為固定格式的十進位制浮點數,精度與輸入精度匹配(如果轉換為浮點十進位制秒不能在18個小數位內完成,則為微秒精度)。小數點字元根據區域設定進行本地化。 修改後的命令 | |
%p
|
寫入區域設定中與 12 小時制相關聯的 AM/PM 表示。 | |
%R
|
等效於"%H:%M"。 | |
%T
|
等效於"%H:%M:%S"。 | |
%r
|
寫入區域設定的 12 小時制時間。 | |
%X%EX
|
寫入區域設定的時間表示。 修改後的命令 | |
| 持續時間計數 | ||
%Q
|
寫入持續時間的滴答計數,即透過 count() 獲得的值。 | |
%q
|
寫入持續時間的單位字尾,如 operator<<() 中指定。 | |
| 時區 | ||
%z%Ez%Oz
|
以 ISO 8601 格式寫入與 UTC 的偏移量。例如 -0430 表示比 UTC 晚 4 小時 30 分鐘。如果偏移量為零,則使用 +0000。修改後的命令 | |
%Z
|
寫入時區縮寫。 | |
| 雜項 | ||
%c%Ec
|
寫入區域設定的日期和時間表示。 修改後的命令 | |
[編輯] 示例
#include <chrono> #include <format> #include <iostream> int main() { using namespace std::chrono_literals; constexpr std::chrono::month_day md{std::chrono::February / 29d}; std::cout << "%B: " << std::format("{:%B}", md) << '\n' << "%d: " << std::format("{:%d}", md) << '\n'; }
輸出
%B: February %d: 29
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
|---|---|---|---|
| P2372R3 | C++20 | formatter 使用全域性區域設定或傳入的區域設定 |
當 L 不存在時使用預設 "C" 區域設定 |
[編輯] 參閱
| (C++20) |
將引數的格式化表示儲存在新字串中 (函式模板) |