文章目录

  • 什么是时间戳
  • 头文件time.h介绍
  • UNIX时间戳转北京时间
  • 北京时间转UNIX时间戳
  • 写成函数和调用示例

什么是时间戳

准确的说,应该是unix时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数,不考虑闰秒。一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。在很多API接口中,数据的更新时间并不是一个字符串,而是一个长整形数据,如1593003485,表示是北京时间2020-06-24 20:58:05。注意这里直接换算出的是北京时间,如果用时间戳直接转换的话,得到的时间UTC/GMT时间,和北京时间相差8个小时,在原始时间戳加上8个小时再进行转换就是北京时间了。大部分时间戳是以秒为单位的,有的时间戳是以毫秒为单位的。

在线转换工具:北京时间和UNIX时间戳在线转换

下面介绍在Keil环境下,或者是C语言环境下,利用time.h头文件中的两个函数实现UNIX时间戳和标准北京时间之间的转换方法。

头文件time.h介绍

如果使用C库函数进行转换,使用之前先要包含对应的头文件:

#include <time.h>

头文件中有一个比较重要的结构体:

/* 时间戳类型,单位为秒,与uint32_t类型一样 */
typedef unsigned int time_t;     struct tm {int tm_sec;   /* 秒钟,范围0-60,偶尔的闰秒 */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; /* 夏令时标志 */
};

这里,我们要注意几个时间的修正:

年份自1900算起,转换为实际年份,要+1900
月份范围0-11,转换为实际月份,要+1
星期范围0-6,转换为实际星期,要+1

三个函数:

struct tm * localtime(const time_t *);
给定一个毫秒级时间戳,返回时间结构体time_t mktime(struct tm *);
给定一个初始化完成的时间结构体,返回一个毫秒级时间戳,
转换时不考虑tm结构的tm_wday和tm_yday,仅用tm_mday来决定日期。size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);
给定一个时间结构体,格式化输出字符串,格式化字符可参考
https://baike.baidu.com/item/strftime示例:
char str[100];
strftime(str, 100, "%F %T", time);  /* 2020-07-01 02:16:51 */
strftime(str, 100, "%m-%d %H:%M", time);  /* 06-30 22:16 */
printf("%s\n", str);

UNIX时间戳转北京时间

输入毫秒级时间戳,调用系统函数,把时间戳转换为UTC时间,为了得到北京时间,在转换之前要先加上8个小时的补偿时间:

#include "time.h"
.....
int main(void)
{char str[100];struct tm *time;uint16_t year, yday;uint8_t month, day, week, hour, minute, second;time_t timestamp = 1592932611;  /*北京时间2020-06-24 01:16:51*/
/*几个用于测试的时间戳和北京时间对应1592932611 = 2020-06-24 01:16:51(北京时间) 1593541011 = 2020-07-01 02:16:511593526611 = 2020-06-30 22:16:51
*/    uart_init(115200);    /*printf通过串口输出*//* 北京时间补偿 */timestamp += 8*60*60;/* 调用系统函数 */time = localtime(&timestamp);year = time->tm_year;   /* 自1900年算起 */month = time->tm_mon;   /* 从1月算起,范围0-11 */week = time->tm_wday;   /* 从周末算起,范围0-6 */yday = time->tm_yday;  /* 从1月1日算起,范围0-365 */day = time->tm_mday;    /* 日: 1-31 */hour = time->tm_hour;   /* 小时:0-23点,UTC+0时间 */minute = time->tm_min;  /* 分钟:0-59 */second = time->tm_sec;  /* 0-60,偶尔出现的闰秒 *//* 时间校正 */year += 1900;month += 1;week += 1;printf("UNIX时间戳:%d\r\n", timestamp);printf("日期:%d-%d-%d 第%d天 星期%d 时间:%d:%d:%d\r\n",year, month, day, yday, week, hour, minute, second);/* 格式化时间字符串 */strftime(str, 100, "%F %T", time);  /* 2020-07-01 02:16:51 */
//    strftime(str, 100, "%m-%d %H:%M", time);  /* 06-30 22:16 */printf("%s\r\n", str);while(1){;}
}

