Получить смещение 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() ? Как я могу получить tzinfo из строки timezone_offset?


person Diolor    schedule 12.11.2013    source источник
comment
Откуда вы берете функцию parse?   -  person jazzpi    schedule 12.11.2013
comment
@jazzpi dateutil.parser.parse() Я обновил свой вопрос.   -  person Diolor    schedule 12.11.2013


Ответы (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'
person jfs    schedule 13.11.2013

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

>>> 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'
>>> 

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

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

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

person Drewness    schedule 12.11.2013