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

时间:2022-01-08 22:40:58
UTC: Universal Time Coordinated 协调世界时,又称世界标准时间。

GMT: Greenwich Mean Time 格林尼治平均时。


UTC与GMT:

UTC相当于本初子午线(即经度0度)上的平均太阳时,过去曾用格林威治平均时(GMT)来表示
这两者几乎是同一概念。它们都是指的格林尼治标准时间,只不过UTC的称呼更为正式一点。两者的区别在于前者是一个天文上的概念,而后者是基于一个原子钟。

UTC与本地时间
UTC + 时区差 = 本地时间 
时区差东为正,西为负。在此,把东八区时区差记为 +0800, 
UTC + (+0800) = 本地(北京)时间 (1) 
那么,UTC = 本地时间(北京时间))- 0800 (2) 
0942 - 0800 = 0142 
即UTC是当天凌晨一点四十二分二十二秒。如果结果是负数就意味着是UTC前一天,把这个负数加上2400就是UTC在前一天的时间。例如,本地(北京)时间是 0432 (凌晨四点三十二分),那么,UTC就是 0432 - 0800 = -0368,负号意味着是前一天, -0368 + 2400 = 2032,既前一天的晚上八点三十二分。 
 

UTC 与 Unix时间戳

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

题外话:你会碰到Y2038问题,2038年1月19日凌晨3:14:07秒(UTC),从1970年1月1日午夜开始算是2147483647秒.是 2的31次方-1.
也就是32位系统表示带符号整数的情况下能够表示的最大整数.
这个短视问题没有办法解决,只能透过硬件升级,比如升级到64位,那么表示带符号整数的范围就是 2的-63  到 2的63次方-1 足够用上2920亿年了...
UTC时间、GMT时间、本地时间、Unix时间戳

linux C 实现.
#include <stdio.h>
#include <time.h>
int main(){
  time_t timep;  //时间的秒数类型...used for time in seconds
  struct tm *p;   //时间数组
  time(&timep);		//获取本地unix时间戳
  printf("time()=:%d\n",timep);	
  p = localtime(&timep);  //将时间化为结构.传入 时间戳的指针,返回 tm类型的结构指针.
  timep = mktime(p); //使用mktime 能够将tm类型的时间转为 unix时间戳.
  printf("time()->localtime()->mktime()=%d\n",timep);
  return 0;
}