std::chrono::parse
| 定義於標頭檔案 <chrono> |
||
| template< class CharT, class Parsable > /* 未指定 */ parse( const CharT* fmt, Parsable& tp ); |
(1) | (C++20 起) |
| template< class CharT, class Traits, class Alloc, class Parsable > /* 未指定 */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt, |
(2) | (C++20 起) |
| template< class CharT, class Traits, class Alloc, class Parsable > /* 未指定 */ parse( const CharT* fmt, Parsable& tp, |
(3) | (C++20 起) |
| template< class CharT, class Traits, class Alloc, class Parsable > /* 未指定 */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt, |
(4) | (C++20 起) |
| template< class CharT, class Parsable > /* 未指定 */ parse( const CharT* fmt, Parsable& tp, |
(5) | (C++20 起) |
| template< class CharT, class Traits, class Alloc, class Parsable > /* 未指定 */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt, |
(6) | (C++20 起) |
| template< class CharT, class Traits, class Alloc, class Parsable > /* 未指定 */ parse( const CharT* fmt, Parsable& tp, |
(7) | (C++20 起) |
| template< class CharT, class Traits, class Alloc, class Parsable > /* 未指定 */ parse( const std::basic_string<CharT, Traits, Alloc>& fmt, |
(8) | (C++20 起) |
返回一個未指定型別的物件manip,使得給定一個std::basic_istream<CharT, Traits>物件is,表示式is >> manip呼叫from_stream(無限定,以啟用引數依賴查詢),如下所示
static_cast<std::basic_string<CharT, Traits, Alloc>*>(nullptr), &offset)
static_cast<std::basic_string<CharT, Traits, Alloc>*>(nullptr), &offset)
表示式is >> manip是型別為std::basic_istream<CharT, Traits>的左值,其值為is。
這些過載只有在相應的from_stream表示式格式良好時才參與過載決議。
建議實現者使得難以使用可能懸空的格式字串引用,例如,透過使返回型別不可移動並阻止operator>>接受返回型別的左值。
目錄 |
[編輯] 引數
| fmt | - | 格式字串(見下文) |
| tp | - | 用於儲存解析結果的物件 |
| abbrev | - | 用於儲存與%Z說明符對應時區縮寫或名稱的字串 |
| offset | - | 表示與%z說明符對應的UTC偏移量的持續時間 |
[編輯] 格式字串
格式字串由零個或多個轉換說明符和普通字元組成。每個普通字元,除了空白字元和終止空字元,都與輸入流中的一個相同字元匹配;如果流中的下一個字元不相等,則會導致函式失敗。
每個空白字元匹配輸入流中的零個或多個空白字元。
每個未修改的轉換說明符以%字元開頭,後跟一個決定說明符行為的字元。一些轉換說明符具有修改形式,其中在%字元後插入一個E或O修飾符字元。一些轉換說明符具有修改形式,其中在%字元後插入一個正十進位制整數(如下所示為N)形式的寬度引數。每個轉換說明符導致匹配的字元根據下表被解釋為日期和時間型別的一部分。
格式字串中以%開頭但與下面任一轉換說明符不匹配的字元序列被解釋為普通字元。
如果from_stream未能解析格式字串指定的所有內容,或者解析的資訊不足以指定完整結果,或者解析結果存在矛盾,則會呼叫is.setstate(std::ios_base::failbit)。
以下轉換說明符可用
| 轉換 說明符 |
解釋 | |
|---|---|---|
%%
|
匹配字面值%字元。 | |
%n
|
匹配一個空白字元。 | |
%t
|
匹配零個或一個空白字元。 | |
| 年 | ||
%C %NC %EC
|
將世紀解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%y %Ny %Ey %Oy
|
解析年份的最後兩位十進位制數字。如果未另外指定世紀(例如使用%C),則範圍[69, 99]中的值假定指1969年至1999年,範圍[00, 68]中的值假定指2000年至2068年。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%Y %NY %EY
|
將年份解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為4。允許但不要求前導零。 修改後的命令 | |
| 月 | ||
%b%B%h
|
解析區域設定的完整或縮寫的不區分大小寫的月份名稱。 | |
%m%Nm%Om
|
將月份解析為十進位制數(一月為1)。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。修改後的命令 | |
| 日 | ||
%d%Nd%Od%e%Ne%Oe
|
將月份中的日期解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
| 星期幾 | ||
%a%A
|
解析區域設定的完整或縮寫的不區分大小寫的星期幾名稱。 | |
%u%Nu
|
將ISO星期幾解析為十進位制數(1-7),其中星期一為1。寬度N指定要讀取的最大字元數。預設寬度為1。允許但不要求前導零。 | |
%w%Nw%Ow
|
將星期幾解析為十進位制數(0-6),其中星期日為0。寬度N指定要讀取的最大字元數。預設寬度為1。允許但不要求前導零。修改後的命令 | |
| ISO 8601 基於周的年份 | ||
|
在ISO 8601中,周以星期一開始,一年的第一週必須滿足以下要求
| ||
%g%Ng
|
解析ISO 8601 基於周的年份的最後兩位十進位制數字。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 | |
%G%NG
|
將ISO 8601 基於周的年份解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為4。允許但不要求前導零。 | |
%V%NV
|
將ISO 8601 年份中的周解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 | |
| 年份中的周/天 | ||
%j%Nj
|
將年份中的日期解析為十進位制數(1月1日為1)。寬度N指定要讀取的最大字元數。預設寬度為3。允許但不要求前導零。 | |
%U%NU%OU
|
將年份中的週數解析為十進位制數。一年中的第一個星期日是第01周的第一天。在此之前的同年日期在第00周。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%W%NW%OW
|
將年份中的週數解析為十進位制數。一年中的第一個星期一是第01周的第一天。在此之前的同年日期在第00周。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
| 日期 | ||
%D
|
等效於"%m/%d/%y"。 | |
%F%NF
|
等效於"%Y-%m-%d"。如果指定了寬度,則僅應用於%Y。 | |
%x%Ex
|
解析區域設定的日期表示。 修改後的命令 | |
| 日間時間 | ||
%H%NH%OH
|
將小時(24小時制)解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%I%NI%OI
|
將小時(12小時制)解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%M%NM%OM
|
將分鐘解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%S%NS%OS
|
將秒解析為十進位制數。寬度N指定要讀取的最大字元數。預設寬度為2。允許但不要求前導零。 修改後的命令 | |
%p
|
解析區域設定的12小時制時鐘相關的AM/PM指示符的等效項。 | |
%R
|
等效於"%H:%M"。 | |
%T
|
等效於"%H:%M:%S"。 | |
%r
|
解析區域設定的12小時制時間。 | |
%X%EX
|
解析區域設定的時間表示。 修改後的命令 | |
| 雜項 | ||
%c%Ec
|
解析區域設定的日期和時間表示。 修改後的命令 | |
%z%Ez%Oz
|
解析UTC偏移量,格式為[+|-]hh[mm]。例如,-0430表示比UTC晚4小時30分鐘,04表示比UTC早4小時。修改後的命令 | |
%Z
|
解析時區縮寫或名稱,取字元A到Z、a到z、0到9、-、+、_和/組成的最長字元序列。 | |
[編輯] 示例
#include <chrono> #include <iostream> #include <locale> #include <sstream> int main() { auto parse = [&](auto str, auto fmt, auto o) { std::istringstream is{str}; is.imbue(std::locale("en_US.utf-8")); is >> std::chrono::parse(fmt, o); is.fail() ? std::cout << "Parse failed!\n" : std::cout << o << '\n'; }; parse("01:02:03", "%H:%M:%S", std::chrono::hours{}); parse("01:02:03", "%H:%M:%S", std::chrono::minutes{}); parse("01:02:03", "%H:%M:%S", std::chrono::seconds{}); }
可能的輸出
1h 62min 3723s
[編輯] 缺陷報告
下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。
| 缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
|---|---|---|---|
| LWG 3554 | C++20 | 缺少普通空終止字元型別序列的過載 | 已新增 |
[編輯] 另請參閱
根據提供的格式從流中解析 sys_time(函式模板) | |
根據提供的格式從流中解析 utc_time(函式模板) | |
根據提供的格式從流中解析 tai_time(函式模板) | |
根據提供的格式從流中解析 gps_time(函式模板) | |
根據提供的格式從流中解析 file_time(函式模板) | |
根據提供的格式從流中解析 local_time(函式模板) | |
| (C++20) |
根據提供的格式從流中解析 year(函式模板) |
| (C++20) |
根據提供的格式從流中解析 month(函式模板) |
| (C++20) |
根據提供的格式從流中解析 day(函式模板) |
| (C++20) |
根據提供的格式從流中解析 weekday(函式模板) |
| (C++20) |
根據提供的格式從流中解析 month_day(函式模板) |
| (C++20) |
根據提供的格式從流中解析 year_month(函式模板) |
| (C++20) |
根據提供的格式從流中解析 year_month_day(函式模板) |
| (C++11) |
解析指定格式的日期/時間值 (函式模板) |