c++11 标准模板(STL)本地化库 - 平面类别(time_get) - 从输入字符序列中解析时间/日期值到 std::tm 中(八)

本地化库

本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。

平面类别

从输入字符序列中解析时间/日期值到 std::tm 中

std::time_get
template<

    class CharT,
    class InputIt = std::istreambuf_iterator<CharT>

> class time_get;

类模板 std::time_get 封装日期和时间分析规则。 I/O 操纵符 std::get_time 用 I/O 流的 locale 的 std::time_get 平面转换文本输入为 std::tm 对象。

继承图

类型要求

- InputIt 必须满足遗留输入迭代器 (LegacyInputIterator) 的要求。

特化

标准库提供二个孤立(独立于本地环境的)全特化和二个部分特化:

定义于头文件 <locale>

std::time_get<char>分析日期和时间的窄字符串表示
std::time_get<wchar_t>分析日期和时间的宽字符串表示
std::time_get<char, InputIt>用定制输入迭代器分析日期和时间的窄字符串表示
std::time_get<wchar_t, InputIt>用定制输入迭代器分析日期和时间的宽字符串表示

另外, C++ 程序中构造的每个 locale 对象都实装这些特化的其自身(本地环境限定)版本。

成员类型

成员类型定义
char_typeCharT
iter_typeInputIt

调用 do_get & 从输入流释出日期/时间组分,按照指定格式

std::time_get<CharT,InputIt>::get, 
std::time_get<CharT,InputIt>::do_get
public:

iter_type get(iter_type beg, iter_type end, std::ios_base& str,
              std::ios_base::iostate& err, std::tm* t,

              const char_type* fmtbeg, const char_type* fmtend) const;
(1)(C++11 起)
protected:

virtual iter_type do_get(iter_type beg, iter_type end, std::ios_base& str,
                         std::ios_base::iostate& err, std::tm *t,

                         char format, char modifier) const;
(2)(C++11 起)

1) 按照字符序列 [fmtbeg, fmtend) 中提供的格式,从输入字符序列 [beg, end) 分析日期和时间。期待格式遵循描述于下的格式,尽管能通过覆写 do_get 定制每个格式指定符的实际处理。 get 函数进行下列内容: 首先,通过执行 err = std::ios_base::goodbit 清除 err 中的错误位。然后进入循环,凡在任何下列条件变为真时循环终止(以此顺序检查):

a) 已从格式字符串读取全部字符( fmtbeg == fmtend )

b) 有分析错误( err != std::ios_base::goodbit )

c) 已从输入序列读取全部字符( beg == end )。若此条件终止循环,则函数于 err 中一同设置 eofbitfailbit

循环体中,发生下列步骤:

a) 若格式字符串中的下个字符为 '%' ,后随一或二个组成合法 std::get_time 转换指定符的字符(见下方),则将这些字符用于调用 do_get(beg, end, str, err, t, format, modifier) ,其中 format 为初等转换指定符字符,而 modifier 为可选的修饰符(若存在,则出现于 % 和格式字符间)。若无修饰符,则使用值 '\0' 。若格式字符串有歧义,或过早结束而无以确定 '%' 后的转换指定符,则在 err 中设置 eofbit 并终止循环。若调用 do_geterr 中未设置错误位,则函数增加 fmtbeg 到正好指向转换指定符之后,并持续循环。

b) 若下个字符为流 str 中提供的 locale 所指示的空白符(即 std::isspace(*fmtbeg, str.getloc()) == true ),则函数保持自增 fmtbeg 直至它变为等于 fmtend 或指向非空白字符。

c) 若格式字符串中的下个字符按照大小写无关比较,等价于输入流中的下个字符,则函数令二个序列一同前进一个字符 ++fmtbeg, ++beg; 并持续循环。否则它设置 err 中的 failbit

2) 从输入序列 [beg, end) 分析一个格式指定符并按照它更新 t 所指向的 std::tm 结构体。

首先,通过执行 err = std::ios_base::goodbit 清除 err 中所有错误位。然后从 [beg, end) 读取 '%' 、 modifier (若非 '\0' )及 format 所组成的 std::time_get 格式指定符所期待的字符。若字符不组成合法转换指定符,则设置 err 中的 failbit 。若读取一个字符后抵达输入流尾,则设置 err 中的 eofbit 。若成功分析输入字符串,则更新 *t 的对应域。

对于复合转换指定符,如 '%x' 或 '%c' ,或使用修饰符 'E' 和 'O' 的指令,函数可能无法确定存储于 *t 的某些值。该情况下设置 err 中的 eofbit ,并将这些域留在未指定状态。

参数

