python获取不同时区的时间:通过datetime获取UTC时间ISO格式
一个热点统计需求,需要限定一个时间范围,计算出该范围内的热点事件,相关数据则以UTC标准时间的ISO时间格式存在mongodb中,和服务器设置的时区UTC+8并不一致。
为了解决这个问题,直觉反应是在python中将时区改为UTC时区,然而改变整个服务的时区设置却可能会影响其他逻辑,此种更改最好是能限定在热点逻辑的这个范围内。
也可以在使用datetime类的时候指定时区信息,这样也可以获得UTC时间,如下为默认时区和指定UTC的输出结果,差了8个小时(北京时间UTC+8)
>>> import datetime
>>> datetime.datetime.now()
datetime.datetime(2019, 6, 18, 19, 3, 1, 103231)
>>> import pytz
>>> utc_tz = pytz.timezone('UTC')
>>> datetime.datetime.now(tz=utc_tz)
datetime.datetime(2019, 6, 18, 11, 3, 21, 319285, tzinfo=<UTC>)
要获取ISO格式的时间则可以调用datetime类中的isoformat函数:
>>> datetime.datetime.now().isoformat()
'2019-06-18T19:03:51.369309'
>>> datetime.datetime.now(tz=utc_tz).isoformat()
'2019-06-18T11:04:02.776333+00:00'
这样也可以实现生成UTC时间的ISO格式功能,但是略显麻烦,help(datetime.datetime)查看发现已经有定义好的utc相关函数可以用了,utcnow函数就可以获得当前的utc标准时间:
>>> datetime.datetime.utcnow()
datetime.datetime(2019, 6, 18, 11, 4, 17, 16264)
>>> datetime.datetime.utcnow().isoformat()
'2019-06-18T11:04:34.784311'
要限定时间范围,则可以通过datetime.timedelta类获得一个按天、秒或毫秒计数的时间区间,然后和当前时间相减即可得出起始时间了,例如起始时间为当前时间往前10天10秒0毫秒:
>>> td = datetime.timedelta(days=10,seconds=10,microseconds=0)
>>> print td
10 days, 0:00:10
>>> datetime.datetime.utcnow().isoformat()
'2019-06-18T11:05:18.992279'
>>> (datetime.datetime.utcnow() - td).isoformat()
'2019-06-08T11:05:25.488285'