一個熱點統計需求,需要限定一個時間范圍,計算出該范圍內的熱點事件,相關數據則以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=<UTC>)
要獲取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'