前言

Unix时间戳(Unix timestamp),或称Unix时间(Unix time)、POSIX时间(POSIX time),是一种时间表示方式,定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数。Unix时间戳不仅被使用在Unix 系统、类Unix系统中,也在许多其他操作系统中被广告采用。

目前相当一部分操作系统使用32位二进制数字表示时间。此类系统的Unix时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111)。其后一秒,二进制数字会变为10000000 00000000 00000000 00000000,发生溢出错误,造成系统将时间误解为1901年12月13日20时45分52秒。这很可能会引起软件故障,甚至是系统瘫痪。使用64位二进制数字表示时间的系统(最多可以使用到格林威治时间292,277,026,596年12月04日15时30分08秒)则基本不会遇到这类溢出问题。

正文

一, 介绍时间戳

首先我们了解一下时间的相关概念,以及之间的区别,需要了解的时间概念有:

本地时间(locale time)
格林威治时间(Greenwich Mean Time GMT)
时间协调时间 (Universal Time Coordinated UTC)
本地时间,显而易见不用解释了

先看看时间的标准:

(1)世界时

世界时是最早的时间标准。在1884年,国际上将1s确定为全年内每日平均长度的1/8.64×104。以此标准形成的时间系统,称为世界是,即UT1。1972年国际上开始使用国际原子时标,从那以后,经过格林威治老天文台本初子午线的时间便被称为世界时,即UT2,或称格林威治时间(GMT),是对地球转速周期性差异进行校正后的世界时。

(2)原子时

1967年,人们利用铯原子振荡周期极为规律的特性,研制出了高精度的原子时钟,将铯原子能级跃迁辐射9192631770周所经历的时间定为1s。现在用的时间就是1971年10月定义的国际原子时,是通过世界上大约200多台原子钟进行对比后,再由国际度量衡局时间所进行数据处理,得出的统一的原子时,简称TAI。

(3)世界协调时

世界协调时是以地球自转为基础的时间标准。由于地球自转速度并不均匀,并非每天都是精确的86400原子s,因而导致了自转时间与世界时之间存在18个月有1s的误差。为纠正这种误差,国际地球自转研究所根据地球自转的实际情况对格林威治时间进行增减闰s的调整,与国际度量衡局时间所联合向全世界发布标准时间,这就是所谓的世界协调时(UTC:CoordinatdeUniversalTime)。UTC的表示方式为:年(y)、月(m)、日(d)、时(h)、分(min)、秒(s),均用数字表示。

GPS 系统中有两种时间区分,一为UTC,另一为LT(地方时)两者的区别为时区不同,UTC就是0时区的时间,地方时为本地时间,如北京为早上八点(东八区),UTC时间就为零点,时间比北京时晚八小时,以此计算即可通过上面的了解,我们可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。

而在我们平时工作当中看到的计算机日志里面写的时间大多数是用UTC时间来计算的,那么我们该怎么将UTC时间转化为本地时间便于查看日志,那么在作程序开发时又该怎么将本地时间转化为UTC时间呢?

下面就介绍一个简单而使用的工具,就是使用linux/unix命令date来进行本地时间和local时间的转化。

大家都知道,在计算机中看到的utc时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。

我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。

linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。

time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval,它精确到微妙。

struct timeval
{
long tv_sec; //
long tv_usec; /微秒/
};
而直接存储年月日的是一个结构:

struct tm
{
int tm_sec; /秒,正常范围0-59, 但允许至61/
int tm_min; /分钟,0-59/
int tm_hour; /小时, 0-23/
int tm_mday; /日,即一个月中的第几天,1-31/
int tm_mon; /月, 从一月算起,0-11/ 1+p->tm_mon;
int tm_year; /年, 从1900至今已经多少年/ 1900+ p->tm_year;
int tm_wday; /星期,一周中的第几天, 从星期日算起,0-6/
int tm_yday; /从今年1月1日到目前的天数,范围0-365/
int tm_isdst; /日光节约时间的旗标/
};
需要特别注意的是,年份是从1900年起至今多少年,而不是直接存储如2011年,月份从0开始的,0表示一月,星期也是从0开始的, 0表示星期日,1表示星期一。

下面介绍一下我们常用的时间函数:

#include <time.h>
char asctime(const struct tm timeptr);
将结构中的信息转换为真实世界的时间,以字符串的形式显示

char *ctime(const time_t *timep);
将timep转换为真是世界的时间,以字符串显示,它和asctime不同就在于传入的参数形式不一样

double difftime(time_t time1, time_t time2);
返回两个时间相差的秒数

int gettimeofday(struct timeval *tv, struct timezone *tz);
返回当前距离1970年的秒数和微妙数,后面的tz是时区,一般不用

struct tm* gmtime(const time_t *timep);
将time_t表示的时间转换为没有经过时区转换的UTC时间,是一个struct tm结构指针

stuct tm* localtime(const time_t *timep);
和gmtime类似,但是它是经过时区转换的时间。

time_t mktime(struct tm* timeptr);
将struct tm 结构的时间转换为从1970年至今的秒数

time_t time(time_t *t);
取得从1970年1月1日至今的秒数。

二, 实际的应用

根据时间戳到时间函数:gmtime_s

根据时区得到时间