运行结果:

北京时间转UNIX时间戳

给定北京时间:2020-06-24 01:16:51,输出时间戳1592932611,北京时间先转为UTC8时间戳,再去掉8个小时,转为标准的UNIX时间戳。

#include "time.h"
.....int main(void)
{struct tm time;time_t timestamp;/* 2020-6-25 19:11:50 */uint16_t str[6] = {2020, 6, 25, 19, 11, 50};uart_init(115200);    /*printf通过串口输出*/time.tm_year = str[0] - 1900;  /* 年份修正 */time.tm_mon = str[1] - 1;        /* 月份修正 */time.tm_mday = str[2];time.tm_hour = str[3];time.tm_min = str[4];time.tm_sec = str[5];/* 去掉北京时间8个小时 */timestamp = mktime(&time) - 8*60*60;   /*1593083510 = 2020-6-25 19:11:50*/printf("%d\r\n", timestamp);    while(1){;}
}

写成函数和调用示例


#include "usart.h"
#include "time.h"/* 定义结构体,时间为北京时间格式 */
typedef struct{uint16_t year;uint8_t month;uint8_t day;uint8_t hour;uint8_t minute;uint8_t second;
}bj_time;bj_time timestamp_to_bj_time(time_t timestamp);
time_t bj_time_to_timestamp(bj_time time);int main(void)
{time_t timestamp;bj_time time;uart_init(115200);timestamp = 1593083510;printf("%d\r\n", timestamp);/* 时间戳转北京时间 */time = timestamp_to_bj_time(timestamp);/* 2020-6-25 19:11:50 */printf("%d-%d-%d %d:%d:%d\r\n",time.year, time.month, time.day, time.hour, time.minute, time.second);/* 北京时间转时间戳 */timestamp = bj_time_to_timestamp(time);printf("%d\r\n", timestamp);while(1){;}
}bj_time timestamp_to_bj_time(time_t timestamp)
{bj_time time;struct tm *t;/* 加上8个小时 */timestamp += 8*60*60;t = localtime(&timestamp);/* 日期修正 */time.year = t->tm_year + 1900;time.month = t->tm_mon + 1;time.day = t->tm_mday;time.hour = t->tm_hour;time.minute = t->tm_min;time.second = t->tm_sec;return time;
}time_t bj_time_to_timestamp(bj_time time)
{struct tm t;time_t timestamp = 0;/* 日期修正 */t.tm_year = time.year - 1900;t.tm_mon = time.month - 1;t.tm_mday = time.day;t.tm_hour = time.hour;t.tm_min = time.minute;t.tm_sec = time.second;timestamp = mktime(&t) - 8*60*60;return timestamp;
}

运行结果:

