C/C++语言 从日期格式字符串中提取年月日时分秒

2023-10-30

系列文章目录


在这里插入图片描述

前言

上一篇文章《C/C++语言 获取系统时间并格式化输出》中讲到了如何获取系统时间,如何将系统时间戳转换成tm结构并拼接为日期格式的字符串,想了解的童鞋可以点击链接查看;本篇文章主要讲解,如何从日期格式字符串中提取年月日时分秒。

一、日期格式字符串

文章示例的日期格式为“YYYY-MM-DD HH:MM:SS”。上篇文章介绍系统时间格式化输出时就使用的这种格式。使用C/C++开发时,底层C语言库除了提供了简单的接口,比如获取系统时间戳、可以将时间戳转换为tm结构体,还提供了格式化时间的接口。

二、strftime函数

1.描述

C 库函数 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr) 根据 format 中定义的格式化规则,格式化结构 timeptr 表示的时间,并把它存储在 str 中。

2.声明

strftime() 函数的声明:
size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr);

3.形参

  • str – 这是指向目标数组的指针,用来复制产生的 C 字符串。
  • maxsize – 这是被复制到 str 的最大字符数。
  • format – 这是 C 字符串,包含了普通字符和特殊格式说明符的任何组合。这些格式说明符由函数替换为表示 tm 中所指定时间的相对应值。
  • 格式说明符:
说明符 含义 示例
%a 缩写的星期几名称 Sun
%A 完整的星期几名称 Sunday
%b 缩写的月份名称 Mar
%B 完整的月份名称 March
%c 日期和时间表示法 Sun Aug 19 02:56:02 2012
%d 一月中的第几天(01-31) 20
%H 24 小时格式的小时(00-23) 18
%I 12 小时格式的小时(01-12) 03
%j 一年中的第几天(001-366) 301
%m 十进制数表示的月份(01-12) 09
%M 分(00-59) 36
%p AM 或 PM 名称 PM
%S 秒(00-59) 36
%U 一年中的第几周,以第一个星期日作为第一周的第一天(00-53) 33
%w 十进制数表示的星期几,星期日表示为 0(0-6) 5
%W 一年中的第几周,以第一个星期一作为第一周的第一天(00-53) 36
%x 日期表示法 08/19/12
%X 时间表示法 02:50:06
%y 不带世纪的十进制年份 22
%Y 带世纪部分的十进制年份 2022
%Z 时区的名称或缩写 CDT
%% 一个 % 符号 %
  • timeptr – 这是指向 tm 结构的指针,该结构包含了一个年月日时分秒等各部分的日历时间。
	struct tm {
	   int tm_sec;         /* 秒,范围从 0 到 59 				*/
	   int tm_min;         /* 分,范围从 0 到 59          	*/
	   int tm_hour;        /* 小时,范围从 0 到 23            */
	   int tm_mday;        /* 一月中的第几天,范围从 1 到 31   */
	   int tm_mon;         /* 月份,范围从 0 到 11            */
	   int tm_year;        /* 自 1900 起的年数               */
	   int tm_wday;        /* 一周中的第几天,范围从 0 到 6    */
	   int tm_yday;        /* 一年中的第几天,范围从 0 到 365  */
	   int tm_isdst;       /* 夏令时                        */    
	};

4.返回值

如果产生的 C 字符串小于 size 个字符(包括空结束字符),则会返回复制到 str 中的字符总数(不包括空结束字符),否则返回零

代码如下(示例):

	#include<time.h>
	#include<stdio.h>
	
	int main(int argc, char *argv[])
	{
	    time_t rawtime;
	    struct tm *info;
	    char buffer[80] = {0};
	
	    time(&rawtime);
	    info = localtime(&rawtime);
	
	    strftime(buffer, 80, "%Y-%m-%d %H:%M:%S", info);
	    printf("格式化的日期 & 时间 : | %s |\n", buffer );
	    return(0);
	}

三、strptime函数

strptime主要用于把字符串转换成分解时间,与strftime的作用相反。都位于<time.h>中,原型如下:
extern char *strptime (__const char *__restrict __s, __const char *__restrict __fmt, struct tm *__tp);

1.形参

第一个形参是传入的时间格式字符串"2022-09-01 12:23:09";
第二个形参是需要传入的时间格式;
第三个参数是一个tm的结构体指针;

2.示例

	string timeStr = "2022-02-22 02:22:02";
	struct tm timeinfo;
	strptime(timeStr.c_str(), "%Y-%m-%d %H:%M:%S",  &timeinfo);

得到的timeinfo结构体里面存放着年月日时分秒等参数,具体tm结构体可以参考《C/C++语言 获取系统时间并格式化输出》文章中描述的tm结构体

3.函数封装

将日期格式字符串转成时间戳。

time_t convertTimeStr2TimeStamp(std::string timeStr)
{
	struct tm timeinfo;
	strptime(timeStr.c_str(), "%Y-%m-%d %H:%M:%S",  &timeinfo);
	time_t tt;
    tt = mktime(&timeinfo);
    return tt;
}

总结

童鞋们可以灵活使用上述原型函数,可以尝试不同的组合方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++语言 从日期格式字符串中提取年月日时分秒 的相关文章

