之前在https://blog.csdn.net/fengbingchun/article/details/107023645 中介绍过gmtime和localtime的区别,这里介绍下日期与Unix时间戳之间转换的实现,其中也会用到这两个函数。

Unix时间戳(Unix timestamp):是一种时间表示方式,定义为从格林威治时间(Greenwich Mean Time, GMT)1970年01月01日00时00分00秒起至现在的总秒数。如果操作系统使用32位二进制数字表示时间,则此类系统的Unix时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制: 01111111 11111111 11111111 11111111)。

时区:地球上的区域使用同一个时间定义。由于世界各国家与地区经度不同,地方时也有所不同,因此会划分为不同的时区。正式的时区划分包括24个时区,每一时区由一个英文字母表示。每差一个时区,区时相差一个小时,相差多少个时区,就相差多少个小时。为了照顾到各地区的使用方便,又使其它地方的人容易将本地的时间换算到别的地方时间上去。有关国际会议决定将地球表面按经线从东到西,划成一个个区域,并且规定相邻区域的时间相差1小时。在同一区域内的东端和西端的人看到太阳升起的时间最多相差不过1小时。当人们跨过一个区域,就将自己的时钟校正1小时(向西减1小时,向东加1小时),跨过几个区域就加或减几小时。例如,中国东8区的时间总比泰国东7区的时间早1小时,而比日本东9区的时间晚1小时。因此,出国旅行的人,必须随时调整自己的手表,才能和当地时间相一致。凡向西走,每过一个时区,就要把表拨慢1小时(比如2点拨到1点);凡向东走,每过一个时区,就要把表拨快1小时(比如1点拨到2点)。并且规定英国(格林尼治天文台旧址)为本初子午线,即零度经线。

本地时间(locale time):可由localtime函数获得,在中国为UTC+08:00,或称北京时间或东八时区。

协调世界时(Coordinated Universal Time, UTC):或世界标准时间,UTC的表示方式为:年、月、日、时、分、秒,均用数字表示。可以认为格林威治时间就是协调世界时(GMT=UTC),格林威治时间和UTC时间均有秒数来计算。

C语言中一些常用的函数:

(1).time_t:时间类型,基础算术类型的别名,能够表示时间,通常是一个大整数值,该整数值表示自UTC时间1970年1月1日00:00:00时起经过的秒数(即Unix时间戳)。

(2).struct tm:时间结构体,包含日历日期和时间的结构体,该结构体包含int类型的9个成员。

(3).time:获取当前时间,返回time_t,如果参数不是空指针,还将此值设置为参数指向的对象。返回的值通常代表自1970年1月1日00:00:00时起经过的秒数(即本地时间的Unix时间戳)。

(4).ctime:将time_t转换为字符串,返回char*。此函数等价于asctime(localtime(time_t))。

(5).asctime:将tm结构体转换为字符串,返回char*。

(6).strftime:将tm结构体转换为字符串,返回size_t。

(7).localtime:将time_t转换为本地时间,返回tm结构体。

(8).gmtime:将time_t转换为UTC时间,返回tm结构体。

(9).difftime:计算两个time_t之间的时间差(以秒为单位),返回double。

(10).mktime:将tm结构体转换为time_t,返回类型为time_t,本地时间,如无法表示日历时间,则返回值为-1。

以上函数用法的测试代码段如下:

void test_time()
{time_t rawtime = time(nullptr); //time_t rawtime; time(&rawtime);struct tm* timeinfo = localtime(&rawtime);fprintf(stdout, "The current local date/time is: %s", asctime(timeinfo));timeinfo = gmtime(&rawtime);fprintf(stdout, "The current utc date/time is: %s", asctime(timeinfo));fprintf(stdout, "The current local date/time is: %s", ctime(&rawtime));timeinfo = localtime(&rawtime);timeinfo->tm_hour = timeinfo->tm_min = timeinfo->tm_sec = timeinfo->tm_mon = 0; timeinfo->tm_mday = 1;fprintf(stdout, "%.f seconds since new year in the current timezone\n", difftime(rawtime, mktime(timeinfo)));timeinfo = localtime(&rawtime);char buffer[64];strftime(buffer, 64, "Now it's %I:%M%p", timeinfo);fprintf(stdout, "buffer: %s\n", buffer);
}

