Есть ли лучший подход для преобразования объектов datetime.datetime из gmt в pst? - PullRequest
0 голосов
/ 14 февраля 2019

Я выполняю запрос через python в aws и получаю результаты sql в кортежах, которые состоят из объектов datetime.

пример записи:

'('BlaBla', '20190212', 'Blabla', 'job_name', 
  datetime.datetime(2019, 2, 13, 18, 4, 41),
  datetime.datetime(2019, 2, 13, 18, 4, 43))'

Я использую логику вышезапись и преобразование в ниже

['BlaBla', '20190212', 'BlaBla', 'jobname', 
 '2019-02-13 14:26:49',
 '2019-02-13 14:26:52']

К вашему сведению, времена не совпадают, я вставил вторую запись в качестве образца.Время в GMT

Теперь у меня есть список кортежей. Как мне преобразовать объекты datetime кортежа в PST?

Я посмотрел на функцию astimezone, но получаю

ValueError: astimezone() cannot be applied to a naive datetime

также я пытался

d = local_tz.localize(datetime(2019, 2, 13, 17, 1, 27),is_dst=None)

получать ошибки, кажется, ничего не работает ..

TypeError: 'module' object is not callable

Любая помощь будет очень признательна ..

1 Ответ

0 голосов
/ 14 февраля 2019

Вот мое решение, основанное на документации питона .Мне интересно, если я что-то упустил где-то, с необходимостью создать все эти подклассы tzinfo с нуля.Я ожидаю, что они будут частью библиотеки datetime, если честно.

from datetime import tzinfo, timedelta, datetime

ZERO = timedelta(0)
HOUR = timedelta(hours=1)

# A UTC class.

class UTC(tzinfo):
    """UTC"""

    def utcoffset(self, dt):
        return ZERO

    def tzname(self, dt):
        return "UTC"

    def dst(self, dt):
        return ZERO

class PST(tzinfo):
    """PST"""

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

    def tzname(self, dt):
        return "PST"

    def dst(self, dt):
        # DST starts last Sunday in March
        d = datetime(dt.year, 4, 1)   # ends last Sunday in October
        self.dston = d - timedelta(days=d.weekday() + 1)
        d = datetime(dt.year, 11, 1)
        self.dstoff = d - timedelta(days=d.weekday() + 1)
        if self.dston <=  dt.replace(tzinfo=None) < self.dstoff:
            return timedelta(hours=1)
        else:
            return timedelta(0)

utc = UTC()
pst = PST()

>>>dt1 = datetime(2019,2,13,14,26,49, tzinfo=utc)
datetime.datetime(2019, 2, 13, 14, 26, 49, tzinfo=<dtime_test.UTC object at 0x00000180AF6F1F60>)

>>>dt1.astimezone(pst)
datetime.datetime(2019, 2, 13, 22, 26, 49, tzinfo=<dtime_test.PST object at 0x00000180AF934080>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...