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模組則是提供日曆相關的方法。
客戶端在收集使用者的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.