我想在用户输入日期和时间时获取时区。我住在中欧,冬天UTC + 001和夏天UTC + 002。问题是,我测试过蟒蛇,冬天和夏天,总是给夏天时间UTC + 002。
例:
import time
a=time.strptime("13 00 00 30 May 2017", "%H %M %S %d %b %Y")
a_s = time.mktime(a) # to convert in seconds
time.localtime(a_s) #local time
Output>>> time.struct_time(tm_year=2017, tm_mon=5, tm_mday=30, tm_hour=13, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=150, tm_isdst=1)
time.gmtime(a_s) # UTC time
Output>>> time.struct_time(tm_year=2017, tm_mon=5, tm_mday=30, tm_hour=11, tm_min=0, tm_sec=0, tm_wday=1, tm_yday=150, tm_isdst=0)
#Now the Winter
b = time.strptime("13 00 00 20 Dec 2017", "%H %M %S %d %b %Y")
b_s = time.mktime(b)
time.localtime(b_s)
Output>>> time.struct_time(tm_year=2017, tm_mon=12, tm_mday=20, tm_hour=13, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=354, tm_isdst=0)
time.gmtime(b_s)
Output>>>time.struct_time(tm_year=2017, tm_mon=12, tm_mday=20, tm_hour=12, tm_min=0, tm_sec=0, tm_wday=2, tm_yday=354, tm_isdst=0)
time.strftime("%H:%M:%S %z %Z",a)
Output>>>'13:00:00 +0200 Central European Summer Time'
time.strftime("%H:%M:%S %z %Z",b)
Output>>> '13:00:00 +0200 Central European Summer Time' #Wrong should be +0100 and Central European Time
time.strftime('%z %Z', tuple)
返回本地计算机当前使用的UTC偏移和时区缩写的字符串表示形式。它并不试图弄清楚元组属于哪个时区。
要做到这一点,需要查找夏令时时间边界和给定时区的相应utcoffset。这些信息在tz ("Olson") database中,在Python中,大多数人将这份工作委托给pytz module。
import time
import datetime as DT
import pytz
FMT = "%H:%M:%S %z %Z"
tz = pytz.timezone('Europe/Berlin')
for datestring in ["13 00 00 30 May 2017", "13 00 00 20 Dec 2017"]:
a = time.strptime(datestring, "%H %M %S %d %b %Y")
a_s = time.mktime(a)
# naive datetimes are not associated to a timezone
naive_date = DT.datetime.fromtimestamp(a_s)
# use `tz.localize` to make naive datetimes "timezone aware"
timezone_aware_date = tz.localize(date, is_dst=None)
print(timezone_aware_date.strftime(FMT))
版画
13:00:00 +0200 CEST
13:00:00 +0100 CET