如何实现“tzinfo”以将当前 GMT 偏移到 EST(GMT -4:00)?

Posted

技术标签:

【中文标题】如何实现“tzinfo”以将当前 GMT 偏移到 EST(GMT -4:00)?【英文标题】:How do I implement 'tzinfo' to offset current GMT to EST (GMT -4:00)? 【发布时间】:2019-12-20 17:14:06 【问题描述】:

我的函数将 UTC 日期时间字符串作为参数,将其转换为日期时间对象,然后我需要将其偏移到 EST(GMT -4:00)。例如,将“2019-07-01T00:00:00Z”传递给函数应返回“06/30/2019 08:00:00”。

以下是我如何实现“tzinfo”的子类及其标准方法。

from datetime import datetime, tzinfo, timedelta

class EST(tzinfo):

    def tzname(self, dt):
        return "US/Eastern"

    def utcoffset(self, dt):
        return timedelta(hours=-4) + self.dst(dt)

    def dst(self, dt):
        return timedelta(0)


TEST_UTC = "2019-07-01T00:00:00Z"
dt_object = datetime.strptime(TEST_UTC, "%Y-%m-%dT%H:%M:%SZ")  # String to datetime object -> 2019-07-01 00:00:00
print(dt_object.astimezone(EST()))

最后一个打印语句的预期输出是 2019-06-30 20:00:00-04:00 但程序返回 2019-06-30 14:30:00 -04:00。仅当我将 'utcoffset' 函数的 'timedelta' 中的值设置为 timedelta(hours=1, minutes=30) 时,它才会显示预期结果。

请注意,我只想使用“日期时间”库来实现这一点。

【问题讨论】:

【参考方案1】:

我找到了解决方案。我错误地得出结论,print(dt_object.astimezone(EST())) 正在实现 EST() 类相对于上面语句中分配的dt_object 时间戳的偏移量。它实际上是根据运行代码时的 UTC 时间来实现的。所以在实施我的课程之前,我必须先将dt_object 的时区设置为UTC,然后用EST() 进行偏移。这是我使用的代码。

from datetime import datetime, timedelta, tzinfo, timezone

class EST(tzinfo):
    def utcoffset(self, dt):
        return timedelta(hours=-4) + self.dst(dt)

    def dst(self, dt):
        return timedelta(0)

    def tzname(self, dt):
        return "US/Eastern"


def utc_to_eastern(utc_timestring):
    dt = datetime.strptime(utc_timestring, "%Y-%m-%dT%H:%M:%SZ")
    dt = dt.replace(tzinfo=timezone.utc) # This was the step I missed earlier
    dt = dt.astimezone(EST())
    return dt


TEST_UTC = "2019-07-01T00:00:00Z"
print(utc_to_eastern(TEST_UTC))

注意:如果你也想使用dst()方法调整夏令时,你可以参考这个帖子>>How to get python to display current time (eastern)

【讨论】:

以上是关于如何实现“tzinfo”以将当前 GMT 偏移到 EST(GMT -4:00)?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Elm中以GMT显示当前时区偏移量

以毫秒为单位偏移当前系统时间到时区 GMT

当 pytz.timezone() 传递给 tzinfo 时,pytz 返回 LMT 时区而不是 GMT

如何在 MySQL 服务器中使用 DATETIME 存储 GMT 偏移量

MySQL 查询当前 GMT 时间

带有 pytz 时区的日期时间。不同的偏移量取决于 tzinfo 的设置方式[重复]