beg-指代要分析的序列起始的迭代器
end-要分析的序列的尾后一位置迭代器
str-此函数在需要时用以获得 locale 平面的流对象,例如用 std::ctype 跳过空白符或用 std::collate 比较字符串
err-此函数所修改以指示错误的流错误标志对象
t-指向 std::tm 对象的指针,该对象将保有此函数调用结果
fmtbeg-指向指定转换格式的 char_type 字符序列首字符的指针

格式字符串由零或更多转换指定符、空白符和通常字符(除了 % )组成。期待每个通常字符以大小无关比较匹配输入流中的一个字符。每个空白符匹配输入字符串中的任意空白符。每个转换指定始于 % 字符,可选地后随 EO 修饰符(若本地环境不支持则忽略),后随确定指定符转换行为的字符。格式指定符匹配 POSIX 函数 strptime() :

 

转换指定符解释写入域
%匹配字面 % 。完整转换指定必须是 %%(无)
t匹配任何空白符。(无)
n匹配任何空白符。(无)
Y分析完整为四位十进制数,容许但不要求前导零tm_year
EY以替用表示分析,例如 平成23年 在 ja_JP 本地环境中写 2011 到 tm_yeartm_year
y分析的后二位为十进制数。范围 [69,99] 生成 1969 至 1999 的值,范围 [00,68] 生成 2000-2068tm_year
Oy以替用数值系统分析的后二位数字,例如 十一 在 ja_JP 本地环境中被分析为 11tm_year
Ey分析为从本地环境的替用日历周期 %EC 的偏移tm_year
C分析的首 2 位数字为十进制数(范围 [00,99]tm_year
EC分析本地环境的替用表示中,年基底(周期)的名称,例如 ja_JP 中的 平成tm_year
b分析月份名,完整或缩写,例如 Octtm_mon
hb 的同义词tm_mon
Bb 的同义词tm_mon
m分析为十进制数(范围 [01,12] ),容许但不要求前导零tm_mon
Om用替代数值系统分析,例如 ja_JP 本地环境中 十二 分析为 12tm_mon
星期
U分析年之星期为十进制数(星期日是星期的首日)(范围 [00,53] ),容许但不要求前导零tm_year, tm_wday, tm_yday
OU用替用数值系统,如以 %U 一般分析年之星期,例如 ja_JP 本地环境中 五十二 分析为 52tm_year, tm_wday, tm_yday
W分析年之星期为十进制数(星期一是星期的首日)(范围 [00,53] ),容许但不要求前导零tm_year, tm_wday, tm_yday
OW用替用数值系统,如以 %W 一般分析年之星期,例如 ja_JP 本地环境中 五十二 分析为 52tm_year, tm_wday, tm_yday
年/月之日
j分析年之日为十进制数(范围 [001,366] ),容许但不要求前导零tm_yday
d分析月之日为十进制数(范围 [01,31] ),容许但不要求前导零tm_mday
Od用替用数值系统分析月之日,例如 ja_JP 本地环境中 二十七 分析为 27 ,容许但不要求前导零tm_mday
ed 的同义词tm_mday
OeOd 的同义词tm_mday
星期之日
a分析星期的日名,完整或缩写版,例如 Fritm_wday
Aa 的同义词tm_wday
w分析星期之日为十进制数,其中星期日为 0 (范围 [0-6]tm_wday
Ow用替用数值系统分析星期之日为十进制数,其中星期日为 0 ,例如 ja_JP 本地环境中 二 分析为 2tm_wday
时、分、秒
H分析为十进制数,以 24 小时时钟(范围 [00,23] ) ,容许但不要求前导零tm_hour
OH用替用数值系统分析来自 24 小时时钟的,例如 ja_JP 本地环境中 十八 分析为 18tm_hour
I分析为十进制数,以 12 小时时钟(范围 [01,12] ) ,容许但不要求前导零tm_hour
OI用替用数值系统分析,例如 ja_JP 本地环境中 六 分析为 6tm_hour
M分析为十进制数(范围 [00,59] ),容许但不要求前导零tm_min
OM用替用数值系统分析,例如 ja_JP 本地环境中 二十五 分析为 25tm_min
S分析为十进制数(范围 [00,60] ),容许但不要求前导零tm_sec
OS用替用数值系统分析,例如 ja_JP 本地环境中 二十四 分析为 24tm_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分析 a.m. 或 p.m. 的本地环境等价版本tm_hour

注意:不写入 tm_isdst ,需要用如 mktime 的函数显式设置它。

 

fmtend-指定转换格式的 char_type 字符序列的末字符后一位置指针
format-指名转换指定符的字符
modifier-可出现于 % 和转换指定符间的可选修饰符

返回值

指向 [beg, end) 中成功分析的末字符后一位置的迭代器。

注意

格式字符串中非空白非 '%' 字符的大小写无关比较,不要求,但典型地使用 str 所提供的 locale 的 std::collate 平面。

若遇到分析错误,则此函数的多数实现完全不接触 *t

这些函数是否清零 *t 中其所不直接设置的域是实现定义的:可移植程序应在调用 get() 前初始化每个域为零。

调用示例 windows

#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <iterator>
#include <Windows.h>std::vector<std::wstring> locals;BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
{locals.push_back(pStr);return TRUE;
}std::string stows(const std::wstring& ws)
{std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";setlocale(LC_ALL, "chs");const wchar_t* _Source = ws.c_str();size_t _Dsize = 2 * ws.size() + 1;char *_Dest = new char[_Dsize];memset(_Dest, 0, _Dsize);wcstombs(_Dest, _Source, _Dsize);std::string result = _Dest;delete[]_Dest;setlocale(LC_ALL, curLocale.c_str());return result;
}int main()
{EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALTERNATE_SORTS, NULL, NULL);for (std::vector<std::wstring>::const_iterator str = locals.begin();str != locals.end(); ++str){std::istringstream istringstream("2024-05-01 23:12:34");istringstream.imbue(std::locale(stows(*str)));std::cout << "The locale " << istringstream.getloc().name() << ' ';auto& use_facet = std::use_facet<std::time_get<char>>(istringstream.getloc());std::tm tm{};std::string string = "%Y-%M-%d %H:%M:%S";std::ios_base::iostate err = std::ios_base::goodbit;auto ret = use_facet.get({istringstream}, {}, istringstream, err,&tm, &string[0], &string[0] + string.size());istringstream.setstate(err);std::istreambuf_iterator<char> last{};if (istringstream){std::cout << "Successfully parsed as " << std::put_time(&tm, "%c");if (ret != last){std::cout << " Remaining content: ";std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));}else{std::cout << " The input was fully consumed";}}else{std::cout << "Parse failed. Unparsed string: ";std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));}std::cout << std::endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1411340.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

