strptime和strftime

2023-11-14

strptime 将时间字符串转为 struct tm 格式

头文件:#include <time.h>

函数定义: char *strptime(const char *s, const char *format, struct tm *tm);

函数作用:将以字符串形式表示的时间转为 tm 结构体表示的时间。

strptime函数功能与 strftime 函数正好相反。

函数返回值:
strptime 函数从左到右按字符进行匹配,一旦匹配格式不正确或者匹配错误就直接返回匹配错误的字符地址。

如果输入的字符串多余需要匹配的格式,返回正确匹配到的字符地址的下一个字符,也就是多出来的字符的首地址。

如果输入的字符串完全匹配正确,则返回值指向字符串的末尾,也就是'\0'的位置。如果匹配过程出错,返回NULL。

struct tm 结构体定义:
struct tm {
   int tm_sec;    /* Seconds (0-60) */
   int tm_min;    /* Minutes (0-59) */
   int tm_hour;   /* Hours (0-23) */
   int tm_mday;   /* Day of the month (1-31) */
   int tm_mon;    /* Month (0-11) */
   int tm_year;   /* Year - 1900 */
   int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
   int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
   int tm_isdst;  /* Daylight saving time */
};

format 可以表示的形式有:

%%     表示百分号(%)

%a or %A   表示星期几的简写(Sun, Mon, ..., Sat)或者全写(Sunday, Monday, ..., Saturday)

%b or %B or %h   月份采用缩写字符表示(Jan, Feb,..., Dec)或者全写(January, February, ...,December)

%c     采用本地合适日期和时间表示(Tue Aug 16 21:30:00 1988)

%C     两位数表示的世纪(0–99),如21表示21世纪,与%Y配合使用。

%d or %e   一个月的第几天(0-31)

%D     相当于 %m/%d/%y,这是美式表示方式。欧洲一般用%d/%m/%y表示,ISO 8601 标准是%Y-%m-%d

%H    24小时制的小时表示(0–23).

%I      12小时制的小时表示(1–12).

%j      一年的第几天 (1–366).

%m    月的表示方式 (1–12).

%M    分钟 (0–59).

%n     空白

%p     本地时间是上午还是下午(AM,PM)

%r      12小时制,相当于%I:%M:%S %p

%R     相当于%H:%M.

%S     表示秒(0–60)

%t      空格

%T     相当于 %H:%M:%S.

%U     表示以星期天作为第一天的第几周 (0–53),以一月的第一个星期天作为一年中第一周的第一天

%w     星期几采用数字表示(0-6),0表示星期日,6表示星期六。

%W    表示以周一作为第一天的第几周(0–53),以一月的第一个星期一作为一年中第一周的第一天

%x     当地格式的日期

%X     当地格式的时间

%y     两位数表示的年(00,99),如果没有指明世纪,69–99表示1969–1999,00–68表示2000–2068

%Y     包含世纪的年,四位数表示,比如1991

备注:strptime 函数只是对 tm 参数赋值,不会对它初始化,所以函数调用之前,最好先初始化一下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
void main(void)
{
    struct tm tm;
    
    memset(&tm, 0, sizeof(struct tm));
    strptime("2020-06-24 16:31:01", "%Y-%m-%d %H:%M:%S", &tm);
 
    //打印Sun Jun 24 16:31:01 2020
    printf("\ntime: %s\n", asctime(&tm));
 
    memset(&tm, 0, sizeof(struct tm));
    strptime("24 Jun 2018 18:31:01", "%d %b %Y %H:%M:%S", &tm);
 
    //打印Sun Jun 24 18:31:01 2018
    printf("\ntime: %s\n", asctime(&tm));

    char time_buffer[26];
	struct tm *tm_info;
	struct timeval tv;

	gettimeofday(&tv, NULL);
	tm_info = localtime(&tv.tv_sec);
	strftime(time_buffer, 26, "%Y:%m:%d %H:%M:%S", tm_info);
	printf("time is [%s]\n", time_buffer);
}

运行效果

 

使用strftime( ) 函数将时间格式转化为我们想要的格式(其输出结果为字符串)

strftime()函数原型:
size_t strftime(char *strDest,size_t maxsize,const char *format,const struct tm *timeptr);

strftime()函数:识别以百分号(%)开始的格式命令集合。

格式命令,是区分大小写的:

%a 星期几的简写
%A 星期几的全称
%b 月分的简写
%B 月份的全称
%c 标准的日期的时间串
%C 年份的后两位数字
%d 十进制表示的每月的第几天
%D 月/天/年
%e 在两字符域中,十进制表示的每月的第几天
%F 年-月-日
%g 年份的后两位数字,使用基于周的年
%G 年分,使用基于周的年
%h 简写的月份名
%H 24小时制的小时
%I 12小时制的小时
%j 十进制表示的每年的第几天
%m 十进制表示的月份
%M 十时制表示的分钟数
%n 新行符
%p 本地的AM或PM的等价显示
%r 12小时的时间
%R 显示小时和分钟:hh:mm
%S 十进制的秒数
%t 水平制表符
%T 显示时分秒:hh:mm:ss
%u 每周的第几天,星期一为第一天 (值从0到6,星期一为0)
%U 第年的第几周,把星期日做为第一天(值从0到53)
%V 每年的第几周,使用基于周的年
%w 十进制表示的星期几(值从0到6,星期天为0)
%W 每年的第几周,把星期一做为第一天(值从0到53)
%x 标准的日期串
%X 标准的时间串
%y 不带世纪的十进制年份(值从0到99)
%Y 带世纪部分的十进制年份
%z,%Z 时区名称,如果不能得到时区名称则返回空字符。
%% 百分号

 

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

