Получить смещение 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), местное время или время в каком-либо другом часовом поясе, зависит только от программы, точно так же, как от программы зависит, представляет ли конкретное число метры, мили или массу. Наивные объекты даты и времени легко понять и работать с ними за счет игнорирования некоторых аспектов реальности.
Надеюсь это поможет!