2017-03-01 94 views
1

我需要將我的時間戳轉換爲時代值。我發現我的系統時區設置爲CET,我的my-sql數據庫也使用它。如何從本地時間戳獲取UTC時代值

我嘗試這樣做:

os.environ['TZ']='UTC' 
epoch = int(time.mktime(time.strptime('2017-02-22 17:04:06', '%Y-%m-%d %H:%M:%S'))) 

print(epoch) 
#Output: 1487779446 -> not the same compared to 1487779446000 (= '2017-02-22 17:04:06') 

print(time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime(epoch/1000.))) 
#Output: 01/18/1970 05:16:19 -> Not Correct! 

# Timestamp: '2017-02-22 17:04:06' 
print(time.strftime('%m/%d/%Y %H:%M:%S', time.gmtime(1487779446000/1000.))) 
#Output: 02/22/2017 16:04:06 -> Correct! 

我CET想這也同樣的結果。我不明白爲什麼我會得到不同的價值觀。

回答

2

從時代開始就獲得秒數的一個好方法就是明確地做到這一點。該函數將時間字符串轉換爲天真的datetime,使得時區知道datetime,然後減去UTC爲紀元的datetime

代碼:

import datetime as dt 
from pytz import timezone 

def convert_timestamp_to_utc_epoch(ts, tz_info): 
    # convert timestamp string to naive datetime 
    naive = dt.datetime.strptime(ts, '%Y-%m-%d %H:%M:%S') 

    # assign proper timezone to datetime 
    aware = tz_info.localize(naive) 

    # get a datetime that is equal to epoch in UTC 
    utc_at_epoch = timezone('UTC').localize(dt.datetime(1970,1,1)) 

    # return the number of seconds since epoch 
    return (aware - utc_at_epoch).total_seconds() 

測試代碼:

運用問題的例子:

print('CET:', 
    convert_timestamp_to_utc_epoch('2017-02-22 17:04:06', timezone('CET'))) 

結果:

CET: 1487779446.0 

得到一個任意本地時區:

如果您不能確定在本地機器使用的是什麼時區,該tzlocal庫可以使用,如:

from tzlocal import get_localzone 
local_tz = get_localzone() 
print('Local:', 
    convert_timestamp_to_utc_epoch('2017-02-22 17:04:06', local_tz)) 
print('Pacific:', 
    convert_timestamp_to_utc_epoch('2017-02-22 17:04:06', timezone('US/Pacific'))) 

結果:

Local: 1487811846.0 
Pacific: 1487811846.0