Python2中通过datetime获取UTC时间ISO格式
一个热点统计需求,需要限定一个时间范围,计算出该范围内的热点事件,相关数据则以UTC标准时间的ISO时间格式存在mongodb中,和服务器设置的时区UTC+8并不一致。
为了解决这个问题,直觉反应是在python中将时区改为UTC时区,然而改变整个服务的时区设置却可能会影响其他逻辑,此种更改最好是能限定在热点逻辑的这个范围内。
也可以在使用datetime类的时候指定时区信息,这样也可以获得UTC时间,如下为默认时区和指定UTC的输出结果,差了8个小时(北京时间UTC+8)
>>> datetime.datetime.now()
datetime.datetime(2017, 9, 18, 0, 28, 50, 666364)
>>> utc_tz = pytz.timezone('UTC')
>>> datetime.datetime.now(tz=utc_tz)
datetime.datetime(2017, 9, 17, 16, 28, 54, 535585, tzinfo=
要获取ISO格式的时间则可以调用datetime类中的isoformat函数:
>>> datetime.datetime.now().isoformat() '2017-09-18T00:30:50.587223' >>> datetime.datetime.now(tz=utc_tz).isoformat() '2017-09-17T16:30:58.410670+00:00'
这样也可以实现生成UTC时间的ISO格式功能,但是略显麻烦,help(datetime.datetime)查看发现已经有定义好的utc相关函数可以用了,utcnow函数就可以获得当前的utc标准时间:
>>> datetime.datetime.utcnow() datetime.datetime(2017, 9, 17, 16, 40, 18, 683716) >>> datetime.datetime.utcnow().isoformat() '2017-09-17T16:41:06.418447'
要限定时间范围,则可以通过datetime.timedelta类获得一个按天、秒或毫秒计数的时间区间,然后和当前时间相减即可得出起始时间了,例如起始时间为当前时间往前10天10秒0毫秒:
>>> td = datetime.timedelta(days=10,seconds=10,microseconds=0) >>> td datetime.timedelta(10, 10) >>> datetime.datetime.utcnow().isoformat() '2017-09-17T16:52:04.020059' >>> (datetime.datetime.utcnow() - td).isoformat() '2017-09-07T16:51:54.525088'