UNIX时间戳和北京时间的相互转换相关推荐

  1. Unix时间戳和北京时间的相互转换(C语言实现 )

    一.问题背景 最近物联网项目中需要上传包含时间戳的设备数据到服务器平台.原本想把"年","月","日","时",&quo ...

  2. linux时间戳转换c语言,Unix时间戳和北京时间的相互转换(C语言实现 )

    一.问题背景 最近项目中需要上传包含时间戳的设备数据到服务器平台.原本想把"年","月","日","时","分 ...

  3. C语言实现Unix时间戳和北京时间的相互转换(已编译,亲试可用~)

    目录 一.什么是Unix时间戳 二.应用C语言库函数 三.C语言实现Unix时间戳与北京时间的相互转换 一.什么是Unix时间戳     1.Unix时间戳是从1970年1月1日(UTC/GMT的午夜 ...

  4. STM32开发 -- UTC、UNIX时间戳、北京时间之间的转换

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/87637350 我碰到的问题,GPS上UTC时间转北京时间和STM32上UNI ...

  5. python unix 时间戳转北京时间,python时间与Unix时间戳相互转换方法详解

    对于时间数据,如2018-09-25 09:28:59,有时需要与Unix时间戳进行相互的运算,此时就需要对两种形式进行转换,在Python中,转换时需要用到time模块,具体的函数如下: 其中uni ...

  6. python unix 时间戳转北京时间,python正常时间和unix时间戳相互转换的方法

    # -*- coding: utf-8 -*- import time def timestamp_datetime(value): format = '%Y-%m-%d %H:%M:%S' # va ...

  7. unix时间戳转化为时间格式(C代码实现:2种方式)

    方法一:在网络上很多人用这种4年为一周期,有点刻意而为之(另:好多人贴的代码闰年都理解错了!!!),而且只适用2038之前,有点死板 方法二:方法虽然有点笨,但是很准确啦,就是从1970年试了,逼近法 ...

  8. unix时间戳(unix timestamp)与北京时间的互转方法

    1.在linux bash下北京时间与unix时间戳互转: 获取unix timestamp: 命令:date "+%s" 输出:1372654714 获取北京时间: 命令:dat ...

  9. js 时间戳与日期时间的相互转换

    js 时间戳与日期时间的相互转换 时间戳:指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数. 1.获取时间戳 1)获取当前时 ...

  10. C实现Unix时间戳和本地时间转化

    我们平常说时间都说的几点几分几秒,星期几,但是在计算机里面并不是直接使用我们所说的时间,而是使用Unix时间戳,这样不管是哪个平台,哪个系统,都可以根据自己对时间的定义进行转换,像Java,PHP等都 ...

最新文章

  1. 5m 云服务器2核4g_阿里云服务器2核4gb
  2. 一种小型后台管理系统通用开发框架中的Cache缓存设计
  3. Python基础入门一(2)
  4. Linux popen和pclose启动shell命令的问题思考
  5. C# WPF Caliburn.Micro框架下利用Mef加载其它项目界面
  6. 零基础学习鸿蒙开发,零基础学习鸿蒙App开发 (第一天)
  7. APUE 学习笔记(十) 高级I/O
  8. 【转载】浏览器测试工具有哪些 浏览器安全性能内核兼容测试工具推荐
  9. SQLPrompt10带注册机(支持SSMS v18.5)
  10. 实变函数与计算机有关系吗,《复变函数与实变函数》
  11. lte tm模式_TD―LTE TM8传输模式分析
  12. vs2015如何建立c语言程序,C语言快速入门——使用Visual Studio 2015创建控制台应用程序...
  13. excel生成随机手机号
  14. 无人机倾斜摄影测量土方计算
  15. 在Windows中安装配置JDK+Eclipse+Maven
  16. chrome扩展程序安装_如何将扩展程序从一个Chrome安装复制到另一个安装?
  17. android studio 导出 aar,Android Studio 导出 .aar包的操作流程
  18. oracle apex接口文件,Oracle_APEX开发指南
  19. libcmt.lib和libcmtd.lib链接库冲突错误的解决方案
  20. 《人月神话》一句话总结各章核心观点

热门文章

  1. 计算机怎么不显示打开文件桌面,开机不显示桌面图标怎么办【解决方法】
  2. 解决在Python的matplotlib.pyplot图表中显示中文
  3. Spring Boot 2.x 基础案例:整合Dubbo 2.7.3 Nacos1.1.3(配置中心)
  4. 加法器verilog
  5. Python计算细胞核与细胞质的面积比opencv或pil实验
  6. Win7蓝屏代码 0x0000007B
  7. redis源码--SDS结构解析
  8. tp link虚拟服务器设置,TP-Link路由器如何设置UPNP开启【设置步骤】
  9. h3c交换机划分vlan
  10. emacs命令/edwin参考