utc時間、本地時間及時間戳轉化

一、時間戳的概念

時間戳的定義請看百科unix時間戳,須要注意的時間戳爲當前時刻減去UTC時間(1970.1.1)零點時刻的秒數差,與當前系統所處的時區無關,同一時刻無論在任什麼時候區下獲得的時間戳都是同樣的。python

最近由於存儲數據庫須要將時間轉爲時間戳的字節型來存儲,用了python datetime模塊,期間遇到一些問題,如今終於弄懂了時間戳、時間和UTC時間的正確轉換關係,總結如下供你們參考。數據庫

二、python datatime模塊實現時間戳和本地時間、UTC時間之間的互相轉化

1) 得到unix timestamp

  dt=datetime.datetime.now()       #獲取本地當前時間
  dt.timestamp()          #獲取時間戳

注:函數

  • 此方式下now()函數中有個參數爲tz,參數意思爲時區信息,不設時爲本地時間,當設置時,如tz=timezone.utc,則表示爲當前的utc時間,不管是utc時間仍是本地時間,得到的時間戳都是同一個值.
  • timestamp()內部會根據時區設置獲得時間戳,當時區爲utc時間時timestamp()函數直接減去EPOCH獲得的秒數,當爲其餘時區的時間時經過標準C庫函數mktime獲得相差秒數,無論哪一種方式,相差的秒數差是同樣的,因此不一樣時區下的時間戳一定爲同一個值

2) python datetime模塊的小坑

    由1)的闡述獲得python在不一樣時區下都能得到時間戳,我就採用了utc時間得到時間戳,datetime有兩種方式得到utc時間:spa

    方式一:unix

   dt=datetime.datetime.now(timezone.utc)    #類型爲aware datetime object,時區爲utc
     dt.timestamp()                            #經過減去EPOCH獲得時間戳

 方式二:code

   dt=datetime.datetime.utcnow()          #類型爲naive datetime object,不包含時區信息
   dt.timestamp()                 #經過mktime獲得時間戳(獲得的時間戳是錯誤的 
  • 在未理解naiveaware以前,覺得兩種方式得到時間戳都是同樣的,不曾想第二種方式下再經過timestamp()得到的時間戳是錯誤的,爲何會發生這種狀況,是由於naive是不含時區的類型,而aware是有時區類型。
  • 第二種雖然和方式一得到的值是相同的,可是第二種方式不包含時區信息,在方式二下執行dt.timestamp(),timestamp()默認tz=None,即爲本地時區,這樣就會按照mktime獲得秒數差,但其實此時dt倒是utc時間。而方式一有時區信息,執行dt.timestamp()是直接減去EPOCH時間。
  • 當時間值相同時,naive類型和aware類型時間下執行timestamp()結果是不同的,必定要注意,不能踩了這個坑,除非是本地時間,若是想經過其餘時區的時間經過timestamp()獲得時間戳,必定要帶有時區信息。

3) 經過timestamp得出datetimeutc datetime

  • timestamp轉datetime

   datetime.datetime.fromtimestamp(timestamp)         #得到本地時間,類型naive datetime obiect
  •  timestamp轉utc datetime

兩種方式得到utc時間,但datetime object類型不同。blog

方式一:get

   datetime.datetime.utcfromtimestamp(timestamp)     #類型naive datetime object

方式二:數學

   datetime.datetime.fromtimestamp(timestamp,timezone.utc)    #類型aware datetime object。   

三、總結:

  • timestamp沒有時區之分,不要認爲不一樣時區有不一樣的時間戳。
  • datetime object有兩種類型,naive是不含時區的類型,而aware是有時區類型,就算顯示的值同樣,不一樣類型的object也不能直接進行數學運算。
相關文章
相關標籤/搜索