1. 程式人生 > >Python中date包/time包/datetime包的相關知識

Python中date包/time包/datetime包的相關知識

官方文件地址:https://docs.python.org/2.7/library/time.html#module-time

參考部落格:http://tech.glowing.com/cn/dealing-with-timezone-in-python/

需求:獲取某使用者所在時區對應伺服器所在時區的時間戳。

Python為我提供了datetime,time,calendar模組 常用的還有一個第三方模組pytz

datetime模組定義瞭如下類:

datetime.date     - 理想化的日期物件,假設使用格力高歷,有year, month, day三個屬性  
datetime.time     - 理想化的時間物件,不考慮閏秒(即認為一天總是24
*60*60秒),有hour, minute, second, microsecond, tzinfo五個屬性 datetime.datetime - datetime.date和datetime.time的組合 datetime.timedelta - 後面我們會用到的類,表示兩個datetime.date, datetime.time或者datetime.datetime之間的差。 datetime.tzinfo - 時區資訊

time模組提供了各種時間操作轉換的方法。

calendar模組則是提供日曆相關的方法。

pytz模組,使用Olson TZ Database

解決了跨平臺的時區計算一致性問題,解決了夏令時帶來的計算問題。由於國家和地區可以自己選擇時區以及是否使用夏令時,所以pytz模組在有需要的情況下得更新自己的時區以及夏令時相關的資訊。比如當前pytz版本的OLSON_VERSON = ‘2013g’, 就是包括了Morocco可以使用夏令時。

客戶端在收集使用者的timezone資訊時,常見的錯誤是:選擇儲存所在時區的偏移值,例如對於中國的時區,會儲存+8,但這樣顯然丟失了使用者所在的時區,即使是同樣的時間偏移,也可能對應多個國家和地區。其次,若使用者所在地區採用夏令時,這樣在每年開始和結束夏令時的時候,偏移值都會發生變化。

可以引入第三方模組pytz後檢視全球的時區timezon。


引入datetime.datetime

datetime.fromtimestamp()函式介紹

classmethod datetime.fromtimestamp(timestamp, tz=None)

Return the local date and time corresponding to the POSIX timestamp, such as is returned by time.time(). If optional argument tz is None or not specified, the timestamp is converted to the platform’s local date and time, and the returned datetime object is naive.

Else tz must be an instance of a class tzinfo subclass, and the timestamp is converted to tz‘s time zone. In this case the result is equivalent to tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

When you don't specify a time zone, not only does it use the local time zone, but the result is naive

具體如圖所示:

問題如下:int(time.mktime(time.strptime('2018-06-25', "%Y-%m-%d")))

當我們想將這個日期轉化為時間戳時,會出現一個問題。這個問題是由於伺服器所在時區不一致出現的。


mktime()函式是從local time算起 故當伺服器位於UTC時區時 不會出現問題 但當伺服器位於例如北京時區時,這個時候返回的時間戳就會少8個小時。再用gmtime()函式轉化為struct_time格式時 就會變成2018-06-24-16:00

解決方法:放棄mktime()函式  使用calendar.timegm()函式

或者int(time.mktime(time.strptime('2018-06-25', "%Y-%m-%d"))) -time.altzone

time.altzone的解釋:

The offset of the local DST timezone, in seconds west of UTC, if one is defined. This is negative if the local DST timezone is east of UTC (as in Western Europe, including the UK). Only use this if daylight is nonzero.