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

https://en.wikipedia.org/wiki/Unix_time

https://www.timeanddate.com/time/zones/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章