Linux日期时间函数

Linux与时间相关的结构体及相关用法 1. Linux下与时间有关的结构体         struct timeval        {              int tv_sec;              int tv_usec;          };          其中tv_sec是由凌晨开始算起的秒数,tv_usec则是微秒(10E-6 second)。          struct timez 阅读详情

在应用程序开发过程中,经常要使用到日期时间这些参数,Linux系统中提供了相关的一些API给用户获取日期时间,这些API都放在头文件time.h中。

此外,需要注意的是,所有的UNIX系统都使用同一个时间和日期的起点:格林尼治时间(GMT)1970年1月1日午夜(0点)。这是“UNIX纪元的起点”,Linux也不例外。Linux系统中所有的时间都以从UNIX纪元的起点起经过的秒数来衡量。

接下来,我们来介绍日期时间相关的API及其使用。

一、底层的时间值

前面说过Linux系统中所有的时间都以从UNIX纪元的起点起经过的秒数来衡量,该秒数称为底层的时间值。

1、time函数

#include <time.h>

time_t time(time_t *tloc);

作用:通过调用time函数得到底层的时间值,它返回的是从纪元开始至今的秒数。

参数:如果tloc不是一个空指针,time函数还会把返回值写入tloc指针指向的位置。

返回值:底层的时间值,单位是秒。

也就是说获取底层时间值可以通过参数获取,也可以通过返回值获取。

时间通过一个预定义的类型time_t来处理。这是一个大到能够容纳以秒计算的日期和时间的整数类型。

2、difftime函数

既然可以通过time函数获取底层的时间值,那么对于一些精度要求不高的事情的耗时统计,可以通过简单地把两次调用time函数得到的值相减。此外,Linux还提供了difftime函数来计算两个time_t时间值的差,且精度更高。

#include <time.h>

double difftime(time_t time1, time_t time2);

该函数用来计算两个time_t值之间的秒数并以double类型返回它。

作用:计算两个时间值之间的差,

参数:两个time_t底层时间值。

返回值:将time1-time2的值作为浮点数返回。

示例代码:

创建time.c文件,加入如下代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>


int main(int argc, char *argv)
{

	time_t begin_time, end_time;
	double diff_time;
	
	begin_time = time(NULL);
	sleep(1);
	time(&end_time);
	
	diff_time = difftime(end_time, begin_time);
	printf("begin time: %lds, end time: %lds, diff time: %fs\n", 
				begin_time, end_time, diff_time);
	
	exit(0);
}

编译:gcc -o time time.c

运行:

 

 

二、结构化日期时间

为了提供更有意义的时间和日期,你需要把时间值转换为可读的时间和日期。有一些标准函数可以帮我们做到这一点。

1、gmtime函数

#include <time.h>

struct tm *gmtime(const time_t *timeval);

作用:gmtime函数把底层时间值分解为一个结构。

参数:time_t底层时间值。

返回值:tm结构体时间。tm结构体有如下成员:

注意:tm_year是从1900年开始计算的偏移值,该值要加1900才是当年的值。tm_mon是从0开始的值,该值要加1才是当前的月份。

 

2、localtime函数

由于gmtime函数获得的是GMT时间(格林尼治时间,或称为时间标准时间UTC),GMT时间是时区0的时间,不一定是用户想要的时区时间,如果要获取当地时间,就要失业localtime函数。

#include <time.h>

struct tm *localtime(const time_t *timeval);

localtime函数和gmtime一样,区别是它返回的结构中包含的值已根据当地时区做了调整。

 

3、mktime函数

如果已知tm结构时间,想得到底层时间time_t,可以使用mktime函数转换。

#include <time.h>

time_t mktime(struct tm *timeptr);

作用:把已分解出来的tm结构再转换为底层时间值time_t。

参数:tm结构体指针。

返回值:底层时间time_t。如果tm结构不能被表示为time_t值,mktime将返回-1。

 

示例代码:

