Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何实现';tzinfo&x27;是否将当前格林尼治标准时间偏移到美国东部时间(格林尼治标准时间-4:00)?_Python_Python 3.x_Datetime_Tzinfo - Fatal编程技术网

Python 如何实现';tzinfo&x27;是否将当前格林尼治标准时间偏移到美国东部时间(格林尼治标准时间-4:00)?

Python 如何实现';tzinfo&x27;是否将当前格林尼治标准时间偏移到美国东部时间(格林尼治标准时间-4:00)?,python,python-3.x,datetime,tzinfo,Python,Python 3.x,Datetime,Tzinfo,我的函数将UTC datetime字符串作为参数,将其转换为datetime对象,然后需要将其偏移到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):

我的函数将UTC datetime字符串作为参数,将其转换为datetime对象,然后需要将其偏移到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(小时=1,分钟=30)
时,它才会显示预期结果


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

我找到了解决方案。我错误地推断,
print(dt_object.astimezone(EST())
实现了EST()类相对于上述语句中分配的
dt_object
的时间戳的偏移量。它实际上是根据运行代码时的UTC时间实现的。因此,在实现我的类之前,我必须首先将
dtu对象的时区设置为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()
方法调整夏令时,可以参考此线程>>