Namespaces
Variants

std:: get_time

From cppreference.net
< cpp ‎ | io ‎ | manip
定义于头文件 <iomanip>
template < class CharT >
/*unspecified*/ get_time ( std:: tm * tmb, const CharT * fmt ) ;
(C++11 起)

当在表达式 in >> get_time ( tmb, fmt ) 中使用时,根据格式字符串 fmt ,按照当前输入流 in 所植入区域设置的 std::time_get facet 来解析字符输入为日期/时间值。结果值存储在由 tmb 指向的 std::tm 对象中。

目录

参数

tmb - 指向 std::tm 对象的有效指针,结果将存储于此
fmt - 指向以空字符结尾的 CharT 字符串的指针,指定转换格式

格式字符串由零个或多个转换说明符、空白字符和普通字符(除 % 外)组成。每个普通字符需在大小写不敏感比较中与输入流中的一个字符匹配。每个空白字符匹配输入字符串中的任意空白。每个转换说明以 % 字符开始,可选地后跟 E O 修饰符(如果区域设置不支持则忽略),然后是决定说明符行为的字符。格式说明符与 POSIX 函数 strptime() 匹配:

转换
说明符
说明 写入字段
% 匹配字面量 % 。完整转换说明必须为 %% (无)
t 匹配任意空白 (无)
n 匹配任意空白 (无)
年份
Y 将完整 年份 解析为4位十进制数,允许但不要求前导零 tm_year
EY 解析替代表示法中的 年份 ,例如在 ja_JP 区域设置中解析“平成23年”会将 2011 写入 tm_year tm_year
y 年份 的最后2位解析为十进制数。范围 [69,99] 对应 1969 至 1999,范围 [00,68] 对应 2000-2068 tm_year
Oy 使用替代数字系统解析 年份 的最后2位,例如在 ja_JP 区域设置中“十一”解析为 11 tm_year
Ey 年份 解析为相对于区域设置替代日历周期 %EC 的偏移量 tm_year
C 年份 的前2位解析为十进制数(范围 [00,99] tm_year
EC 解析区域设置替代表示法中的基准年(周期)名称,例如 ja_JP 中的“平成” tm_year
月份
b 解析月份名称,完整或缩写形式,例如 Oct tm_mon
h b 的同义词 tm_mon
B b 的同义词 tm_mon
m 月份 解析为十进制数(范围 [01,12] ),允许但不要求前导零 tm_mon
Om 使用替代数字系统解析 月份 ,例如在 ja_JP 区域设置中“十二”解析为 12 tm_mon
U 年份中的周 解析为十进制数(周日为一周的第一天)(范围 [00,53] ),允许但不要求前导零 tm_year , tm_wday , tm_yday
OU 使用替代数字系统解析 年份中的周 ,同 %U ,例如在 ja_JP 区域设置中“五十二”解析为 52 tm_year , tm_wday , tm_yday
W 年份中的周 解析为十进制数(周一为一周的第一天)(范围 [00,53] ),允许但不要求前导零 tm_year , tm_wday , tm_yday
OW 使用替代数字系统解析 年份中的周 ,同 %W ,例如在 ja_JP 区域设置中“五十二”解析为 52 tm_year , tm_wday , tm_yday
年/月中的日
j 年中的日 解析为十进制数(范围 [001,366] ),允许但不要求前导零 tm_yday
d 月中的日 解析为十进制数(范围 [01,31] ),允许但不要求前导零 tm_mday
Od 使用替代数字系统解析 月中的日 ,例如在 ja_JP 区域设置中“二十七”解析为 27,允许但不要求前导零 tm_mday
e d 的同义词 tm_mday
Oe Od 的同义词 tm_mday
星期几
a 解析星期几的名称,完整或缩写形式,例如 Fri tm_wday
A a 的同义词 tm_wday
w 星期几 解析为十进制数,其中周日为 0 (范围 [0-6] tm_wday
Ow 使用替代数字系统将 星期几 解析为十进制数,其中周日为 0 ,例如在 ja_JP 区域设置中“二”解析为 2 tm_wday
时、分、秒
H 小时 解析为十进制数,24小时制(范围 [00-23] ),允许但不要求前导零 tm_hour
OH 使用替代数字系统解析24小时制的 小时 ,例如在 ja_JP 区域设置中“十八”解析为 18 tm_hour
I 小时 解析为十进制数,12小时制(范围 [01,12] ),允许但不要求前导零 tm_hour
OI 使用替代数字系统解析12小时制的 小时 ,例如在 ja_JP 区域设置中“六”解析为 06 tm_hour
M 分钟 解析为十进制数(范围 [00,59] ),允许但不要求前导零 tm_min
OM 使用替代数字系统解析 分钟 ,例如在 ja_JP 区域设置中“二十五”解析为 25 tm_min
S 解析为十进制数(范围 [00,60] ),允许但不要求前导零 tm_sec
OS 使用替代数字系统解析 ,例如在 ja_JP 区域设置中“二十四”解析为 24 tm_sec
其他
c 解析区域设置的标准日期时间字符串格式,例如 Sun Oct 17 04:41:13 2010 (取决于区域设置) 全部
Ec 解析区域设置的替代日期时间字符串格式,例如在 ja_JP 区域设置中期望“平成23年”而非“2011年” 全部
x 解析区域设置的标准日期表示 全部
Ex 解析区域设置的替代日期表示,例如在 ja_JP 区域设置中期望“平成23年”而非“2011年” 全部
X 解析区域设置的标准时间表示 全部
EX 解析区域设置的替代时间表示 全部
D 等价于 "%m / %d / %y " tm_mon , tm_mday , tm_year
r 解析区域设置的标准12小时制时间(在 POSIX 中为 "%I : %M : %S %p" tm_hour , tm_min , tm_sec
R 等价于 "%H : %M" tm_hour , tm_min
T 等价于 "%H : %M : %S" tm_hour , tm_min , tm_sec
p 解析区域设置对应的 上午/下午 标识 tm_hour

注意: tm_isdst 不会被写入,需要显式设置以供 mktime 等函数使用


返回值

一个未指定类型的对象,使得

  • 如果 in 是类型为 std:: basic_istream < CharT, Traits > 的对象,则表达式 in >> get_time ( tmb, fmt )
    • 具有类型 std:: basic_istream < CharT, Traits > &
    • 具有值 in
    • 行为表现如同调用了 f ( in, tmb, fmt )

其中函数 f 定义为:

template<class CharT, class Traits>
void f(std::basic_ios<CharT, Traits>& str, std::tm* tmb, const CharT* fmt)
{
    using Iter = std::istreambuf_iterator<CharT, Traits>;
    using TimeGet = time_get<CharT, Iter>;
    std::ios_base::iostate err = std::ios_base::goodbit;
    const TimeGet& tg = std::use_facet<TimeGet>(str.getloc());
    tg.get(Iter(str.rdbuf()), Iter(), str, err, tmb,
        fmt, fmt + Traits::length(fmt));
    if (err != std::ios_base::goodbit)
        str.setstate(err);
}

注释

std::time_get::do_get 所规定(此函数会调用该函数),对于未通过 fmt 中直接设置的转换说明符对应的 * tmb 字段,此函数是否将其清零是未指定的:可移植程序应在调用 std::get_time 前将 * tmb 的所有字段初始化为零。

示例

注意:请选择 clang 或 gcc >= 12.1 来观察输出。12.1 之前的 libstdc++ 未能正确实现 % b 格式说明符: 错误 #78714

#include <iomanip>
#include <iostream>
#include <locale>
#include <sstream>
int main()
{
    std::tm t = {};
    std::istringstream ss("2011-Februar-18 23:12:34");
    ss.imbue(std::locale("de_DE.utf-8"));
    ss >> std::get_time(&t, "%Y-%b-%d %H:%M:%S");
    if (ss.fail())
        std::cout << "Parse failed\n";
    else
        std::cout << std::put_time(&t, "%c") << '\n';
}

可能的输出:

Sun Feb 18 23:12:34 2011

参见

从输入字符序列解析时间/日期值到 std::tm
(类模板)
(C++11)
根据指定格式格式化并输出日期/时间值
(函数模板)
(C++20)
从流中解析 chrono 对象
(函数模板)