创建tmtime.c文件,加入如下代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int main(int argc, char *argv)
{

	time_t time_val, time_mk;
	struct tm *time_gm, *time_local;

	time_val = time(NULL);
	printf("raw second time: %lds\n", time_val);		//获取底层时间值
	
	time_gm = gmtime(&time_val);
	printf("raw gm time:\n");			//打印原始的tm结构时间
	printf("\tdate:%03d/%02d/%02d, time: %02d:%02d:%02d\n",
				time_gm->tm_year, time_gm->tm_mon, time_gm->tm_mday,
				time_gm->tm_hour, time_gm->tm_min, time_gm->tm_sec);
	printf("modified gm time:\n");		//打印修改后的tm结构时间
	printf("\tdate:%04d/%02d/%02d, time: %02d:%02d:%02d\n",
				time_gm->tm_year+1900, time_gm->tm_mon+1, time_gm->tm_mday,
				time_gm->tm_hour, time_gm->tm_min, time_gm->tm_sec);

	time_local = localtime(&time_val);
	printf("modified local time:\n");	//打印本地时间
	printf("\tdate:%04d/%02d/%02d, time: %02d:%02d:%02d\n",
				time_gm->tm_year+1900, time_gm->tm_mon+1, time_gm->tm_mday,
				time_gm->tm_hour, time_gm->tm_min, time_gm->tm_sec);

	time_mk = mktime(time_gm);			//将tm结构时间转换为底层时间值
	if(time_mk<0)
	{
		printf("mktime error!\n");
		exit(1);
	}
	printf("raw second mktime: %lds\n", time_mk);
	
	
	exit(0);
}

编译:gcc -o tmtime tmtime.c

运行:

 

三、固定格式字符串日期时间

为了更方便的输出日期和时间的表示,可以使用asctime函数和ctime函数输出固定格式表示的日期时间。

1、asctime函数

#include <time.h>

char *asctime(const struct tm *timeptr);

参数:tm结构体指针。

返回值:字符串日期时间。表示由tm结构timeptr所给出的时间和日期。这个返回的字符串有类似下面的格式:

Sun Jun 9 12:34:56 2019\n\0

该字符串的长度是固定26个字符。表示的是GMT时间的字符串。

 

2、ctime函数

如果要表示本地时间的字符串,则要使用ctime函数。

#include <time.h>

char *ctime(const time_t *timeval);

作用:获取本地的字符串格式日期时间。

参数:底层时间值time_t。

返回值:本地日期时间的字符串。

ctime函数和asctime一样,区别是它返回的字符串中包含的值已根据当地时区做了调整。

 

示例代码:

创建strtime.c文件,加入如下代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>


int main(int argc, char *argv)
{

	time_t time_val;
	struct tm *time_gm;
	char *time_asc, *time_c;
	
	time_val = time(NULL);
	printf("raw second time: %lds\n", time_val);		//获取底层时间值

	time_gm = gmtime(&time_val);			//获取tm结构时间
	time_asc = asctime(time_gm);			//将tm结构时间转换为GMT字符串
	printf("asctime:\n");
	printf("%s\n", time_asc);

	time_c = ctime(&time_val);				//将底层时间值转换为本地时间字符串
	printf("ctime:\n");
	printf("%s\n", time_c);
	
	exit(0);
}

编译:gcc -o strtime strtime.c

运行:

 

四、自定义格式字符串时期时间

为了对时间和日期字符串的格式有更多控制,可以使用strftime函数,它很像是一个针对时间和日期的sprintf函数,工作方式也很类似。

1、strftime函数

#include <time.h>

size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);

作用:创建一个自定义格式日期时间字符串。

参数:timeptr指针指向的tm结构所表示的时间和日期,并将结果放在字符串s中。字符串被指定(至

少)maxsize个字符长。format字符串用于控制写入字符串s的字符。与printf一样,它包含将被传给字符串的普通字符和用于格式化时间和日期元素的转换控制符。转换控制符如下表:

 

