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++语言 从日期格式字符串中提取年月日时分秒 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • C# 成员变量继承

    我对 C 有点陌生 但我在编程方面有相当广泛的背景 我想做的事情 为游戏定义不同的 MapTiles 我已经像这样定义了 MapTile 基类 public class MapTile public Texture2D texture pu
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低
  • 对来自流读取器的过滤数据执行小计

    编辑问题未得到解答 我有一个基于 1 个标准的过滤输出 前 3 个数字是 110 210 或 310 给出 3 个不同的组 从流阅读器控制台 问题已编辑 因为第一个答案是我给出的具体示例的字面解决方案 我使用的实际字符串长度为 450 个

随机推荐

  • 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 语言 获取系统时