执行结果如下:

下面测试代码段是本地时间的日期与时间戳之间的转换:可通过localtime和mktime函数实现

void test_date_to_timestamp_local()
{// timestamp --> datetime_t timestamp = time(nullptr);struct tm* timeinfo = localtime(&timestamp);int year = timeinfo->tm_year + 1900; // years since 1900int month = timeinfo->tm_mon + 1; // monthes since January - [0, 11]int day = timeinfo->tm_mday;int date = year * 10000 + month * 100 + day;int hour = timeinfo->tm_hour;int minute = timeinfo->tm_min;int second = timeinfo->tm_sec;fprintf(stdout, "timestamp: %ld, date: %d %.2d:%.2d:%.2d\n", timestamp, date, hour, minute, second);// date --> timestampint date2 = 20211122;struct tm timeinfo2;memset(&timeinfo2, 0, sizeof(struct tm));timeinfo2.tm_year = date2 / 10000 - 1900;timeinfo2.tm_mon = date2 % 10000 / 100 - 1;timeinfo2.tm_mday = date2 % 100;time_t timestamp2 = mktime(&timeinfo2);fprintf(stdout, "date2: %d, timestamp2: %ld\n", date2, timestamp2);
}

执行结果如下:

下面测试代码段是UTC的日期与时间戳之间的转换:Linux下通过gmtime和timegm函数,Windows下通过gmtime和_mkgmtime函数。

#ifdef _MSC_VER
#define timegm _mkgmtime
#endifvoid test_date_to_timestamp_utc()
{// timestamp --> datetime_t timestamp = 86470; // 1day = 24 * 60 * 60 = 86400struct tm* timeinfo = gmtime(&timestamp);int year = timeinfo->tm_year + 1900; // years since 1900int month = timeinfo->tm_mon + 1; // monthes since January - [0, 11]int day = timeinfo->tm_mday;int date = year * 10000 + month * 100 + day;int hour = timeinfo->tm_hour;int minute = timeinfo->tm_min;int second = timeinfo->tm_sec;fprintf(stdout, "timestamp: %ld, date: %d %.2d:%.2d:%.2d\n", timestamp, date, hour, minute, second);// date --> timestampint date2 = 19700102;struct tm timeinfo2;memset(&timeinfo2, 0, sizeof(struct tm));timeinfo2.tm_year = date2 / 10000 - 1900;timeinfo2.tm_mon = date2 % 10000 / 100 - 1;timeinfo2.tm_mday = date2 % 100;time_t timestamp2 = timegm(&timeinfo2);fprintf(stdout, "date2: %d, timestamp2: %ld\n", date2, timestamp2);
}

执行结果如下:

GitHub:https://github.com/fengbingchun/Messy_Test