2、strptime函数

如果已知一个包含日期时间的字符串,可以使用strptime函数从该字符串中解析日期时间。

#include <time.h>

char *strptime(const char *buf, const char *format, struct tm *timeptr);

参数:buf是存放一个已知的字符串,其格式与format字符串一致。format字符串的构建方式和strftime的format字符串完全一样。strptime在字符串扫描方面类似于sscanf函数,也是查找可识别字段,并把它们写入tm结构体指针timeptr中对应的变量。

返回值:strptime返回一个指针,指向转换过程处理的最后一个字符后面的那个字符。如果碰到不能转换的字符,转换过程就在该处停下来。调用程序需要检查是否已从传递的字符串中读入了足够多的数据,以确保tm结构中写入了有意义的值。

strptime的转换控制符与strftime的相比,限制要稍微松一些,因为strptime中的星期几和月份用缩写和全称都行,两者都匹配strptime中的%a控制符,此外,strftime对小于10的数字总以0开头,而strptime则把它看作是可选的。

 

示例代码:

创建formtime.c文件,添加如下代码:

#define _XOPEN_SOURCE

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <string.h>


int main(int argc, char *argv)
{

	time_t time_val;
	struct tm *time_local;
	struct tm tm_strp;
	char time_buf[256] = {0};
	char *result = NULL;
	
	time_val = time(NULL);
	time_local = localtime(&time_val);
	strftime(time_buf, sizeof(time_buf), "%a %d %b %H:%M:%S", time_local);
	printf("strftime:\n");
	printf("%s\n", time_buf);

	memset(time_buf, 0, sizeof(time_buf));
	strcpy(time_buf, "Thu 29 July 2020, 18:25 will finish");
	printf("strptime will get msg from: %s\n", time_buf);
	
	result = strptime(time_buf, "%a %d %b %Y, %H:%M", &tm_strp);
	printf("strptime:\n");
	printf("date:%04d/%02d/%02d, time: %02d:%02d:%02d\n",
				tm_strp.tm_year+1900, tm_strp.tm_mon+1, tm_strp.tm_mday,
				tm_strp.tm_hour, tm_strp.tm_min, tm_strp.tm_sec);
		
	
	exit(0);
}

编译:gcc -o formtime formtime.c

运行:

注意:编译formtime.c时,你可能会看到编译器有一个警告信息。这是因为GNU库在默认情况下并未声明strptime函数。要解决这个问题,你需要明确请求使用X/Open的标准功能,这需要在包含time.h头文件之前加上如下一行:

#define _XOPEN_SOURCE

 

总结

关于time_t时间值、tm结构体和格式化字符串之间的转换关系如下图:

参考:

《Linux程序设计第4版》

 

MMRotate 详细使用教程 MMRotate 详细使用教程 做旋转目标检测,怎么可以不知道如何使用MMRotate呢! github链接: https://github.com/open-mmlab/mmrotate 1 安装 创建虚拟环境并激活 conda create -n mmrotate python=3.7 -y conda activate mmrotate 安装 PyTorch 和 torchvision conda install pytorch torchvision -c pytorch 注意:确保 阅读详情

相关推荐

PX4 EKF2协方差矩阵‘负定’了怎么办?保姆级排查与数值稳定性修复指南

本文深入解析PX4 EKF2协方差矩阵出现‘负定’问题的原因,并提供全面的排查与修复方案。从理论分析到实践操作,详细介绍了数值稳定性危机的诊断工具、算法加固措施及工程实践中的防御性编程技巧,帮助飞控工程师有效解决滤波算法中的数值稳定性问题。

weixin_28730927的博客 317

为什么tm_year是从1900开始而不是1970

在stackoverflow上找到了答案: Why is the tm_year member in struct tm relative to 1900 rather than 1970 in C on macosx? 对该问题回答的原文: The struct tm is designed for parsing, displaying, and manipulating human-r...

Good_zwn的博客 5968