strptime和strftime 的相关文章

  • Ctrl-p 和 Ctrl-n 在 Docker 下表现异常

    For the life of me I can t seem to figure out why ctrl p and ctrl n don t work like they re supposed to under the Docker
  • php_network_getaddresses: getaddrinfo 失败: 名称或服务未知 (0) 连接失败..!

    我正在使用 php 邮件程序功能 但出现以下错误 如何修复它 2016 01 22 06 15 48 SMTP 错误 无法连接到服务器 php network getaddresses getaddrinfo失败 名称或服务未知 0 连接失
  • 在嵌入式系统上将内核控制台发送到哪里?

    我正在开发一个嵌入式系统 该系统当前通过串行端口 1 上的控制台输出启动 Linux 使用启动加载程序中的控制台启动参数 然而 最终我们将使用这个串行端口 内核控制台输出的最佳解决方案是什么 dev null 能否以某种方式将其放在 pty
  • aarch64 Linux 硬浮点或软浮点

    linux系统有arm64 有arm架构armv8 a 如何知道 Debian 运行的是硬浮动还是软浮动 符合 AAPCS64 GNU GCC for armv8仅提供硬浮动aarch64工具链 这与 armv7 a 的 GCC 不同 后者
  • 如何使用 VSCode 调试 Linux 核心转储?

    我故意从我使用 VSCode 编写的 C 应用程序生成核心转储 我不知道如何调试核心转储 有没有人愿意分享这方面的经验 更新 我相信我现在已经可以使用了 我为核心文件创建了第二个调试配置 我需要添加指向生成的转储文件的 coreDumpPa
  • 如何在 bash_profile 文件中添加导出语句?

    我正在尝试了解是否必须添加导出语句来在 bash profile 文件中设置变量 我该怎么做呢 例如 如果我必须添加 export AX name 那么我应该将其简单地写在文件末尾还是我还需要编写其他内容 简单写一下export AS na
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • 为什么使用signalfd无法捕获SIGSEGV?

    我的系统是ubuntu 12 04 我将示例修改为man 2 signalfd 并添加sigaddset mask SIGSEGV 在示例中 但我无法得到输出SIGSEGV被生成 这是一个错误吗glibc 源代码片段如下 sigemptys
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • 无法连接到 Azure Ubuntu VM - 公钥被拒绝

    我们在 Azure 上使用 Ubuntu VM 一段时间了 很少遇到任何问题 然而 其中一台虚拟机最近出现了问题 出乎意料的是 Ubuntu VM 开始拒绝公钥 ssh i azure key email protected cdn cgi
  • 有没有办法提高linux管道的性能?

    我正在尝试使用 64 位将超高速数据从一个应用程序传输到另一个应用程序CentOS http en wikipedia org wiki CentOS6 我使用以下方法进行了基准测试dd发现阻碍我的是管道而不是程序中的算法 我的目标是达到
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 每个虚拟主机的错误日志?

    在一台运行 Apache 和 PHP 5 的 Linux 服务器上 我们有多个带有单独日志文件的虚拟主机 我们似乎无法分离 phperror log虚拟主机之间 覆盖此设置
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • “./somescript.sh”和“. ./somescript.sh”有什么区别

    今天我按照一些说明在 Linux 中安装软件 有一个需要首先运行的脚本 它设置一些环境变量 指令告诉我执行 setup sh 但是我执行时犯了一个错误 setup sh 所以环境没有设置 最后我注意到了这一点并继续进行 我想知道这两种调用脚
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的

