Python datetime与timestamp之间的转换

# !!!! Python 2 datetime.datetime 对象没有timestamp方法!

在用Python处理datetime和timestamp的转换时发现在时区方面,Python的处理是个大坑。

因为Python的time是默认localtime输入来处理的,导致脚本在本地运行和在服务器运行会得到不一样的结果。一不注意就会中招。

R中也会碰到时区的问题,但是R的方法提供了tz选项来指定日期的时区,简化了问题。而Python 中的time.mktime无法对时区进行指定,带来了很多麻烦。查了很久,发现有一个time.timezone的属性,可以根据运行脚本的机器的时间,来灵活处理时区问题。

以下是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])