Получить смещение tz от строки

У меня есть дата по местному времени:

date: "2013-12-02 22:00:00"

и другое значение tz:

timezone_offset: "GMT-0800"

Если я: dateutil.parser.parse(date).isoformat() Я получу:

"2013-12-02T22:00:00+0000"

Я хочу реализовать date в формате ISO с информацией tz и получить результат:

"2013-12-02T22:00:00-0800"

Нечто близкое к: parse(date,tzinfos=??).isoformat()? Как я могу получить tz info из строки timezone_offset?

2 ответа

Решение
>>> from dateutil.parser import parse
>>> dt = parse("2013-12-02 22:00:00" + "GMT+0800")
>>> dt.isoformat()
'2013-12-02T22:00:00-08:00'

Примечание: знак перевернут.

Вы также можете сделать это, используя только stdlib:

>>> from datetime import datetime
>>> dt = datetime.strptime("2013-12-02 22:00:00", "%Y-%m-%d %H:%M:%S")
>>> dt = dt.replace(tzinfo=FixedOffset(-8*60, "GMT+0800"))
>>> dt.isoformat()
'2013-12-02T22:00:00-08:00'

где FixedOffset взят из datetime документы:

from datetime import tzinfo, timedelta

class FixedOffset(tzinfo):
    """Fixed offset in minutes east from UTC."""

    def __init__(self, offset, name):
        self.__offset = timedelta(minutes = offset)
        self.__name = name

    def utcoffset(self, dt):
        return self.__offset

    def tzname(self, dt):
        return self.__name

    def dst(self, dt):
        return timedelta(0)

Вот то же самое, используя pytz модуль:

>>> from datetime import datetime
>>> import pytz
>>> dt = datetime.strptime("2013-12-02 22:00:00", "%Y-%m-%d %H:%M:%S")
>>> dt = pytz.timezone('Etc/GMT+8').localize(dt)
>>> dt.isoformat()
'2013-12-02T22:00:00-08:00'

Вот два подхода, которые вы можете использовать:

>>> import datetime
>>> dtnow = datetime.datetime.now();dtutcnow = datetime.datetime.utcnow()
>>> dtnow
datetime.datetime(2013, 11, 12, 9, 10, 48, 404000)
>>> dtutcnow
datetime.datetime(2013, 11, 12, 15, 10, 48, 404000)
>>> delta = dtnow - dtutcnow
>>> delta
datetime.timedelta(-1, 64800)
>>> hh,mm = divmod((delta.days * 24*60*60 + delta.seconds + 30) // 60, 60)
>>> hh,mm
(-6, 0)
>>> "%s%+02d:%02d" % (dtnow.isoformat(), hh, mm)
'2013-11-12T09:10:48.404000-6:00'

Или это:

>>> import datetime, pytz # 3rd Party
>>> datetime.datetime.now(pytz.timezone('US/Central')).strftime('%Y-%m-%dT%H:%M:%S.%f%z')
'2013-11-12T09:15:20.688000-0600'
>>> 

Основным преимуществом второго метода является то, что ваша строка времени "осведомлена о часовом поясе". Из документов:

Существует два вида объектов даты и времени: "наивный" и "осведомленный". Это различие относится к тому, имеет ли объект какое-либо представление о часовом поясе, переходе на летнее время или другом алгоритмическом или политическом регулировании времени. Независимо от того, представляет ли наивный объект даты / времени всемирное координированное время (UTC), местное время или время в каком-либо другом часовом поясе, зависит только от программы, точно так же, как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты даты и времени легко понять и работать с ними за счет игнорирования некоторых аспектов реальности.

Надеюсь это поможет!

Другие вопросы по тегам