AI视频生成提示词工程:结构化公式与实战案例详解

在实际使用 AI 生成视频或图像时,最常遇到的困惑是:为什么我的提示词(Prompt)生成的画面总是不理想?是模型能力不足,还是我的描述有问题?答案往往是后者。提示词工程(Prompt Engineering)并非简单的“翻译”需求,而是一门需要结构化思维和精准描述的技能。它决定了 AI 能否准确理解你的意图,并生成符合预期的视觉内容。 本文将通过两个核心案例,深入拆解提示词的构建逻辑。第一个案例聚焦于“文生视频”,我们将学习如何将一个简单的想法,如“小猫在雪地里玩雪球”,通过结构化公式扩展为一段富有细节和

weixin_30800987的博客 554

C++ 日期和时间的相关函数

C++ 标准库没有提供所谓的日期类型,头文件ctime提供了继承于C 语言的日期和时间的结构和函数。

汉阳Hann's Home 4464

强化学习Q值迭代的几何视角:从策略区域到快速收敛

在强化学习中,Q值迭代是求解最优策略的核心算法,其理论基础建立在贝尔曼不动点定理之上。该算法通过迭代更新Q函数,使其逐步逼近最优值函数。从几何视角看,整个Q函数空间可被视为一个高维流形,每个Q函数对应流形上的一个点,而贝尔曼最优算子则定义了流形上的变换轨迹。理解这一几何结构,特别是由策略超平面划分出的凸多面体区域,对于分析算法的收敛行为至关重要。在实际工程中,传统Q值迭代可能在高维或稀疏奖励环境下收敛缓慢,甚至陷入策略高原。通过引入策略区域缓存与自适应学习率等几何启发方法,可以更高效地导航策略空间,加速策略

weixin_30444111的博客 317

一文详解AUTOSAR COM ComSignal结构体

ComSignalLength指定信号的长度,以字节为单位,影响数据的解析范围和精度。比如车速信号若为UINT16类型,ComSignalLength=16。这里需要注意必须ComSignalLength与ComSignalType匹配(比如FLOAT32类型需配置ComSignalLength=32),超出实际物理值范围时需配置缩放(Scaling)参数。ComSignalType定义信号的物理数据类型,决定如何解析原始字节数据。

menghuyouyou的博客 942

时间函数

struct tm 取当前时间函数gmtime 返回时间函数time 字符串格式时间函数ctime 字符串格式时间函数asctime time, gmtime, ctime, asctime, mktime等常用时间函数 一.#include”time.h”头文件中的结构体如下:在程序中可以直接使用 struct tm #ifndef_TM_DEFINED s

Li Qing Xin's blog 760

Allegro如何进行四层板板层设计

板层的设计

weixin_42499230的博客 3188

时间基础概念及Linux中的时间函数

本文介绍了时间相关的基本概念,譬如GMT时间、UTC时间以及全球24个时区的划分等,并且给大家介绍了Linux系统下常用的时间相关的系统调用和库函数,主要有9个:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday。GMT是格林威治标准时间 ,UTC是基于原子钟的国际标准时间。jiffies是内核中定义的一个全局变量,内核使用 jiffies 启动以来的系统节拍数。

ChenYX的博客 19万+

基于ESP32的智能无线广播系统开发博客

通过本项目的开发,我们成功地实现了基于ESP32的智能无线广播系统。该系统不仅具备传统广播的功能,还实现了通过Wi-Fi无线传输音频、实时广播和智能控制等多种先进功能。未来,随着技术的进一步发展,我们还可以扩展更多功能,如智能推荐广播内容、支持语音识别和控制等。希望本项目能够为嵌入式开发人员提供一些思路和参考,帮助大家在实际开发中更好地应用ESP32平台,开发出更加智能和实用的无线广播系统。

2201_76125393的博客 423

Linux内核vmlinuz文件:了解和编程

