欢迎访问北单实体店

足球赛事

您现在的位置是: 主页 > 北单体育资讯 > 篮球资讯

篮球资讯

UTC时间详解:协调世界时的定义、计算与本地时间转换方法

发布时间:2025-01-16 00:16 篮球资讯 作者:北单实体店微信:200833335
文章浏览阅读1.8w次,点赞4次,收藏77次。Unix、UTC、GPS时间戳及转换_utc时间戳...

格林威治时间和UTC时间常让人混淆,Unix时间戳又是如何由它们演变而来?这方面的知识既繁杂又充满趣味,探究其本质颇为有趣。

在这里插入图片描述

格林威治时间与UTC时间

在这里插入图片描述

格林威治时间与协调时间通常被视为相同。它们都以秒为单位进行计算,这使它们之间有着紧密的联系。在国际航班时刻表等众多实际应用中,这两种时间的精确计算至关重要。它们用途广泛,在全球时间标准的统一上发挥着关键作用。众多跨国事务的安排都依赖于它们的精确度。

考虑到闰秒的影响,事情会变得更加复杂。这时,细微的差别便会显现出来。因此,我们必须对这两种情况的内在逻辑有更深入的认识。

1970年开始计算的UTC时间

在这里插入图片描述

计算机显示的UTC时间是从1970年1月1日零点整开始,以秒为单位的计时。这个时间点非常重要。众多计算机系统和软件程序都以它作为UTC时间计算的起点。比如,在软件开发中,对时间精确度要求高的部分,这个时间原点是其基础。

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

Unix时间戳与协调世界时紧密相连,它代表从那个特定时刻到当前时刻所经过的秒数,不受时区影响。这一特点使得它在全球不同时区的计算机系统中进行时间关联变得十分方便。

闰秒的调整

闰秒是对世界时进行的一种特别调整。目的是确保UTC时间与原子时之间的差距不超过0.9秒。以2016年7月6日的公告为例,它在格林尼治时间2016年12月31日23点59分59秒进行了正闰秒的调整。这一调整导致了59分60秒这一特殊情况的产生。

闰秒的出现会干扰UTC时间及其他时间系统,比如GPS时间。举例来说,上次闰秒调整使得UTC时间比GPS时间慢了18秒。这种情况在需要精确时间对比的许多工作中带来了影响。

Unix时间戳计算

将UTC时间换算为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;
/*step1: 统计从1970年至今年,一共包含多少平年和闰年,并且计算其总秒数*/ 
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;
/*step2: 判断今年是平年还是闰年*/
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;
/*step3. 计算出剩余的时分秒*/
TimeStamp += tempTime->hour * 3600; 
TimeStamp += tempTime->minute * 60; 
TimeStamp += tempTime->second;
return TimeStamp;
}

闰年与时间计算

#ifndef   __TIMEX_TEST1_H_
#define   __TIMEX_TEST1_H_
#define UNIX_TIME_STAMP_YEAR  1970
#define LEAP_YEAR             1
#define FLAT_YEAR             0
typedef 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

每四年会出现一个闰年,从1970年算起,计算Unix时间戳时必须考虑到这一点。从1790年起,每四年构成一组,每组包含一个闰年和三个平年。首先,我们要算出从1970年到现在一共经过了多少组这样的“年集合”。接着,我们要找出当前Unix时间戳属于这组“年集合”中的哪一年。这样,我们就能判断出这一年是平年还是闰年,这对于准确计算时间至关重要。

时间计算的意义

格林威治时间、UTC时间和Unix时间戳在多个领域至关重要。航天领域依赖它们来精确计算卫星发射和轨道运行时间,误差不能超过一秒。通讯领域在全球数据交互中也必须依赖这些精确时间。这些时间知识在现代科技及其他众多领域中扮演着关键角色。

在这里插入图片描述

这么繁复的时间计算知识,你是否亲自探究过?若你此刻有所感悟,不妨点赞、转发,更欢迎在评论区留下你的见解,一起交流讨论。

广告位