随机推荐

  • U盘产生快捷方式病毒

    u盘不小心染了病毒 文件都变成了快捷方式 真实的源文件都变成了隐藏文件 看着这么多快捷方式真是不开心 这个病毒的机制也很简单 它在u盘里放了一个survival vbe文件 就感染了u盘 然后在电脑的c盘放两个survival vbe文件
  • SSH使用篇:Windows登录Ubuntu虚拟机&设置免密登录

    目录 一 ssh的安装与启动 1 安装 2 启动服务器的SSH服务 二 口令登录 1 登录命令 2 验证过程 3 登录失败 1 服务器变更 2 服务器IP变化 三 免密登录 公钥登录 大致的三步 0 准备工作 不一定要弄 1 客户端生成公私
  • 【java】获取属性名工具

    背景 在编码时经常会用到同名的属性名字符串 比如 用相同的属性名做为 map 中的键 在 mybatis 中 根据属性名的下划线字符串来拼接 sql 查询条件 需要修改属性名时 如果是用字符串硬编码的 引用的地方越多 修改越困难 但是如果用
  • 某团面试题:JVM 堆内存溢出后,其他线程是否可继续工作?

    转载注明 http dwz win gHc最近网上出现一个美团面试题 一个线程OOM后 其他线程还能运行吗 我看网上出现了很多不靠谱的答案 这道题其实很有难度 涉及的知识点有jvm内存分配 作用域 gc等 不是简单的是与否的问题 由于题目中
  • 向日葵远程控制端 for Mac

    向日葵远程控制端 for Mac是Mac平台上一款免费的远程桌面控制软件 向日葵远程控制软件免费版支持Mac OS X 10 10 3以上系统 相比客户端的向日葵远程软件 这款控制端功能更加齐全 向日葵客户端仅支持远程桌面 而向日葵控制端则
  • 虚拟主机也是虚拟服务器,虚拟主机和云主机之间的区别是什么

    其实在云计算不断发展的今天 虚拟主机和云主机之间的竞争 也越来越强烈了 此时不少人问虚拟主机和云主机之间的区别是什么 小编表示目前云主机在市场的应用中的优势越来越明显了 很多个人站长和企业们 也都是会使用云主机 因此大家就不妨看看虚拟主机和
  • MIPI CSI接口调试方法: data rate计算

    mipi DPHY 的规格书里对 data rate 有定义上下限值 最低 data rate为 80M bps 最高为 2500M bps 由于mipi 传输时是双采样 这样的话 实际的差分时钟的上下限就是 40MHz 1250 MHz
  • mac 安装adb工具

    1 安装homebrew 在终端输入下面的命令 ruby e curl fsSL https raw githubusercontent com Homebrew install master install 2 安装adb brew in
  • conda install & pip install区别 & 查看当前环境下包的情况

    conda可以方便开发管理python环境 包可以conda 安装有时使用pip整理一下不同点 conda 创建环境 conda create name a conda env python 3 6 名为a conda env python
  • SVG图标配置

    在开发项目的时候我们经常会用到svg矢量图 而且我们使用SVG以后 页面上加载的不再是图片资源 这对页面性能来说也是个很大的提升 项目背景 vue3 vite ts 安装依赖 npm install vite plugin svg icon
  • 202320读书笔记|《宋词》——竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生

    202320读书笔记 宋词 竹杖芒鞋轻胜马 谁怕 一蓑烟雨任平生 宋词 韩震主编 偶然从书友那加入书架的书 宋词挺喜欢李清照的词以及知否的 菩萨蛮 诗集 词 俳句 短歌我都很喜欢 是轻松有趣又简短的 这本书里有一些是上学时候背过的 看到的时
  • log4j2 入门学习与总结

    log4j2 2 3 入门学习与总结 大纲 log4j2 配置文件加载 log4j2 配置文件结构图 log4j2 配置文件说明 log4j2 Appenders child Filter ThresholdFilter 的使用 log4j
  • 【云原生之K8S】Yaml文件详解

    目录 一 K8S支持的文件格式 1 1 yaml和json的主要区别 二 YAML 2 1 查看API资源版本标签 2 2 编写资源配置清单 编写nginx test yaml资源配置清单 创建资源对象 查看创建的pod资源 2 3 创建s
  • C++中的适配器

    C primer中关于适配器的定义 适配器 adaptor 是使一种事物的行为类似于另外一事物的行为的一种机制 这个定义初学时觉得好抽象 为了理解C 中的适配器 不妨先了解物理上的适配器 物理上的适配器就是一个接口转换器 它可以是一个独立的
  • 我如何搞懂Javascript系列之原型和原型链

    理解原型 JavaScript 常被描述为一种基于原型的语言 每个对象拥有一个原型对象 对象以其原型为模板 从原型继承方法和属性 原型对象也可能拥有原型 并从中继承方法和属性 一层一层 以此类推 这种关系常被称为原型链 构造函数创建对象 J
  • JS常用方法

    1 删除数组中指定对象指定元素 let arr name xiaowang id 1 name xiaozhang id 2 createDate xiaoli id 3 删除id为1的对象 其中i为index 1可选择性填写 含义为删除当
  • 传递颜色

    由于颜色在片元着色器中 故不能用attribute 用uniform得到并传递 11
  • python中国古代数学问题——二鼠打洞

    任务描述 九章算术 的 盈不足篇 里有一个很有意思的老鼠打洞问题 原文是这么说的 今有垣厚十尺 两鼠对穿 大鼠日一尺 小鼠亦一尺 大鼠日自倍 小鼠日自半 问 何日相逢 各穿几何
  • 剑指 Offer 10- I. 斐波那契数列(java+python)

    写一个函数 输入 n 求斐波那契 Fibonacci 数列的第 n 项 即 F N 斐波那契数列的定义如下 F 0 0 F 1 1 F N F N 1 F N 2 其中 N gt 1 斐波那契数列由 0 和 1 开始 之后的斐波那契数就是由
  • C/C++语言 从日期格式字符串中提取年月日时分秒

    系列文章目录 文章目录 系列文章目录 前言 一 日期格式字符串 二 strftime函数 1 描述 2 声明 3 形参 4 返回值 三 strptime函数 1 形参 2 示例 3 函数封装 总结 前言 上一篇文章 C C 语言 获取系统时