GTM、UTC和C/C++中的时间处理
一、GTM与UTC
什么是GTM?
Greenwich Mean Time 格林尼治标准时间。这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治当地时间,这个地方的当地时间过去被当成世界标准的时间。1972年之前,格林威治时间(GMT)一直是世界时间的标准。1972年之后,GMT 不再是一个时间标准了。
什么是UTC?
UTC:Coordinated Universal Time 协调世界时。因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年协调世界时组织都会给世界时+1秒,让基于原子钟的世界时和基于天文学(人类感知)的格林尼治标准时间相差不至于太大。并将得到的时间称为UTC,这是现在使用的世界标准时间。协调世界时不与任何地区位置相关,也不代表此刻某地的时间,所以在说明某地时间时要加上时区
中国是哪个时区?
中国标准时间(China Standard Time)CST是UTC+8,与UTC-0的时区相差8个小时
二、时间函数ctime, localtime, gmtime, mktime, difftime, strftime
在unix系统中,我们获取到的时间戳总是从1970年开始的计算的,1970又叫做unix系统的纪元时间。但其实一开始unix的时间并不是1970年,而是1971年。
早期运行unix机器的整数累加器是32位的,工作频率在60Hz,也就是unix系统的时钟频率。这导致当时unix系统最大能表示的秒数只有 2**32,也就是2.5年,所以选择系统的纪元时间要定的和当时的时间接近,就定在了1971年。后来随着技术的发展,时钟频率改到了1Hz,时间能表示的范围扩大到了136年,于是就把纪元时间改到最近的一个十年的起始时间,也就是1970年。
在c++中可以通过ctime头文件来获取时间相关的处理函数,如下示例
// // Created by xunwu on 2020/12/29. // #include <string> #include <iostream> #include <ctime> #include <thread> #include <chrono>
int main() { //定义时间戳,当前机器time_t是long long time_t t1, t2; //获取返回的时间戳 t1 = std::time(nullptr); //当前线程睡眠2秒 std::chrono::seconds sec(2); std::this_thread::sleep_for(sec); //获取时间戳直接放入t2中 std::time(&t2); std::cout << "time_t t1: " << t1 << " t2: " << t2 << std::endl; //计算时间戳差 double t = std::difftime(t2, t1); std::cout << "difftime t " << t << "s" << std::endl; //转为文本化的显示,注意此处的ct是\n结尾的 char* ct = ctime(&t1); std::cout << "ctime: " << ct; //将time_t转换为tm对象格式 std::tm* gmtPtr = std::gmtime(&t1); //再将tm对象转为time_t时间戳 time_t t3 = std::mktime(gmtPtr); std::cout << "mktime t3: " << t3 << std::endl; //将gmtime时间根据当前时区进行格式化输出 char timeBuffer[100]; std::strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %H:%M:%S", std::localtime(&t1)); std::cout << "strftime t1: " << timeBuffer << std::endl; }
运行输出:
参考资料:
https://en.cppreference.com/w/cpp/header/ctime