iis服务器助手广告广告
返回顶部
首页 > 资讯 > 服务器 >Unix、UTC、GPS时间戳及转换
  • 111
分享到

Unix、UTC、GPS时间戳及转换

unixlinux服务器 2023-08-18 16:08:04 111人浏览 薄情痞子
摘要

UTC时间 UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时。俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间。可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间

UTC时间
UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时。俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间。可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间和UTC时间均用秒数来计算的。
起始时间为:1970年1月1日

北京时间:UTC+8
在这里插入图片描述
本地时间
计算机显示的时间
本地时间 = UTC 时间 + 时区 (北京时间是东八区,也就是 +8小时)
UTC + 时区差 = 本地时间
时区差东为正,西为负。在此,把东八区时区差记为 +0800,
在这里插入图片描述

UNIX时间
在计算机中看到的UTC时间都是从(1970年01月01日 0:00:00)开始计算秒数的。所看到的UTC时间那就是从1970年这个时间点起到具体时间共有多少秒。 这个秒数就是Unix时间戳,与时区无关。应用于大多数Unix系统(linuxubuntu,ros)

考虑到闰秒的话,更精确的定义为从协调世界时(UTC时间)1970年1月1日0时0分0秒起至现在经过闰秒调整之后的总秒数。

所以Unix时间转换为本地时间,应该先将 Unix时间转换为UTC时间(UTC是0时区的时间),然后再将UTC时间转换为本地时间:

Unix时间戳转换为本地时间的在线工具

在这里插入图片描述

GPS时间系统
GPS使用UTC原子钟时间,起始时间为:1980年1月6日;

与unix两者相差:err=315964800秒GPS时间表示:周数Weeks和周内秒Secs,转成秒:sec = Weeks *7 * 24 * 3600 +Secs和ros的时间转为同一时间基准:s = sec + err - 闰秒次数即unix_timestamp = gps_timestamp + 315964800 - LEAPSEC其中315964800 为两个时间起始相差的固定秒数LEAPSEC :闰秒

GPS时间系统采用原子时AT1秒长作时间基准,秒长定义为铯原子CS133基态的两个超精细能级间跃迁辐射振荡9192631170周所持续的时间。

时间起算的原点定义在1980年1月6日世界协调时UTC0时,启动后不跳秒,保证时间的连续。以后随着时间积累,GPS时与UTC时的整秒差以及秒以下的差异通过时间服务部门定期公布。

GPS卫星广播星历采用WGS-84(G873)世界大地坐标系

闰秒
闰秒是在协调世界时(UTC)中增加或减少一秒,使得UTC时与原子时[5]之间的差不超过0.9秒。
需要闰秒的部分原因是因为一个太阳日并不总是86400秒。当要增加正闰秒时,这一秒是增加在第二天的00:00:00之前,效果是延缓UTC第二天的开始。当天23:59:59的下一秒被记为23:59:60,然后才是第二天的00:00:00。如果是负闰秒的话,23:59:58的下一秒就是第二天的00:00:00了,但目前还没有负闰秒调整的需求。
最近的一次添加闰秒是在2016年12月31日23:59:60。

闰秒是对“协调世界时”(UTC)所做出的基本调整,以便令其与太阳时间保持同步。

2016年7月6日,法国国际地球自转组织发布公告:国际标准时间将在格林尼治时间2016年12月31日23时59分59秒实施一个正闰秒,即增加1秒,届时将出现59分60秒的特殊现象。由于北京处于东8区,所以中国将在2017年1月1日7:59:59后面增加1秒,出现7:59:60的特殊现象。2016年最后一天,全球多一秒!

一般来说,闰秒会被添加在某一年的6月30日或者12月31日。两次闰秒之间的时间间隔并不固定,最短的一次只隔了6个月,最长的一次隔了7年。多出来的一秒对于普通人的生活或许没有太多影响,但是对于时间连续精度有严格要求的航天、通讯、金融等领域有很大影响。比如一秒钟,飞船已经飞过了8公里!

本次闰秒调整后UTC时间与GPS时间的差将变为18秒,即UTC相对于GPS时慢了18秒

UTC时间转UNIX时间戳

UTC时间转换成UNIX时间戳的方法其实很简单,因为此条件下输入的年月日是固定的。因此对于这个问题, 我们可以直接按照年月日时分的形式进行计算, 统计每它们的秒数之和。最后加入最后的秒数就可以得到当前的UNIX 时间戳了。我们知道闰年的秒数为31622400s,平年的秒数为31536000s。

