【问题标题】:How can I have BST datetime objects?我怎样才能拥有 BST 日期时间对象?
【发布时间】:2019-09-18 22:10:57
【问题描述】:

我正在尝试比较许多有意识的日期时间对象。我找到了pytz,但还没有找到 BST 时区或如何创建自定义时区,因此我可以在英国夏令时使用 UTC+1。无论如何,我想出了一个可行的解决方法,但我很确定还有另一种更好的方法,所以我在下面分享它。

基于timeanddate.com 代表伦敦,这是我感兴趣的地区:

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

比较是正确的,但可视化效果不是很好,因为它们都将“欧洲/伦敦”作为时区返回。所以我很难理解 datetime 对象是在伦敦的 BST 时间还是伦敦的 UTC 时间。

您还会注意到,我将时区强制设置为日期 2019-04-25。时区应该是 BST,但我也强制它是 UTC 时区。我将在我的脚本中对对象强制使用时区,因为我是从 .csvs 中读取它们的,它们被读取为字符串而不是日期时间对象。

所以我的最后一个问题是,我怎样才能拥有带有 BST 的日期时间对象?

【问题讨论】:

  • pytz 在地理意义上使用 zone(明显的例外是 GMT 和 UTC):您可以映射它们。在有 DST 的地区,与 UTC 有 2 个偏移,如 EST/EDT。偏移量也称为 timezones,但使用这种含义会导致时间和空间之间的混淆,例如 Windows 注册表中 GMT Standard TimeGMT Daylight Time 的条目i>,这两者都不存在于雷德蒙德之外。说亚利桑那州夏季是山区时间,冬季是太平洋时间并不意味着凤凰城在 3 月神奇地向西移动了 1800 公里,只是它的 UTC 偏移量保持不变。

标签: python datetime pytz


【解决方案1】:

要检查日期时间是否在 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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多