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) |
解析指定格式的日期/时间值 (函数模板) |