Python datetime與timestamp之間的轉換

# !!!! 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])
相關文章
相關標籤/搜索