随机推荐

  • 十个常见的Git面试题及详细解答

    Git是目前最流行的分布式版本控制系统之一 广泛应用于软件开发中 在Git面试中 面试官通常会提问一些与Git相关的问题 以评估候选人的版本控制技能和了解他们对Git的理解 本文将介绍十个常见的Git面试题 并提供详细的解答 帮助读者更好地
  • JVM 讲解

    目录 1 JVM 运行流程 2 JVM 基本组成 重要 2 1 堆 线程共享 2 2 Java 虚拟机栈 线程私有 2 3 本地方法栈 线程私有 2 4 程序计数器 线程私有 2 5 方法区 线程共享 3 OOM 4 JVM 垃圾回收算法
  • Airflow Trigger DAG with config

    1 rest api to trigger dag POST api experimental dags
  • 基于51单片机的霍尔自行车里程测速仪(含Keil程序和Proteus文件)

    系统概述 系统使用的模块有AT89C51单片机 LCD1602显示屏 霍尔测速模块 本设计采用51单片机为核心控制 使用LCD1602显示采集到的速度 霍尔测速模块进行测速 测速的原理是通过磁感应原理检测开关变化量 通过检测两个开关量的时间
  • 【javascript】闭包

    通过定时器从第一个元素开始往后 每隔一秒输出arr数组中的一个元素 但是运行过后 我们却会发现结果是每隔一秒输出一个 undefined 这是为什么呢 setTimeout 函数与for循环在调用时会产生两个独立执行上下文环境 当setTi
  • grep查找进程时,忽略grep进程本身

    ps ef grep 进程名 grep v grep grep v grep即去除结果中含有grep的进程 但是要注意如果你的进程名中本身含有grep也会被忽略 这时就需要更细致的规则 例如去除条件里加上一个空格 ps ef grep 进程
  • Matlab笔记

    1 创建矩阵 gt gt a 1 2 3 4 5 8 1 2 8 1 2 8可以是1起始值 公差 结束值 也可以是1 2 7 a 1 2 3 4 5 6 7 8 1 3 5 7 1 2 特殊矩阵 名称 函数 说明 单位矩阵 eye m n
  • leetcode链表刷题:删除中间节点

    题目如下所示 这道题正如评论区所言 最大的难度就是读懂题目本身 这道题的意思是 有一个链表 题目给了我这个链表上除了第一个和最后一个节点以外的一个中间节点 然后我要把这个中间节点给删掉 也就是说 我们能够进行操作的 是一个链表上的一个节点
  • leetcode 10. 正则表达式匹配

    2023 9 20 感觉是目前做过dp题里最难的一题了 本题首要的就是需要理解题意 翻了评论区我才发现之前一直理解的题意是错的 我原来理解的 匹配0次 是指 直接消失 不会影响到前面的字符 但是 和前一个字符其实是连体的 所以说 如果匹配0
  • 网络空间安全导论

    感谢戴银涛老师的指导 笔记时间有点儿久了 整理的时候一些图丢了 不过问题不大 网络空间安全导论 目录 1 信息安全概述 从网络信息系统的发展概述 从系统分析方法看信息与信息安全的关系 从信息安全技术史角度理解网络安全相关概念 网络信息系统安
  • 深入理解 TCP 协议:从原理到实战

    小册介绍 TCP 协议是我一直很想写的一个主题 因为 TCP 学起来实在是太痛苦了 刚参加工作时 TCP 协议一直是一个心头痛 知道皮毛 但是始终无法深入 在阅读了大量相关的书籍 做了很多网络编程方面的工作以后觉得掌握的过程太过曲折 这本小
  • 【前端代码实例】使用HTML5+CSS3+JavaScript制作一个响应式的后台管理系统~带侧边导航栏仪表盘功能

    bilibili在线视频演示地址 前端代码实例 使用HTML5 CSS3 JavaScript制作一个响应式的后台管理系统 带侧边导航栏仪表盘功能 效果图 简化版代码
  • C++学习(三十四)stdlib与cstdlib

    C语言中是有 include
  • 简单xml的使用以及xml的解析dom4j和jaxp

    1 xml的简介 w3c组织发布 extensible markup Language 可扩展标记型语言 也是使用标签操作 可扩展 html里面的标签是固定 每个标签都有特定的含义 xml标签可以自己定义 可以写中文的标签 用途 显示数据
  • shared_ptr智能指针的使用

    一 shared ptr简单说明 如果一个实例指针被多个对象使用 而调用者不知道该什么时候释放该实例 那么可以使用shared ptr来 托管 这个实例指针 当使用它的对象都被释放掉了 这个实例可以自动被释放 可能有点绕 简单地说 就是类A
  • ubuntu重启后分辨率为1024,nvidia-smi不能用-20200819

    无法连接NVIDIA驱动 NVIDIA SMI has failed because it couldn t communicate with the NVIDIA driver CASE SOLVED NVIDIA SMI has fai
  • Postgresql 常用命令合集-建议收藏

    ps 注意空格和指令正确 以下仅用于自己记录使用 1 基本命令 createdb 创建一个新的PostgreSQL的数据库 命令可以使用大写 createuser 创建一个新的PostgreSQL的用户 dropdb 删除数据库 dropu
  • mssql数据库,数据库同步,分布式数据库,数据库集群,如何实现

    由于项目需要 产品的部署必须考虑到安全和灾难的解决办法 由于之前一直做的的小项目 基本都是单服务器 单数据库结构 但是由于一次灾难 把这个问题提上了日程 本人资历浅薄 很多东西还不是很熟悉 最近在网上百度了一大堆相关的东西 基本有了大概的思
  • 玩转Jetson nano系列(1):Jetson nano编译安装ncnn

    整个安装流程基本按照官方的步骤 build ncnn for jetson 但是在jetson nano上安装时 遇到了glslang和vulkan引发的问题 Found glslangValidator GLSLANGVALIDATOR
  • strptime和strftime

    strptime 将时间字符串转为 struct tm 格式 头文件 include