程序的设计思路为:
1) 统计从1970年至今一共过了多少平年,多少闰年,统计完成之后,根据闰年和平年的秒数计算出从1970年1月1日至今年一共经过了多少秒。
2) 计算出当前年份是平年还是闰年, 以此推算出从年初到上个月过去了多少天。计算完成之后,可以将本月的到昨天的天数一起统计进来,最终可以将年月日三个单位的秒数一起统计出来。
3) 将剩余的时分秒利用同样的方式进行累加,最终得出当前的UNIX时间戳。

具体代码如下:

#include #include "timex_test1.h" time_tt stCurrentTime; int main(void){  stCurrentTime.year = 2023;  stCurrentTime.month = 4;  stCurrentTime.date = 13;  stCurrentTime.hour = 9;  stCurrentTime.minute = 30;  stCurrentTime.second = 3;  printf("%ds", UTCToUnixTimeStamp(&stCurrentTime));  return 0;}UnixTimeStamp_t UTCToUnixTimeStamp(time_tt *time){  int FlatYearMonthDay[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int LeapYearMonthDay[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  time_tt *tempTime;//定义临时变量存储时间int i;  tempTime = time;//指向传入参数  int LeapYearNumber;//闰年  int FlatYearNumber; //平年  int ThisYear;  int LastMonDays = 0;  UnixTimeStamp_t TimeStamp = 0; for ( i = UNIX_TIME_STAMP_YEAR; i < tempTime->year; i ++ ){  if((((i % 4) == 0) && ((i % 100) != 0)) || ((i % 400) == 0))  {    LeapYearNumber ++;  }  else  {    FlatYearNumber ++;  }}TimeStamp = LeapYearNumber * 31622400 + FlatYearNumber * 31536000;if((((tempTime->year % 4) == 0) && ((tempTime->year % 100) != 0)) || ((tempTime->year % 400) ==0)){  ThisYear = LEAP_YEAR;}else{  ThisYear = FLAT_YEAR;}for ( i = 1; i < tempTime->month; i ++){  if(ThisYear == LEAP_YEAR)  {    LastMonDays += LeapYearMonthDay[i];  }  else if(ThisYear == FLAT_YEAR)  {    LastMonDays += FlatYearMonthDay[i];  }}LastMonDays = LastMonDays + tempTime->date - 1; //统计当月到昨天为止的天数TimeStamp += LastMonDays * 86400;TimeStamp += tempTime->hour * 3600; TimeStamp += tempTime->minute * 60; TimeStamp += tempTime->second;return TimeStamp;}

timex_test1.h

#ifndef   __TIMEX_TEST1_H_#define   __TIMEX_TEST1_H_#define UNIX_TIME_STAMP_YEAR  1970#define LEAP_YEAR             1#define FLAT_YEAR             0typedef struct timex_test1{  int year;  int month;   int date;   int hour;  int minute;   int second;} time_tt;typedef unsigned int UnixTimeStamp_t;UnixTimeStamp_t UTCToUnixTimeStamp(time_tt *time);#endif

UNIX时间转UTC时间戳
1)时分秒的转换
当UNIX时间戳的计数值小于86400(24h)的时候,我们很容易就能写出转换成UTC时间的程序, 因为小时数就是“UnixTimeStamp” 对3200 取模, 分数就是将不能凑满小时的“UnixTimeStamp” 对60 取模, 剩余不能凑满分数的“UnixTimeStamp” 即为当前时间的秒数。

2)年月日的转换
接下来,我们将要再对“日”的上一层单位进行讨论,即“月”数值,这也将是这个程序最为复杂的一部分内容。
这个复杂点主要体现在两个方面:
(1) 每个月的天数不等。众所周知,一年中每个月的天数都是不同的,1,3,5,7,8, 10,12为大月,一个月有31天;4,6,9,11为小月,一个月有30天。
(2) 闰年平年的影响。由于公历的偏差,导致了一年中最为特殊的一个月份2月,当此年为闰年时,2月份有29天,此年为平年时,2月份有28天。
上面两个原因,导致了年月日计算的复杂性。

但是,困难只是表面上的,我们仔细思考下,就很容易得出规律。这个规律的突破口即为闰年出现的时间, 因为闰年每四年出现一次, 那么我们可以列出从1970 年开始的几个年份。如下图所示:

在这里插入图片描述
由于闰年每四年出现一次,因此我们由图3中可以得出一个简单方法,即可以从1790年开始,每四年组成一个集合,每一个集合的都是由1年闰年加上3年平年组成的,它们的时间都是相等的,即126230400秒。

因此这个月数的求解步骤就可以变为:
(1) 计算从1970 年开始到当前的UNIX时间戳为止, 一共过了多少个“ 集合年( 平年+ 闰年)”;
(2) 计算出当前的UNIX时间戳位于本“集合年“的哪一年,这样就可以判断当年年份是平年
还是闰年;
(3) 判断了当前年份是平年还是闰年之后,就可以推算出2月份有多少天,然后可以根据上述的递归法,求解出当前位于某一月,某一天。