日期与unix时间戳之间的转换C++实现相关推荐

  1. 如何在Excel中的日期和Unix时间戳之间进行转换?

    Unix时间戳也被称为纪元时间或POSIX时间,这在很多操作系统或文件格式中被广泛使用. 本教程讨论Excel中日期和Unix时间戳之间的转换. 将日期转换为时间戳 将日期和时间转换为时间戳 将时间戳 ...

  2. utc秒数 linux时间戳,UTC时间与UNIX时间戳之间的转换

    将当前系统时间转换为UNIX时间戳 BASH 1 2 $date +%s 1263236513 +%s是date的格式控制,上面命令的意思其实就是将当前系统时间以UNIX时间戳的形式输出. 如果要将任 ...

  3. pg timestamp与unix时间戳之间的转换

    timestamp 类型 转换为 unix 时间戳 select extract (epoch from timestamp '2020-04-09'); -- 1586390400 select e ...

  4. 关于日期时间与时间戳之间的互相转换

    在开发中,经常在前后端数据交互的时候,我们在传递时间或者获取到时间的时候需要使用时间戳格式:但是在页面上渲染的时候,需要展示成我们熟悉的年月日,时分秒格式.因此,总结了一下日期时间与时间戳之间的相关转 ...

  5. MySql 格式化时间(包括正常时间格式与unix时间戳的互相转换)

    函数:FROM_UNIXTIME 作用:将MYSQL中以INT(11)存储的时间以"YYYY-MM-DD"格式来显示. 语法:FROM_UNIXTIME(unix_timestam ...

  6. c# datetime与 timeStamp(unix时间戳) 互相转换

    c# datetime与 timeStamp(unix时间戳) 互相转换 /// <summary> /// Unix时间戳转为C#格式时间 /// </summary> // ...

  7. mysql转unix时间戳_mysql日期与unix时间戳互转

    #### UNIX时间戳转换为日期用函数: FROM_UNIXTIME(unix_timestamp,format) ```sql select FROM_UNIXTIME(1156219870); ...

  8. 时间格式的处理方法总结以及时间格式和时间戳之间的转换方式,以及如何计算日期相差的天数

    1.Date() --返回此刻的日期和时间. "Wed Aug 21 2019 10:07:20 GMT+0800 (中国标准时间)" 2.getDate() --从 Date 对 ...

  9. 使用PHP将任意格式的日期转换为Unix时间戳

    在 PHP 中,可以使用 strtotime() 函数将任意格式的日期时间字符串转换为 Unix 时间戳.具体实现可以按照以下步骤: 获取任意格式的日期时间字符串,比如: $date_str = '2 ...

最新文章

  1. readline停止后怎么重新开始_2021,离婚后人生重新开始
  2. cygwin编译verilator_Sublime text3 + Verilator 实现自动语法检错
  3. 转 C# 串口编程遇到的问题以及解决方法
  4. exe解包和重新打包_Jira 批量提交问题 + 生成可执行文件exe
  5. c++不好可以学qt吗_普通人可以学Python吗
  6. 【HNOI2014】米特运输
  7. android 没有gen文件,关于eclipse:对于Android项目,Gen文件夹为空
  8. css居中的几种方法_css两种常用的不定宽高的水平垂直居中方法,记住它,不再为样式发愁...
  9. 简明python教程gitbook_简明Python教程|中英文mobi epub pdf|源代码
  10. 映美精黑白相机在linux平台上的使用(一)
  11. 抓取青果教务系统信息
  12. word利用宏批量调整图片大小
  13. 【论文阅读笔记】Beamforming Optimization for Wireless Network Aided by IRS with Discrete Phase Shifts
  14. 亿豪的python学习 day14
  15. 文件服务器文件夹卷影副本,配置共享文件夹的卷影副本功能 - Windows Server | Microsoft Docs...
  16. 信息系统项目管理师考试重点汇总,看完这篇再拿十分!
  17. 【JAVA之NIO框架介绍】
  18. WIN10作为服务器操作系统可以吗,服务器可以装win10吗
  19. Flask web 表单、蓝本与代码模块化
  20. Linux下二维码生成工具:QRencode

热门文章

  1. 如何设计恒流源输出电路?
  2. (Python)石头剪刀布游戏
  3. 基于pytorch的模型剪枝+模型量化+BN合并+TRT部署(cifar数据)(2)
  4. YOLO-v5训练自己的数据+TensorRT推理部署(1)
  5. 树莓派3b+目标检测: tflite 运行 mobilenet ssd
  6. MPlayer编译步骤
  7. ttc转换ttf字体在线_R 语言画图中英文字体解决方案
  8. excel冻结窗口怎么设置_IE浏览器弹出窗口怎么设置
  9. 【古法炮制】最原始的解决JAVA接口跨域的问题
  10. vue 写兼容ios的毫秒级刷新时间戳