std::formatter<std::chrono::tai_time>
定義於標頭檔案 <chrono> |
||
template< class Duration, class CharT > struct formatter<std::chrono::tai_time<Duration>, CharT>; |
(C++20 起) | |
該 std::formatter 特化定義了 std::chrono::tai_time 的格式化規則。
- 如果使用了
%Z
,它將被替換為擴充套件到CharT
的 "TAI"。 - 如果使用了
%z
或其變體,將格式化一個0min
的偏移量。 - 格式化的日期和時間等同於使用 std::chrono::sys_time<Duration>(tp.time_since_epoch()) - std::chrono::days(4383) 初始化的 std::chrono::sys_time 的格式化結果。
std::formatter 特化通常不直接訪問,而是透過 格式化函式 使用。
目錄 |
[編輯] 格式規範
格式規範的形式為
填充和對齊 (可選) 寬度 (可選) 精度 (可選) L (可選) chrono-spec (可選) |
|||||||||
填充和對齊、寬度 和 精度 的含義與 標準格式規範 相同。精度 僅對錶示型別 Rep
是浮點型別的 std::chrono::duration 型別有效,否則將丟擲 std::format_error。
用於格式化的區域設定確定如下:
- 如果格式規範中不存在
L
,則使用預設的 "C" 區域設定, - 否則,如果傳遞給格式化函式,則使用 std::locale 所表示的區域設定,
- 否則(存在
L
但沒有將 std::locale 傳遞給格式化函式),則使用全域性區域設定。
如果(普通或寬)字串字面量編碼是 Unicode 編碼形式,並且區域設定屬於實現定義的區域設定集合中的一個,則每個依賴於區域設定的替換都將執行,就像替換字元序列已轉換為字面量編碼一樣。
chrono-spec 由一個或多個轉換說明符和普通字元(除了 {
、}
和 %
)組成。chrono-spec 必須以轉換說明符開頭。所有普通字元都原樣寫入輸出。每個未修改的轉換說明符以 %
字元開頭,後跟一個確定說明符行為的字元。某些轉換說明符具有修改形式,其中在 %
字元後插入 E
或 O
修飾符字元。每個轉換說明符都將替換為輸出中適當的字元,如下所述。
除非另有說明,如果 chrono-spec 為空,則 chrono 物件將被格式化,就像將其流式傳輸到型別為 std::basic_ostringstream<CharT> 的物件 os
中,並使用格式化區域設定(std::locale::classic()、傳入的 std::locale 物件和 std::locale::global() 之一)填充,然後將 os.str() 複製到輸出緩衝區,並根據格式說明符進行額外的填充和調整。
以下格式說明符可用:
轉換 說明符 |
解釋 | |
---|---|---|
%%
|
寫入字面量 % 字元。 | |
%n
|
寫入換行符。 | |
%t
|
寫入水平製表符。 | |
年 | ||
%C %EC
|
使用向下取整除法寫入年份除以 100 的結果。如果結果是一個十進位制數字,則在其前面加上 0。 修改後的命令 | |
%y %Oy %Ey
|
寫入年份的最後兩位十進位制數字。如果結果是一位數字,則在其前面加上 0。 修改後的命令 修改後的命令 | |
%Y %EY
|
將年份作為十進位制數字寫入。如果結果小於四位數字,則在其前面用 0 填充到四位數字。 修改後的命令 | |
月 | ||
%b %h
|
寫入區域設定的縮寫月份名稱。 | |
%B
|
寫入區域設定的完整月份名稱。 | |
%m %Om
|
將月份作為十進位制數字寫入(一月為 01 )。如果結果是一個數字,則在其前面加上 0。修改後的命令 | |
日 | ||
%d %Od
|
將月份中的日期作為十進位制數字寫入。如果結果是一個十進位制數字,則在其前面加上 0。 修改後的命令 | |
%e %Oe
|
將月份中的日期作為十進位制數字寫入。如果結果是一個十進位制數字,則在其前面加上一個空格。 修改後的命令 | |
星期幾 | ||
%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
|
寫入區域設定的時間表示。 修改後的命令
| |
時區 | ||
%z %Ez %Oz
|
以 ISO 8601 格式寫入與 UTC 的偏移量。例如 -0430 表示比 UTC 晚 4 小時 30 分鐘。如果偏移量為零,則使用 +0000 。修改後的命令 | |
%Z
|
寫入時區縮寫。 | |
雜項 | ||
%c %Ec
|
寫入區域設定的日期和時間表示。 修改後的命令 |
以下說明符可識別,但會丟擲 std::format_error
轉換 說明符 |
解釋 | |
---|---|---|
持續時間計數 | ||
%Q
|
寫入持續時間的滴答計數,即透過 count() 獲得的值。 | |
%q
|
寫入持續時間的單位字尾,如 operator<<() 中指定。 |
[編輯] 示例
#include <chrono> #include <format> #include <iostream> int main() { std::chrono::time_point<std::chrono::utc_clock> epoch; std::cout << std::format("The time of the Unix epoch was {0:%F}T{0:%R%z}.", epoch) << '\n'; }
輸出
The time of the Unix epoch was 1970-01-01T00:00+0000.
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
P2372R3 | C++20 | formatter 使用全域性區域設定或傳入的區域設定 |
當 L 不存在時,使用預設的 "C" 區域設定 |
[編輯] 另請參閱
(C++20) |
將引數的格式化表示儲存在新字串中 (函式模板) |