所以,我们先求出当前的年份,得出当前年份之后, 我们就可以很容易使用“ 能被4 整除且不能被100 整除, 或者能被400 整除的年份是闰年”这一条规则算出当年年份是闰年还是平年。接着, 我们可以直接将当前年份剩余的时间戳结合平年还是闰年, 查表计算出当前的月份。

#include #include "timex_test2.h" utc_t UtcTime;int main(void){  int retVal;  int u32UnixTimeStamp = 0; int hour, minute, sec;  int flat_year_month_day[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int leap_year_month_day[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int year_temp = 0;   int day_temp = 0;  unsigned int cnt_temp = 0;   int is_leap_or_flat_year; int i;  printf("input the UNIX time stamp:");   scanf("%d", &u32UnixTimeStamp);  cnt_temp = u32UnixTimeStamp;   while(cnt_temp >= 126230400)  {    year_temp ++;    cnt_temp = cnt_temp - 126230400;  }    UtcTime.year = UNIX_TIME_YEAR + (4 * year_temp);      if(cnt_temp >= 31536000)  {    UtcTime.year ++;    cnt_temp -= 31536000;        if(cnt_temp >= 31536000)    {      UtcTime.year ++;      cnt_temp -= 31536000;        if(cnt_temp >= 31622400)    {      UtcTime.year ++;      cnt_temp -= 31622400;        if(cnt_temp >= 31536000)    {      UtcTime.year ++;      cnt_temp -= 31536000;    }    }    }if((((UtcTime.year % 4) == 0) && ((UtcTime.year % 100) != 0)) || ((UtcTime.year % 4) ==0)){  is_leap_or_flat_year = LEAP_YEAR;}else{  is_leap_or_flat_year = FLAT_YEAR;}day_temp = cnt_temp / 86400;UtcTime.hour = (cnt_temp - day_temp * 86400) / 3600;//Calculate hours UtcTime.minute = (cnt_temp - day_temp * 86400 - UtcTime.hour * 3600) / 60; //Calculate minutes UtcTime.second = cnt_temp % 60;if(is_leap_or_flat_year == FLAT_YEAR){  if(day_temp >= flat_year_month_day[i + 1])  {    UtcTime.month ++;    day_temp -= flat_year_month_day[i + 1];  }}else if(is_leap_or_flat_year == LEAP_YEAR){  if(day_temp >= leap_year_month_day[i + 1])  {    UtcTime.month ++;    day_temp -= leap_year_month_day[i + 1];  }}}UtcTime.date = day_temp + 1;printf("\nTime transfORM successfully\n");printf("++++++++++++++++++++++++++++++++++\n");printf("\nUTC time is : %dy - %dm - %dd\n", UtcTime.year, UtcTime.month, UtcTime.date); printf("\nUTC time is : %dh - %dm : %ds\n", UtcTime.hour, UtcTime.minute, UtcTime.second); printf("++++++++++++++++++++++++++++++++++\n");printf("\n");printf("\n"); return 0;}

timex_test2.h

#ifndef   __TIMEX_H_#define   __TIMEX_H_ typedef struct{int year; int month; int date; int hour;int minute; int second;} utc_t;#define UNIX_TIME_YEAR1970#define UNIX_TIME_MONTH1#define UNIX_TIME_DATE1#define UNIX_TIME_HOUR0#define UNIX_TIME_MINIUTE0#define UNIX_TIME_SECOND0#define LEAP_YEAR1#define FLAT_YEAR#endif

来源地址:https://blog.csdn.net/xiaojinger_123/article/details/130064138

--结束END--

本文标题: Unix、UTC、GPS时间戳及转换