vmlinuz文件是Linux操作系统中的内核镜像文件。它包含了Linux内核的压缩版本,用于引导和启动操作系统。vmlinuz文件通常是一个zImage格式的压缩内核镜像,其中包含了操作系统所需的核心功能和驱动程序。vmlinuz文件的名称可能会因Linux发行版和版本而有所不同,但它们的作用是相同的。在某些发行版中,vmlinuz文件可能被重命名为vmlinux或bzImage。

PixelDyno的博客 1350

Linux常用C函数-日期时间篇

Linux常用C函数-日期时间篇 时间:2006-11-01 10:01:53  来源:Linux联盟收集  作者: 日期时间篇 asctime ctime gettimeofday gmtime localtime mktime settimeofday time asctime(将时间和日期以字符串格

hanchaoman的专栏 1482

Xilinx FPGA平台GTX简易使用教程(汇总篇)

Xilinx平台GTX简易使用教程,先“知其然”,慢慢再研究“所以然”。

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 3万+

Linux C 函数参考(日期时间) --转

Linux C 函数参考(日期时间) 1.1 概述 世界标准时间(Coordinated Universal Time,UTC),也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。世界各地时间也世界标准时间为基准划分为不同的时区,例如,中国的北京时间与UTC的时差为+8,也就是UTC+8。美国是UTC-5。   Calendar Time:日历时间,...

iteye_582的博客 251

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Linux C 函数参考(日期时间)

Linux C 函数参考(日期时间) 1.1 概述 世界标准时间(Coordinated Universal Time,UTC),也就是大家所熟知的格林威治标准时间(Greenwich Mean Time,GMT)。世界各地时间也世界标准时间为基准划分为不同的...

weixin_30325793的博客 82

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Linux C 语言日期时间函数总结

C 语言获取系统时间相关函数总结记录一下,用的时候不至于再去到处找了。 函数 精度 说明 time() 秒 获取系统时间 ftime() 秒 + 毫秒 获取系统时间 1/10^3 gettimeofday() 秒 + 微秒 获取系统时间 1/10^6 clock_gettime() 秒 + 纳秒 获取系统时间 1/10^9 sleep() 秒 延时函数 usleep() 微秒 延时函数 1/10^6 struct tm - 存储年月日时分秒的结构 loc.

彼此当年少,莫负好时光 2990

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Linux常用C函数-日期时间函数

<br />日期时间篇<br />asctime、ctime、gettimeofday、gmtime、localtime、mktime、settimeofday、time;<br /> <br />asctime(将时间和日期以字符串格式表示) 相关函数 time,ctime,gmtime,localtime<br />表头文件 #include<time.h><br />定义函数 char * asctime(const struct tm * timeptr);<br />函数说明 asctime()将

白浪的专栏 642

linux日期时间转换函数,Linux时间戳、日期转换函数

Linux时间戳、日期转换函数:#include #include #include #include using namespace std;time_t date_to_timestamp(char *date, char *pfmt){struct tm t;strptime(date, pfmt, &t);time_t tt = mktime(&t);return tt;}...

weixin_39887715的博客 727

linux C 日期时间相关函数(输出中文日期)

说明:可以输出中文日期格式 string GetNowDateTime() {     string tem;     int iyear = 1900;     time_t   now;                                //实例化time_t结构     struct   tm     *timenow;         //实例化tm结构指针

越野追求的博客 1274

Linux c函数库-日期时间篇

以下的知识来源于网络,如有侵权,请联系我删除哈 内容介绍: 1、time函数 2、gmtime函数 3、localtime函数 4、ctime函数 5、asctime函数 内容详细介绍: 1、time函数 time函数 功能:获取1970.1.1 到 现在的秒数 相关函数 ctime, ftime, gettimeofday 头文件 #include <time.h> 函数定义 time_t time (time_t *t ) 函数说明 此函数会返回从公元 1970

sidongzhong的博客 435
上一篇: 知识的提取
下一篇: sqlite数据库基础知识总结
bulebin
博客等级 码龄10年 152粉丝 36原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值