应对Birtish夏季时间

use*_*101 6 python pytz

我有一个18 May 14:30与英国夏季(WESTUTC+1)相对应的日期字符串。我想将其转换为中欧(夏季)时间。

这是我的代码

# from datetime import datetime
# from pytz import timezone

d = '18 May 14:30'
# Attempt 1
dd=datetime.strptime(d, '%d %b %H:%M').replace(year=datetime.now().year, tzinfo=timezone('WET'))
dd.astimezone(timezone('CET'))
# datetime.datetime(2019, 5, 18, 16, 30, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)
# It should be 15:30, not 16:30

# Attempt 2
dd=datetime.strptime(d, '%d %b %H:%M').replace(year=datetime.now().year, tzinfo=timezone('WET'))
# Same result as above

# Attempt 3
dd=datetime.strptime(d, '%d %b %H:%M').replace(year=datetime.now().year, tzinfo=timezone('Etc/GMT-1'))
dd.astimezone(timezone('CET'))
# datetime.datetime(2019, 5, 18, 15, 30, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)
# This works
Run Code Online (Sandbox Code Playgroud)

因此,我在第三次尝试中遇到的问题是必须手动指定,GMT-1CET 自动转换为CEST。我希望这对于WET(to WEST)同样适用。

此外,让我感到困惑的是,根据Wiki British UK的夏季时间应该是这样,UTC +1但我不得不设置GMT-1(作为GMT+1return 18:30)。

use*_*101 2

如果有人感兴趣,我确实找到了解决方法

dd=datetime.strptime(d, '%d %b %H:%M').replace(year=datetime.now().year)
timezone('WET').localize(dd).astimezone(timezone('CET'))
# datetime.datetime(2019, 5, 18, 15, 30, tzinfo=<DstTzInfo 'CET' CEST+2:00:00 DST>)
# Correct result without having to specify the shift

# Let's check with another date (non-summertime)
d = '18 Jan 14:30'
dd=datetime.strptime(d, '%d %b %H:%M').replace(year=datetime.now().year)
timezone('WET').localize(dd).astimezone(timezone('CET'))
# datetime.datetime(2019, 1, 18, 15, 30, tzinfo=<DstTzInfo 'CET' CET+1:00:00 STD>)
# Yay!
Run Code Online (Sandbox Code Playgroud)

它不是很优雅,但至少可以完成工作。