我试图比较许多有意识的日期时间对象。我找到了pytz
,但没有找到BST时区或如何创建自定义时区,所以我可以在英国夏季时间使用UTC + 1。无论如何,我想出了一个有效的解决方法,但我很确定还有另一种更好的方式,所以我在下面分享它。
基于timeanddate.com for London,这是我感兴趣的领域:
2019年3月31日星期日,01:00:00时钟转发1小时至2019年3月31日星期日,当地白天时间02:00:00。
所以tz_1和tz_2应该是UTC,而tz_3应该是BST。
import datetime
import pytz
tz_1 = pytz.timezone('Europe/London').localize(datetime.datetime(2019, 3, 30, 9, 15)).tzinfo
tz_2 = pytz.timezone('Europe/London').localize(datetime.datetime(2019, 3, 31, 9, 15)).tzinfo
tz_3 = pytz.timezone('Europe/London').localize(datetime.datetime(2019, 4, 1, 9, 15)).tzinfo
date1 = datetime.datetime(2019 , 4, 25, tzinfo = tz_1)
date2 = datetime.datetime(2019 , 4, 25, tzinfo = tz_2)
date3 = datetime.datetime(2019 , 4, 25, tzinfo = tz_3)
utc_date = datetime.datetime(2019, 4, 25, tzinfo = pytz.UTC)
print ("Date 1: ", date1, date1.tzinfo) # Timezone returns Europe/London
print ("Date 2: ", date1, date2.tzinfo) # Timezone returns Europe/London
print ("Date 3: ", date1, date3.tzinfo) # Timezone returns Europe/London
print ("UTC date: ", utc_date, utc_date.tzinfo) # Timezone returns UTC
print (date1 > date2) # returns True
print (date2 > date3) # returns False
print (date3 > date1) # returns False
比较是正确的,但可视化并不是那么好,因为所有这些都将“欧洲/伦敦”作为时区返回。因此,我很难理解日期时间对象是在伦敦的BST时间还是伦敦的UTC时间。
另外你会注意到我正在将时区强制到2019-04-25。时区应该是BST,但我也强制它是UTC时区。我将在我的脚本中强制将时区用于对象,因为我从.csvs读取它们并且它们被读作字符串而不是日期时间对象。
所以我的最后一个问题是,如何使用BST获得日期时间对象?
要检查日期时间是否在BST(英国夏令时)内,请检查时区对象的dst()
(夏令时调整)功能:
print('Is Summer time?')
print(date1, tz_1.dst(date1) != datetime.timedelta(0))
print(date2, tz_2.dst(date2) != datetime.timedelta(0))
print(date3, tz_3.dst(date3) != datetime.timedelta(0))