时区不正确

时间:2017-12-26 15:15:01

标签: python python-3.x datetime timezone

我想在用户输入日期和时间时获取时区。时间。我住在中欧,冬天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

1 个答案:

答案 0 :(得分:1)

time.strftime('%z %Z', tuple)返回本地计算机当前正在使用的UTC偏移量和时区缩写的字符串表示。它并不试图弄清楚元组属于哪个时区。

要做到这一点,需要查找夏令时的时间边界和 给定时区的相应utcoffsets。这些信息在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