Linux C/C++实现时间戳转换工具

article/2025/8/27 9:50:17

在大多数 UNIX 系统中,当前时间存储为自特定时刻以来经过的时间以简化,将时间保持为长整数。所有 UNIX 系统普遍接受的时刻是 1970 年 1 月 1 日凌晨 12:00:00。 这称为 UNIX 时间戳,并被所有现代 UNIX/Linux 系统识别。

Linux 时间戳date命令

例如,如果我们希望找到 2022 年 1 月 1 日的 UNIX 时间戳,我们可以使用 date 命令。

在这里插入图片描述

在这里插入图片描述

date 尝试将字符串解析为格式化的日期和时间(或者,如果未指定时间戳,则假定时间为 00:00 AM),然后打印出给定日期和/或时间的 UNIX 时间戳形式。 1640966400 是自 1970 年 1 月 1 日凌晨 00:00:00 以来经过的确切秒数。

反过来也是可能的,我们采用 UNIX 时间戳并将其转换为日期表示。 为了取回我们的原始日期,我们可以传递如图所示的 UNIX 时间戳来转换它。

在这里插入图片描述

什么是UTC、GMT、夏令时

UTC

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际上,为了统一起见,我们使用一个统一的时间,称为通用协调时(UTC,Universal Time Coordinated)。

GMT

GMT(Greenwich Mean Time), 格林威治平时(也称格林威治时间)。
它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。

夏令时

DST(Daylight Saving Time),夏令时又称夏季时间,或者夏时制。它是为节约能源而人为规定地方时间的制度。一般在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。

Linux下时间戳转换工具使用的时间函数

ctime()、gmtime() 和 localtime() 函数都采用数据类型 time_t 的参数,它表示日历时间。 当解释为绝对时间值时,它表示自 Epoch 1970-01-01 00:00:00 +0000 (UTC) 以来经过的秒数。asctime() 和 mktime() 函数都接受一个参数来表示分解的时间,该参数表示分解为年、月、日等。

在 <time.h> 中定义的结构 tm 中,如下所示:

struct tm {int tm_sec;         /* seconds */int tm_min;         /* minutes */int tm_hour;        /* hours */int tm_mday;        /* day of the month */int tm_mon;         /* month */int tm_year;        /* year */int tm_wday;        /* day of the week */int tm_yday;        /* day in the year */int tm_isdst;       /* daylight saving time */
};

tm结构的成员是:

tm_sec 分钟后的秒数,通常在 0 到 59 的范围内,但可以最大为 60 以允许闰秒。
tm_min 小时后的分钟数,范围为 0 到 59。
tm_hour 午夜过后的小时数,范围为 0 到 23。
tm_mday 月份中的某一天,范围为 1 到 31。
tm_mon 自一月以来的月数,范围为 0 到 11。
tm_year 自 1900 年以来的年数。
tm_wday 自星期日以来的天数,范围为 0 到 6。
tm_yday 自 1 月 1 日以来的天数,范围为 0 到 365。
tm_isdst 指示夏令时在所述时间是否有效的标志。 如果夏令时有效,则值为正,否则为零,
如果信息不可用,则为否定。

gmtime()

gmtime() 函数将日历时间 timep 转换为分解的时间表示,以协调世界时 (UTC) 表示。当年份确实时,它可能会返回 NULL不适合整数。返回值指向一个静态分配的结构,随后调用任何日期和时间函数可能会覆盖该结构。

localtime()

localtime() 函数将日历时间 timep 转换为分解的时间表示,表示相对于用户指定的时区。该函数的作用就像调用 tzset(3)并设置外部变量 tzname 与有关当前时区的信息,时区与协调世界时 (UTC) 和本地之间的差异以秒为单位的标准时间,如果夏令时规则在一年中的某些时间适用,则将日光设置为非零值。返回值指向一个静态分配的可能被后续调用任何日期和时间函数覆盖的结构。

mktime()

mktime() 函数将分解的时间结构(表示为本地时间)转换为日历时间表示。该函数忽略调用者提供的值 tm_wday 和 tm_yday 字段。 tm_isdst 字段中指定的值通知 mktime() 夏令时 (DST) 在 tm中提供的时间是否有效结构:正值表示夏令时生效;零表示 DST 无效;负值意味着 mktime() 应该(使用时区信息和系统数据库)尝试确定 DST 是否在指定时间生效。

strftime()