算法学习系列(五十五):背包模型(三)

目录 引言一、潜水员二、背包问题求具体方案三、机器分配四、开心的今明五、金明的预算方案 引言 今天介绍的是背包模型&#xff0c;还是以题目的形式来介绍的。主要讲了背包问题求方案&#xff0c;就是由最优方案递推回去即可。还有就是一些比较经典的背包问题&#xff0c;其…

Sqlserver批量迁移Job

因为切换物理机&#xff0c;需要把数据库的作业从A机器迁移到B机器&#xff0c;数据库整体备份还原就可以了&#xff0c;数据库上的作业不会跟着带过去&#xff0c;需要手动创建&#xff0c;作业数量太多&#xff0c;逐一创建太浪费时间&#xff0c;Microsoft SQL Server Manag…

【LLM多模态】MiniGPT4模型结构和训练流程

note 图生文应用场景&#xff1a;比如电商领域根据产品图像生成产品描述、娱乐领域中根据电影海报生成电影介绍等MiniGPT-4将预训练的大语言模型和视觉编码器参数同时冻结&#xff0c;只需要单独训练线性投影层&#xff0c;使视觉特征和语言模型对齐。MiniGPT4的视觉编码器&am…

使用docker-compose编排Lnmp(dockerfile) 完成Wordpress

目录 一、 Docker-Compose 1.1Docker-Compose介绍 1.2环境准备 1.2.1准备容器目录及相关文件 1.2.2关闭防火墙关闭防护 1.2.3下载centos:7镜像 1.3Docker-Compose 编排nginx 1.3.1切换工作目录 1.3.2编写 Dockerfile 文件 1.3.3修改nginx.conf配置文件 1.4Docker-Co…

【前端学习——防抖和节流+案例】

定义 【前端八股文】节流和防抖 防抖 连续触发事件但是在设定的一段时间内只执行最后一次 代码实现思路【定时器】 大概意思就是&#xff1a; 每次按起键盘后&#xff0c;都将之前的定时器删除&#xff0c;重新开始计时。 节流 连续触发事件&#xff0c;只执行一次 …

Web APIs 学习归纳8---移动端特效

上一节学习了PC端的特效&#xff0c;现在学习移动端的特效。 一、移动端触屏事件 1.1 触屏事件概述 移动端浏览器兼容性较好&#xff0c;我们不需要考虑以前 JS 的兼容性问题&#xff0c;可以放心的使用原生 JS 书写效果&#xff0c;但是移动 端也有自己独特的地方。比如触屏…

【Linux网络】SSH服务

目录 一、SSH概述与使用 1.1 定义 1.2 优点 1.3 原理 1.4 命令登录 1.5 跳板登录 1.6 远程控制 二、SSH配置 2.1 常用的服务端配置 2.2 ssh服务最优配置 三、免密登录 3.1 操作原理 3.2 操作步骤 一、SSH概述与使用 1.1 定义 SSH&#xff08;Secure Shell&#…