time_t times_pacse = time(NULL);
times_pacse = times_pacse + (8 * ETC_Hour);  // 8时区
struct tm date_times;
gmtime_s(&date_times, &times_pacse);
printf("[%d-%d-%d  %d-%d-%d]\n", date_times.tm_year + 1900, date_times.tm_mon + 1, date_times.tm_mday,date_times.tm_hour, date_times.tm_min, date_times.tm_sec);

output

[2019-3-24  20-0-15]

结语

在服务器中可以配置项目的时间 写在配置表中, 就不需要人为修改代码了

个人博客地址

UNIX时间戳的UTC(协调世界时)相关推荐

  1. C语言:Unix时间戳-转-UTC时间

    C语言:Unix时间戳-转-UTC时间 C语言:UTC时间-转-Unix时间戳 一.简介 1. Unix时间戳 Unix系统内记录的时间是一个时间戳,所谓时间戳,就是当前时间距离1970年1月1日0时 ...

  2. unix时间戳转换c语言算法,聊聊时间(2)硬核算法篇——UNIX时间戳转UTC时间

    文/Edward 前一篇文章<聊聊时间(1)UNIX时间戳和UTC时间>中,我们讲述了计算机中UNIX时间戳和UTC时间的基本概念,以及简要地阐述了诸如STM32F103之类芯片简单功能R ...

  3. 算法之unix时间戳和UTC时间(年月日)互换

    算法之unix时间戳和UTC时间(年月日)互换 author:onceday date:2022年6月8日 文章目录 算法之unix时间戳和UTC时间(年月日)互换 1.c标准库时间结构定义 2.自定 ...

  4. 记录一下关于Unix时间戳、UTC时间的知识点

    世界标准时间 GMT,即格林尼治时间,也就是世界时.GMT时间的正午时刻是指太阳垂直照射本初子午线的时间,为了描述世界各地的时间,将地球划分为24个时区,已本初子午线为0时区´',向西.向东每隔15° ...

  5. python utc时间如何取整_Python和Pandas:如何在不同的分辨率上取整unix时间戳(utc):1min5min15min30min1d?...

    给出下面的时间解析示例,什么是缩短UNIX时间以获得下面所示结果的最快方法?在简单的python和pandas数据帧中?在import time unix_current = int(time.tim ...

  6. C语言:UTC时间-转-Unix时间戳

    C语言:Unix时间戳-转-UTC时间 C语言:UTC时间-转-Unix时间戳 一.简介 1. Unix时间戳 Unix系统内记录的时间是一个时间戳,所谓时间戳,就是当前时间距离1970年1月1日0时 ...

  7. Unix时间戳,GPS时间戳 ,UTC时间 , 本地时间

    本地时间 : 计算机显示的时间 本地时间 = UTC 时间 + 时区 (北京时间是东八区,也就是 +8小时) unix 时间戳 : UTC时间都是从(1970年01月01日 0:00:00)开始计算秒 ...

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

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

  9. UTC时间、GMT时间、本地时间、Unix时间戳

    来源:https://www.cnblogs.com/xwdreamer/p/8761825.html GMT和UTC GMT,即格林尼治标准时间,也就是世界时.GMT的正午是指当太阳横穿格林尼治子午 ...

  10. UTC时间、GMT时间、本地时间、Unix时间戳的区别

    1.UTC时间 与 GMT时间 UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时.俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间.可以认为 ...

最新文章

  1. 给大家介绍一位中科院师兄,读研时通过实习和比赛收入五十万
  2. 深入理解 RPC 之集群篇
  3. 【Python之旅】第五篇(一):Python Socket通信原理
  4. Qt实现截屏并保存(转载)
  5. 使用Ant Design 和Vue,React中后台开发套餐
  6. VTK:相互作用之ImageRegion
  7. 张俊红22岁年度总结
  8. cpu不支持虚拟装linux,linux 查看cpu是不是支持虚拟化
  9. 3年才能驾驭新技术,不如试试这个低代码魔方
  10. python代码之飞机大战完整版(附带image素材资源)
  11. open source Lrc歌词解析器发布
  12. 基4fft matlab,快速傅里叶变换基4时间抽取FFT算法
  13. 关于MATLAB的saveas函数错误
  14. android外汇软件开发,外汇ea回测预装基于Android9.0深度定制的操作系统
  15. linux学习第二周总结
  16. Linux的基础知识(2)-权限命令
  17. Android TextView设置下划线
  18. matlab2020a安装完多大_Matlab2020a
  19. 一阶拟合算法C(六轴)
  20. 得到《三体》听书笔记

热门文章

  1. 黑马程序员JS学习第一天
  2. 是 jsv 而不是 jsx:这可能是尤雨溪更想要的vue代码编写方式
  3. vue.jsv-html,关于vue.js v-bind 的一些理解和思考,vue.jsv-bind
  4. 近端策略优化(proximal policy optimization)算法简述
  5. Scanner类、Random类、ArrayList 类
  6. 计算机画画教程,【推荐】初学者电脑画画教程
  7. Fuzzy C-Means(模糊C均值聚类)算法原理详解与python实现
  8. 红孩儿编辑器的输入法模块的函数依赖关系图
  9. 微信小程序开发(第一篇 开发环境的准备+demo获取微信用户信息)
  10. Android 百度地图--定位、周边搜索