函数根据格式规范 format 格式化分解时间 tm,并将结果放入大小为 max 的字符数组 s 中。格式规范是一个以 null 结尾的字符串,可能包含称为转换规范的特殊字符序列,每个都由一个 ‘%’ 字符引入并由称为转换说明符字符的其他字符终止。所有其他字符序列都是普通字符序列。

普通字符序列的字符(包括空字节)从format逐字复制到s。 但是,转换规范的字符被替换如下:

%A 根据当前语言环境的完整工作日名称。%b 根据当前语言环境的缩写月份名称。%B 根据当前语言环境的完整月份名称。%c 当前语言环境的首选日期和时间表示。%C 世纪数(年/100)为 2 位整数。 ()%d 以十进制数表示的月份中的日期(范围 0131)。%D 相当于 %m/%d/%y。 (Yecch — 仅适用于美国人。美国人应该注意,在其他国家/地区 %d/%m/%y 相当普遍。这意味着在国际背景下,这格式不明确,不应使用。)(SU)%e 与 %d 一样,月份中的日期为十进制数,但前导零被空格替换。 ()%E 修饰符:使用替代格式,见下文。 ()%F 等效于 %Y-%m-%d(ISO 8601 日期格式)。 (C99)%G 基于 ISO 8601 周的年份(参见注释),世纪为十进制数。对应于 ISO 周数的 4 位数年份(请参阅 %V)。这具有相同的格式和值作为 %Y,但如果 ISO 周数属于上一年或下一年,则使用该年代替。 (TZ)%g 与 %G 类似,但没有世纪,即带有 2 位数字的年份 (00-99)(TZ)%h 相当于 %b。 ()%H 使用 24 小时制(范围 0023)的十进制数字形式的小时。%I 使用 12 小时制的十进制数字形式的小时(范围 0112)。%j 以十进制数表示的一年中的日期(范围 001366)。%k 小时(24 小时制),十进制数(范围 023);单个数字前面有一个空格。 (另见 %H。) (TZ)%l 小时(12 小时制),十进制数(范围 112);单个数字前面有一个空格。 (另见 %I。) (TZ)%m 十进制数形式的月份(范围 0112)。%M 十进制数形式的分钟(范围 0059)。%n 换行符。 ()%O 修饰符:使用替代格式,见下文。 ()%p 根据给定时间值的“AM”或“PM”,或当前语言环境的相应字符串。中午被视为“PM”,午夜被视为“AM”。%P 与 %p 类似,但小写:“am”或“pm”或当前语言环境的相应字符串。 (GNU)%r 上午或下午的时间符号。在 POSIX 语言环境中,这相当于 %I:%M:%S %p。 ()%R 24 小时制的时间 (%H:%M)(SU) 有关包含秒数的版本,请参阅下面的 %T。%s 自纪元 1970-01-01 00:00:00 +0000 (UTC) 以来的秒数。 (TZ)%S 秒为十进制数(范围 0060)。 (范围最大为 60 以允许偶尔的闰秒。)%t 制表符。 ()%T 24 小时制的时间 (%H:%M:%S)()%u 以十进制表示的星期几,范围为 17,星期一为 1。另见 %w。 ()%U 以十进制数表示的当前年份的周数,范围为 0053,从第一个星期日开始作为第 01 周的第一天。另见 %V 和 %W。%V 当前年份的 ISO 8601 周数(见注释),十进制数,范围 0153,其中第 1 周是新年中至少有 4 天的第一周。看还有 %U 和 %W。 ()%w 以十进制表示的星期几,范围为 06,星期日为 0。另见 %u。%W 当前年份的周数,十进制数,范围 0053,从第一个星期一开始作为第 01 周的第一天。%x 当前区域设置的首选日期表示,不包含时间。%X 不带日期的当前语言环境的首选时间表示。%y 没有世纪的十进制数字形式的年份(范围 0099)。%Y 十进制数字形式的年份,包括世纪。%z +hhmm 或 -hhmm 数字时区(即与 UTC 的小时和分钟偏移量)。 ()%Z 时区名称或缩写。%+ date(1) 格式的日期和时间。 (TZ)(在 glibc2 中不支持。)%% 文字 '%' 字符。

Linux C/C++ 时间戳转换工具实现

