QDateTime 本地時間和UTC時間轉換問題

        先說一下UTC,搜索360百科: 協調世界時,又稱世界統一時間、世界標準時間、國際協調時間,簡稱UTC,是以原子時秒長爲基礎,在時刻上儘可能接近於世界時的一種時間計量系統。1979年12月3日在內瓦舉行的世界無線電行政大會經過決議,肯定用「世界協調時間」取代「格林威治時間」,做爲無線電通訊領域內的國際標準時間。應用於天文學及天體,是測繪學上的一類用語。 函數

     UTC時間同本地時間關係
   UTC +時間差=本地時間
    時間差根據時區定,東邊爲正,西邊爲負,如北京東八區,時間差0800,8小時。若是UTC時間是 2014-04-03 00:00:00 那麼北京時間就是 2014-04-03 08:00:00。
    
   好,UTC時間介紹到此,繼續關於QDateTime與UTC時間轉換:
  一、將QDateTime 本地時間轉換成UTC時間
  QDateTime 提供toUTC()函數,可將QDateTime 表明的時間轉換成UTC時間,還以北京時間爲例,若是當前時間1970-01-01 08:00:00, 則轉換成UTC時間應該是 1970-01-01 00:00:00 ,測試代碼以下:
  QDateTime  testTime = QDateTime::fromString("1970-01-01 08:00:00","yyyy-MM-dd hh:mm:ss");
  QDateTime utcTime = testTime::toUTC();
 QString sUTCTime = utcTime.toString("yyyy-MM-dd hh:mm:ss");
   則sUTCTime 爲yyyy-MM-dd hh:mm:ss
   QDateTime 的 toTime_t()函數,QT幫助大體意思是將當前時間轉換成距1970-1-1 0:0:0的秒數。時間座標是UTC時間。
 
二、 QDateTime::toTime_t()
 QT 幫助告訴咱們,toTime_t 是將QDateTime 表示的轉換爲距1970-01-01 00:00:00 的秒數,轉換時間座標是UTC時間。
 關鍵就是最後這句話:UTC時間座標。這句話的意思就是,toTime_t(),轉換的是QDateTime時間對應的UTC時間距1970-01-01 00:00:00 的秒數。
     咱們知道,通常狀況下,QDateTime,表示的是本地時間Qt::LocalTime,特殊狀況下會設置成Qt::UTC,表示時間直接表示的就是UTC時間。對應於LocalTime,toTime_t()轉換時,首先會將QDateTime的時間轉換成UTC時間(toUTC),而後計算秒數。對於Qt::UTC,則直接計算QDateTime距 1970-01-01 00:00:00
  例:
  QDateTime dateTime = QDateTime::fromString("1970-01-01 08:00:00","yyyy-MM-dd hh:mm:ss");
  dateTime.setTimeSpec(Qt::LocalTime);
  uint secondsLocal= dateTime.toTime_t();  //secondsLocal =0;
  dateTime.setTimeSpec(Qt::UTC);
  uint secondsUTC = dateTime.toTime_t();   //secondsUTC = 28800;8小時
  
    
三、QDateTime::fromTime_t(uint seconds)[static]
查看幫助,是將距1970-01-01 00:00:00 秒數轉換爲QDateTime,時間座標仍是UTC。也就是說,seconds 表示的是UTC時間距 1970-01-01 00:00:00 的秒數。
   若是根據 toTime_t() 反向理解,應該是fromTime_t 函數在執行時,首先根據秒數計算出UtC時間,而後根據時間的QTimeSpec,判斷,若是是Qt::LocalTime,則加時間差,計算出本地時間(如:北京時間加8小時),若是是Qt::UTC,則不變。
   但因爲fromTime_t()是靜態函數,返回QDateTime,缺省直接轉換成Qt::LocalTime,即如下操做,無論如何,返回時間值都不變
  例:
    QDateTime dateTime = QDateTime::fromTime_t(0);
   若是dateTime爲Qt::LocalTime,則 dateTime,表示的是1970-01-01 08:00:00
   若是datetime 設爲Qt::UTC, dateTime.SetTimeSpec(Qt:UTC);  dateTime表明的時間仍是 1970-01-01 08:00:00
 
四、QDateTime::setTime_t(uint seconds)
  不一樣於 fromTime_t,可區分出LocalTime 和 UTC。例:
  QDateTime time ;
  time.setTime_t(0);
  QString strLocal =time.toString("yyyy-MM-dd hh:mm:ss");//strLocal ="1970-01-01 08:00:00"
  
  QDateTime timeUTC;
  timeUTC.setTimeSpec(Qt::UTC);
  timeUTC.setTime_t(0);
  QString strUTC = timeUTC.toString("yyyy-MM-dd hh:mm:ss"); //strUTC = "1970-01-01 00:00:00"
 
轉自:https://blog.csdn.net/clp_csdnid/article/details/79050639
相關文章
相關標籤/搜索