本文链接: https://www.lsjlt.com/news/374331.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Unix、UTC、GPS时间戳及转换
    UTC时间 UTC时间的英文全称:Universal Time Coordinated,中文名称:协调世界时。俗的理解为,这个时间是全世界通用的,即全世界都公用的一个时间。可以认为格林威治时间就是时间协调时间(GMT=UTC),格林威治时间...
    99+
    2023-08-18
    unix linux 服务器
  • unix时间戳怎么转换成时间
    在Unix系统中,时间戳表示从1970年1月1日00:00:00 UTC至当前时间的秒数。要将Unix时间戳转换为常规时间格式,可以...
    99+
    2024-03-01
    unix
  • php怎么转换unix时间戳
    在开发网站和应用程序时,我们经常需要处理时间和日期。在PHP中,时间戳是一个很常见的时间格式,它表示自1970年1月1日0时0分0秒(UTC)起已经经过的秒数。但是,Unix时间戳显示的时间格式并不人性化,因此在实际应用中我们需要将其转换为...
    99+
    2023-05-14
    php时间戳 php
  • 如何将 Unix 时间戳转换为 MySQL 时间戳值?
    MySQL 借助 FROM_UNIXTIME() 函数将 Unix 时间戳转换为时间戳数据类型值。示例mysql> Select FROM_UNIXTIME(1508622563); +-------------------...
    99+
    2023-10-22
  • 怎么将Java时间转换成unix时间戳
    怎么将Java时间转换成unix时间戳?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体内容如下import java.text.DateFormat; i...
    99+
    2023-05-30
    java unix 时间戳
  • UTC时间、GMT时间、本地时间、Unix时间戳的具体使用
    目录1.UTC时间 与 GMT时间2.UTC时间 与 本地时3.UTC 与 Unix时间戳1.UTC时间 与 GMT时间 我们可以认为格林威治时间就是时间协调时间(GMT=UTC),...
    99+
    2024-04-02
  • Python的UTC时间转换
    UTC时间转换,最终得到的都是UTC时间。 简单来说就是: 时间戳(timestamp) 转换-> UTC显示时间(datetime),使用time.gmtime(timestamp)。 显示时间(datetime) 转换->...
    99+
    2023-01-31
    时间 Python UTC
  • MySQL 中时间戳及时间戳的格式转换
    MySQL 中时间戳及时间戳的格式转换 一、什么是时间戳二、时间戳转换时间三、时间转换为时间戳 一、什么是时间戳 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。通俗的讲,时间戳...
    99+
    2023-08-16
    mysql 数据库 sql
  • golang时间及时间戳的获取转换
    目录一、获取时间1.1 获取当前时间1.2 获取之前/之后的时间获取1分钟之前的时间戳获取一小时之前的时间获取1小时后的时间二、获时间戳2.1 获取当前时间戳2.2 时间转时间戳2....
    99+
    2024-04-02
  • golang时间及时间戳如何获取及转换
    这篇“golang时间及时间戳如何获取及转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“golang时间及时间戳如何获取及...
    99+
    2023-07-02
  • php时间如何转unix时间戳
    这篇文章主要介绍“php时间如何转unix时间戳”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php时间如何转unix时间戳”文章能帮助大家解决问题。使用 time() 函数获取当前时间的 Unix...
    99+
    2023-07-05
  • Java怎么与Unix时间戳进行转换
    今天就跟大家聊聊有关Java怎么与Unix时间戳进行转换,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方法实现    public ...
    99+
    2023-05-30
    java unix 时间戳
  • golang 转换时间戳
    时间戳是计算机处理时间的一种方式,通常用整数来表示某个时间点距离另一个时间点(通常为 1970 年 1 月 1 日 00:00:00 UTC)的秒数。在 Go 语言中,转换时间戳非常简单,本文将介绍一些相关的方法和技巧。使用 time.Un...
    99+
    2023-05-15
  • C#获取时间戳的方法及时间戳转换问题
    目录一:日期转化成时间戳二:将当前日期的前后指定的天数转换成时间戳三:将指定日期转换成时间戳:如 2022-8-22 22:56:30四:将时间戳转换成日期因为一些原因,原本学Jav...
    99+
    2023-02-06
    C#获取时间戳 C#时间戳转换
  • MySQL数据库中时间戳及时间戳的格式转换
    一、什么是时间戳 时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至当前时间的总秒数。通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 常见有10位(单位:秒)和13位(单位:毫秒)...
    99+
    2023-09-20
    mysql 数据库 时间戳 时间戳格式转换
  • python unix时间戳与正常时间转
            有时候业务需要,需要把正常的时间格式与unix时间戳格式进行转换。       在python中转化方式如下,直接利用time中的函数: #! /usr/bin/env python #coding:utf-8 impo...
    99+
    2023-01-31
    时间 python unix
  • php转换unix时间戳的方法是什么
    这篇文章主要介绍“php转换unix时间戳的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php转换unix时间戳的方法是什么”文章能帮助大家解决问题。将Unix时间戳转换为日期在PHP中...
    99+
    2023-07-05
  • Java中时间戳转换为时间
    在Java中,可以使用java.util.Date类和java.text.SimpleDateFormat类来将时间戳转换为可读的日期时间字符串。以下是一个示例代码,展示了如何实现该功能: import java.text.SimpleDa...
    99+
    2023-08-24
    java 开发语言
  • Python utc转化时间
    最近在开发项目的时候, 遇到了时区, 本地时间和UTC糅杂的情况, 研究之后做一些分享. UTC Universal Time Coordinated  又叫协调世界时,  UTC用数值记录了时间. 时间记录的是0时区从1972年开始共计...
    99+
    2023-01-31
    时间 Python utc
  • mysql时间如何转换时间戳
    本篇内容介绍了“mysql时间如何转换时间戳”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作