int main(int argc, char** argv) 
{if(argc > 1) {//	帮助消息if(!strcmp(argv[1], "-help") || !strcmp(argv[1], "--help") || !strcmp(argv[1], "-h")) {setShow("\nUsage:\n");printf(" %s 1656214921 -g		--->	2022-06-26/11:42:01\n %s 2022-06-26/11:42:01 -s	--->	1656214921\n", ORIGINAL_FILENAME, ORIGINAL_FILENAME);setShow("\nFlags:\n");printf(" -g : Display GMT time\n -s : DST on, summer time\n -w : DST off, winter time\n");printf("\nBy default DST is off and the local time is used (GMT off)\n");return 0;}const int inlen = strlen(argv[1]);int starg = 1;//	检查用户输入if(inlen == len_date || inlen == len_unix_ms || inlen == len_unix) {if(valid(argv[1], inlen)) {if(inlen == len_date) {strncpy(userInput, argv[1], len_date);userInputType = inpTypeDate;} else {strncpy(userInput, argv[1], len_unix);userInputType = inpTypeUnix;}starg = 2;}else {printf("Is your input a valid date-time?\n");printf("Run %s -help for more\n", ORIGINAL_FILENAME);return 0;}}//	检查参数for(i = starg; i < argc; i++) {if(!strcmp(argv[i], "-s")) {is_dst = 1;}else if(!strcmp(argv[i], "-w")) {is_dst = 0;}else if(!strcmp(argv[i], "-g")) {is_gmt = true;}}}...
}	

运行:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

总结

Linux 时间戳包含一个数字而不是日期和时间。 此数字是自 1970 年 1 月 1 日午夜 (00:00:00) 的 Unix 纪元以来的秒数,采用协调世界时 (UTC)。 闰秒在 Linux 时间戳中被忽略,因此它们与实时不同,这里,文中的时间函数参考man手册。

欢迎关注微信公众号【程序猿编码】,需要时间戳转换工具完整源码的添加本人微信号(c17865354792)


http://chatgpt.dhexx.cn/article/Geo9kwlq.shtml

相关文章

linux系统date命令(时间戳与日期相互转换)

引言 在做数据分析时经常会用到时间&#xff0c;但有时系统或应用时间显示的格式不统一&#xff0c;这就需要将格式转换为一致&#xff0c;才能对比数据进一步做分析&#xff0c;以前常用网上在线时间戳转换工具&#xff0c;但每次都在先打开浏览器进行搜索在线时间戳转换工具…

Linux下时间戳格式和标准时间格式的转换

大家都知道linux文件系统中的每个文件都有三种时间戳&#xff1a; 访问时间&#xff08;atime——access time&#xff09;&#xff1a;就是上次访问这个文件的时间。 改变时间&#xff08;ctime——change time&#xff09;&#xff1a;就是文件的inode改变的时间&#xff08;…

Python——保存图片到本地

举个例子,比如我想保存github网,浏览器头有个图标. resp requests.get("https://github.com/favicon.ico") with open("C:\\Python37\\911.jpg",wb)as jpg: jpg.write(r.content)

python读取、保存图片的方法

matplotlib 输入&#xff1a;列表或二维矩阵 &#xff08;1&#xff09;例如列表&#xff1a; #codingutf-8 from matplotlib import pyplot as plt X [[1,2],[3,4],[5,6]] plt.imshow(X) #AxesImage(80,52.8;496x369.6) plt.colorbar() plt.show() #导入AxesImage结果…

python爬取网页图片教程之python爬虫获取图片保存图片

怎么用python爬取网页图片&#xff0c;今天我们以一个实例网页&#xff08;&#xff09;来爬取页面中的所有图片。 1.获取图片的URL ** ** 首先我们要想获取图片的URL&#xff0c;就需要将该网页中的图片URL提取你&#xff0c;那么我们首先获取该网页的整个数据 然后我们通过…

python爬虫保存图片和文件

看了一篇博客&#xff0c;是这么保存图片的&#xff1a; 照做&#xff1a; src "https://i0.hdslb.com/bfs/sycp/creative_img/201912/01b2f081d58e49c708c1d32b7b8c20ed.jpg" r requests.get(src) with open("C://Users//yg//Desktop//bbb.jpg", "…

在Python中如何保存图像

在Python中如何保存图像&#xff0c;如何将数组保存为图像 主要是看了TensorFlow中第一部分中看到的&#xff0c;查了查资料总结下如何将数组保存为图像 原程序如下 import scipy.misc import os #from PIL import Image #把原始图片保存至MNIST_data/raw/下 save_dir"M…

Python获取图片保存对应的文件夹

首先创建的文件夹&#xff0c;先定义一个创建文件夹的函数&#xff1a; def makdir(path):try:isExists os.path.exists(path)#判断是否存在文件夹if not isExists:#不存在创建os.makedirs(path)print(path文件夹创建成功&#xff01;)else:print(path文件夹已存在&#xff0…

【python学习】如何将所绘制的图(单张多张)保存到文件夹,并用绘制实时时间命名图片

python图片保存到文件夹 基本存储&#xff08;plt.savefig()&#xff09;创建文件夹并存储图片&#xff08;if结构OS模块&#xff09;批量绘制图片批量存储&#xff08;for循环&#xff09;图片/文件夹命名与所运行时间关联&#xff08;datatime模块&#xff09; 最近一直在做…

python读取图片、保存图片的方法

转自&#xff1a;https://jingyan.baidu.com/article/1876c852572d2f890b137609.html 分步阅读 本文介绍一下&#xff0c;python读取图片、保存图片的方法。 工具/原料 电脑 python3.6&#xff08;anaconda&#xff09; matplotlib模块 opencv模块 pillow模块 photomos…

python读取和保存图片的三种方法

python读取和保存图片 opencv import cv2 #load img cv2.imread(0.png) #show cv.imshow(title, img) #save cv2.imwrite(1_cv2.png,img)可以看到opencv读取的图片数据类型是uint8格式&#xff08;属于numpy&#xff09;&#xff0c;uint8是专门用于存储各种图像的&#xff…

python读取与保存图片的exif信息

图片的exif文件格式中保存了很多信息&#xff0c;比如GPS经纬度&#xff0c;高度&#xff0c;焦距等信息。 在图片的属性中可以看到这些信息&#xff1a; 我们可以使用python来进行exif数据的读取和保存。 1. 首先安装piexif pip3 install piexif 2.exif数据读取代码 impo…

Python 保存图片的两种方法

有时我们需要保存我们的图片&#xff0c;那我们可以怎么保存呢&#xff1f; 可参考下列保存的两种方法&#xff1a; 第一种:cv2.imwrite() 示例&#xff1a; # 方法一 &#xff1a; import cv2 cv2.imwrite("imwrite_pic.jpg", cv2.imread(pic.jpg)) 第二种:i…

python图片存取四种常用方法记录

一、PIL&#xff08;Python Imaging Library&#xff09;#python图像处理库 from PIL import Image import numpy as np #数值计算扩展包I Image.open("1.jpg") #读入图片 I.show() #显示图片 print(I) …

python保存图片的常用方法

保存图片的常用方法 1.PIL的保存图片方法 path r"./001.jpg" #图片路径 img Image.open(path) #打开图片 img.save("1.jpg") #将图片保存为1.jpg2.opencv保存图片 path r"./001.jpg" #图片路径 #img cv.imdecode(np.fromfi…

本地及服务器如何清除redis缓存

1、本地环境清除redis缓存 我用的redis管理工具是RedisDesktopManager&#xff0c;安装可参考https://blog.csdn.net/lihua5419/article/details/80661826 清除缓存命令为flushall&#xff0c;如下图所示&#xff1a; 2、服务器上清除redis缓存 我们服务器用的是Linux系统&a…

Redis 缓存删除策略

Redis&#xff08;Remote Dictionary Server )&#xff0c;即远程字典服务&#xff0c;是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库&#xff0c;并提供多种语言的API。 Redis是一个key-value存储系统。和Memcached类似&#xf…

Linux下redis清理缓存

1、先确保redis进程存在&#xff1a; 2、进入redsi下面的bin目录&#xff1b; 3、执行&#xff1a;执行./redis-cli登陆&#xff1b; 4、查看当前数据库key的数量&#xff0c;执行&#xff1a;dbsize命令 &#xff08;如果出现(error) ERR unknown command ‘(error)’ &#x…

利用Redis进行数据缓存

1. 引言 缓存有啥用&#xff1f; 降低对数据库的请求&#xff0c;减轻服务器压力提高了读写效率 缓存有啥缺点&#xff1f; 如何保证数据库与缓存的数据一致性问题&#xff1f;维护缓存代码搭建缓存一般是以集群的形式进行搭建&#xff0c;需要运维的成本 2. 将信息添加到…

Linux下如何清空Redis缓存

1.首先进到redis的安装目录&#xff0c;进到src目录下&#xff0c;找到redis-cli 2.首先用账号密码的方式进入到redis的服务端 ./redis-cli -h 127.0.0.1 -p 6379 进去后会出现下面的界面ip:port> 然后&#xff0c;输入密码进行鉴权>auth "yourpassword"&a…