如何实现 'tzinfo' 以将当前 GMT 偏移到 EST (GMT -4:00)?
How do I implement 'tzinfo' to offset current GMT to EST (GMT -4:00)?
我的函数将 UTC 日期时间字符串作为参数,将其转换为日期时间对象,然后我需要将其偏移到 EST(GMT -4:00)。例如,将“2019-07-01T00:00:00Z”传递给函数应该 return “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()))
最后一个 print 语句的预期输出是 2019-06-30 20:00:00-04:00 但程序 returns 2019-06-30 14:30:00-04:00。仅当我将 'utcoffset' 函数的 'timedelta' 中的值设置为 timedelta(hours=1, minutes=30)
.
时,它才会显示预期结果
请注意,我只想使用 'datetime' 库来实现它。
我找到了解决办法。我错误地得出结论,print(dt_object.astimezone(EST()))
正在实现 EST() class 相对于上述语句中分配的 dt_object
时间戳的偏移量。 运行代码的那一刻其实是按照UTC时间来实现的。所以在实现我的 class 之前,我必须首先将 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)
我的函数将 UTC 日期时间字符串作为参数,将其转换为日期时间对象,然后我需要将其偏移到 EST(GMT -4:00)。例如,将“2019-07-01T00:00:00Z”传递给函数应该 return “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()))
最后一个 print 语句的预期输出是 2019-06-30 20:00:00-04:00 但程序 returns 2019-06-30 14:30:00-04:00。仅当我将 'utcoffset' 函数的 'timedelta' 中的值设置为 timedelta(hours=1, minutes=30)
.
请注意,我只想使用 'datetime' 库来实现它。
我找到了解决办法。我错误地得出结论,print(dt_object.astimezone(EST()))
正在实现 EST() class 相对于上述语句中分配的 dt_object
时间戳的偏移量。 运行代码的那一刻其实是按照UTC时间来实现的。所以在实现我的 class 之前,我必须首先将 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)