文章目录
- 一、GMT
- 二、UTC
- 三、GMT vs UTC
- 四、C++获得当前的UTC时间
一、GMT
GMT(Greenwich Mean Time), 格林威治平时(也称格林威治时间)。
它规定太阳每天经过位于英国伦敦郊区的皇家格林威治天文台的时间为中午12点。
1972年之前,格林威治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。
二、UTC
UTC(Coodinated Universal Time),协调世界时,又称世界统一时间、世界标准时间、国际协调时间。
UTC 由两部分构成:
- 原子时间(TAI, International Atomic Time):
结合了全球400个所有的原子钟而得到的时间,它决定了我们每个人的钟表中,时间流动的速度。 - 世界时间(UT, Universal Time):
也称天文时间,或太阳时,他的依据是地球的自转,我们用它来确定多少原子时,对应于一个地球日的时间长度。
三、GMT vs UTC
GMT是前世界标准时,UTC是现世界标准时。
UTC 比 GMT更精准,以原子时计时,适应现代社会的精确计时。
但在不需要精确到秒的情况下,二者可以视为等同。
每年格林尼治天文台会发调时信息,基于UTC。
四、C++获得当前的UTC时间
UTC时间是比北京时间早的,现在北京时间是2020/11/27/16:45,对应的UTC时间是2020/11/27/08:45
#include<iostream>
#include<ctime>
using namespace std;
int main(){
time_t now =time(0);
char * data = ctime(&now)
cout << now <<endl; //输出一个时间戳 1970 年 1 月 1 日以来经过的秒数。如果系统没有时间,则返回 .1。
cout << data <<endl; //字符串时间
//转换UTC时间
// tm *gmtime(const time_t *time); 该函数返回一个指向 time 的指针,time 为 tm 结构,用协调世界时(UTC)也被称为格林尼治标准时间(GMT)表示。
tm * gm =gmtime(&now);
// char * asctime ( const struct tm * time ); 该函数返回一个指向字符串的指针,字符串包含了 time 所指向结构中存储的信息,返回形式为:day month date hours:minutes:seconds year\n\0。
data = asctime(gm);
cout << data <<endl; //UTC 时间
return 0;
}
time_t转char*
extern char *ctime (const time_t *__timer) __THROW;
struct tm转char*
extern char *asctime (const struct tm *__tp) __THROW;
time_t和struct tm之间的转换
time_t到struct tm的转换:
#include <time.h>
struct tm *localtime(const time_t *timep);
struct tm到time_t的转换:
#include <time.h>
time_t mktime(struct tm *tm);
- eg:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main (int argc, char **argv)
{
int i;
time_t timer[4];
struct tm tm, *p;
tm.tm_year = 2015;
tm.tm_mon = 2;
tm.tm_mday = 23;
tm.tm_hour = 8;
tm.tm_min = 22;
tm.tm_sec = 0;
for(i = 0; i < 4; i++){
timer[i] = mktime(&tm);
printf ("timer[%d] = %ld\n", i, timer[i]);
p = localtime(&timer[i]);
printf("%d-%d-%d-%d-%d-%d\n",
p->tm_year,
p->tm_mon,
p->tm_mday,
p->tm_hour,
p->tm_min,
p->tm_sec);
}
return 0;
} /* ----- End of main() ----- */
其他:steady_clock()与system_clock()互转
#include <iostream>
#include <chrono>
using namespace std;
int main()
{
auto t1 = std::chrono::steady_clock().now().time_since_epoch().count();
std::cout << t1 << std::endl;
auto t2 = std::chrono::steady_clock::duration(t1);
auto time = std::chrono::steady_clock::time_point(t2);
std::cout << time.time_since_epoch().count() << std::endl;
using namespace std::chrono;
auto t3 = time_point<system_clock, nanoseconds>(t2);
auto t4 = system_clock::to_time_t(t3);
std::cout << std::ctime(&t4) << std::endl;
auto t5 = system_clock::duration(t1);
auto t6 = system_clock::time_point(t5);
auto t7 = system_clock::to_time_t(t6);
std::cout << std::ctime(&t7) << std::endl;
}
- ref:彻底弄懂GMT、UTC、时区和夏令时,
- PTP精确时间协议,
- C++获得当前的UTC时间,
- C++获取当前系统时间 UTC 时间 转换,time_t和struct tm之间的转换