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

时间:2019-08-14 07:09:28

标签: python python-3.x datetime tzinfo

我的函数将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)时,它才会显示预期的结果。

请注意,我只想使用“ datetime”库实现此功能。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我错误地得出结论,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)