# !!!! Python 2 datetime.datetime 對象沒有timestamp方法!服務器
在用Python處理datetime和timestamp的轉換時發如今時區方面,Python的處理是個大坑。spa
由於Python的time是默認localtime輸入來處理的,致使腳本在本地運行和在服務器運行會獲得不同的結果。一不注意就會中招。code
R中也會碰到時區的問題,可是R的方法提供了tz選項來指定日期的時區,簡化了問題。而Python 中的time.mktime沒法對時區進行指定,帶來了不少麻煩。查了好久,發現有一個time.timezone的屬性,能夠根據運行腳本的機器的時間,來靈活處理時區問題。orm
如下是datetime與timestamp轉換的方法, 輸入和輸出都以GMT0爲準.對象
1 from datetime import datetime 2 import time 3 4 5 def timestamp_datetime(ts): 6 if isinstance(ts, (int, float, str)): 7 try: 8 ts = int(ts) 9 except ValueError: 10 raise 11 12 if len(str(ts)) == 13: 13 ts = int(ts / 1000) 14 if len(str(ts)) != 10: 15 raise ValueError 16 else: 17 raise ValueError() 18 19 return datetime.fromtimestamp(ts) 20 21 22 def datetime_timestamp(dt, type='ms'): 23 if isinstance(dt, str): 24 try: 25 if len(dt) == 10: 26 dt = datetime.strptime(dt.replace('/', '-'), '%Y-%m-%d') 27 elif len(dt) == 19: 28 dt = datetime.strptime(dt.replace('/', '-'), '%Y-%m-%d %H:%M:%S') 29 else: 30 raise ValueError() 31 except ValueError as e: 32 raise ValueError( 33 "{0} is not supported datetime format." \ 34 "dt Format example: 'yyyy-mm-dd' or yyyy-mm-dd HH:MM:SS".format(dt) 35 ) 36 37 if isinstance(dt, time.struct_time): 38 dt = datetime.strptime(time.stftime('%Y-%m-%d %H:%M:%S', dt), '%Y-%m-%d %H:%M:%S') 39 40 if isinstance(dt, datetime): 41 if type == 'ms': 42 ts = int(dt.timestamp()) * 1000 43 else: 44 ts = int(dt.timestamp()) 45 else: 46 raise ValueError( 47 "dt type not supported. dt Format example: 'yyyy-mm-dd' or yyyy-mm-dd HH:MM:SS" 48 ) 49 return ts 50 51 52 if __name__ == '__main__': 53 try: 54 print(datetime_timestamp('2015-01-01 20:20:00', 's')) 55 print(timestamp_datetime(1420114800)) 56 print(timestamp_datetime(1420114800123)) 57 except Exception as e: 58 print(e.args[0])