Как мне реализовать 'tzinfo' для смещения текущего времени по Гринвичу на EST (GMT -4:00)?

Моя функция принимает строку даты и времени UTC в качестве параметра, преобразует ее в объект даты и времени, который затем мне нужно сместить на EST (GMT -4:00). Например, передача «2019-07-01T00:00:00Z» функции должна вернуть «30/06/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. Он показывает ожидаемый результат, только если я устанавливаю значения в «timedelta» функции «utcoffset» на timedelta(hours=1, minutes=30).

Обратите внимание, что я хочу реализовать это, используя только библиотеку datetime.


person Chandral    schedule 14.08.2019    source источник


Ответы (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(), вы можете обратиться к этой теме >> Как заставить python отображать текущее время (восточное)

person Chandral    schedule 14.08.2019