宝塔怎么配置nginx

宝塔怎么配置nginx 1.找到nginx配置位置 2.修改nginx.conf文件 3.重启nginx

kali 网络环境设置

一、修改网卡配置 1.1 系统桌面上单击右键&#xff0c;在弹出的菜单中选择 Open Terminal Here。 1.2 输入命令 vim /etc/network/interfaces&#xff0c;显示配置网卡参数为。iface lo 一般指 本地环回接口&#xff0c; iface eth0 网卡为系统正在使用的网卡&#xff0c;其中的…

openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引

文章目录 openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引274.1 现象描述274.2 优化分析 openGauss学习笔记-274 openGauss性能调优-实际调优案例03-建立合适的索引 274.1 现象描述 查询与销售部所有员工的信息&#xff1a; SELECT staff_id,first_…

【Java从入门到精通】Java 异常处理

在 Java 中&#xff0c;异常处理是一种重要的编程概念&#xff0c;用于处理程序执行过程中可能出现的错误或异常情况。 异常是程序中的一些错误&#xff0c;但并不是所有的错误都是异常&#xff0c;并且错误有时候是可以避免的。 比如说&#xff0c;你的代码少了一个分号&…

LEETCODE LCR 041. 数据流中的移动平均值

class MovingAverage:def __init__(self, size: int):"""Initialize your data structure here."""self.sizesize1self.front0self.rear0self.queue[None for _ in range(size1)]self.sum0def next(self, val: int) -> float:# 满了if (self.…

平平科技工作室-Python-超级玛丽

一.准备图片 放在文件夹取名为images 二.准备一些音频和文字格式 放在文件夹media 三.编写代码 import sys, os sys.path.append(os.getcwd()) # coding:UTF-8 import pygame,sys import os from pygame.locals import* import time pygame.init() # 设置一个长为1250,宽为…

JavaScript的数组篇

数组的创建&#xff1a; 1&#xff09; var 数组名 new Array(); 2&#xff09; var 数组名[]; [ ]内可以为空&#xff0c;也可以填入值&#xff0c;值之间用逗号隔开&#xff0c;数据类型可以是任意类型 数组的遍历&#xff1a; 通过下标发来遍历&#xff0c;这一点和C…

SpringSecurity6 学习

学习介绍 网上关于SpringSecurity的教程大部分都停留在6以前的版本 但是&#xff0c;SpringSecurity6.x版本后的内容进行大量的整改&#xff0c;网上的教程已经不能够满足 最新的版本使用。这里我查看了很多教程 发现一个宝藏课程&#xff0c;并且博主也出了一个关于SpringSec…

搭建MongoDB分片集群

文章目录 一、什么是分片二、分片集群1、组件构成2、分片集群内各组件间交互 三、数据如何切分四、分片策略1、哈希分片2、范围分片 五、分片集群架构六、搭建分片集群1、涉及主机2、所有主机安装MongoDB3、分片节点副本集的创建3.1、第一套副本集shard13.1.1、准备存放数据和日…

esp32-cam 2. python opencv 拉取摄像头内容

0. 环境 - win10 python3 - pycharm - esp32-cam http://192.168.4.1 1. 创建工程 File -> Create Project -> -> Location: E:\Workspaces\PycharmProjects\esp32cam_opencv -> Create 2. opencv hello 2.1 添加脚本 File -> New -> Python f…

形式化可信人工智能方向相关研究介绍

近年来, 具有严格数学基础的形式化方法已经被公认为开发高可靠软硬件系统的有效方法. 目标是对形式化方法在不同系统的应用进行不同维度的分类, 以更好地支撑可信软硬件系统的设计。首先从系统的特征出发, 考虑6种系统特征: **顺序系统、反应式系统、并发与通信系统、实时系统、…

<2024年5月软考高项极限冲刺>《3 二级知识域项目管理一般知识》

1 项目管理一般知识主要是啥 1.1 项目基本概念 你要知道啥是项目?(独特的、临时的)项目管理是什么?项目管理就是将知识、技能、工具、技术应用在项目活动,以满足项目要求。项目成功的标准?是否满足时间、成本、范围和质量的测量指标,项目目标的实现情况。项目;项目集(…

Coze扣子开发指南:搭建一个免费的微信公众号AI客服

运营微信公众号的自媒体&#xff0c;现在借助Coze扣子可以非常好用而且免费的7*24客服了&#xff0c;完全不需要任何编程基础&#xff0c;操作非常简单&#xff1a; 打开Coze扣子&#xff0c;新建一个bot&#xff0c;输入bot名称、功能介绍和图标&#xff1a; 选择大语言模型&…