2016-09-08 5 views
1

У меня есть данные от человека в формате YYYY-MM-DD HH:MM:SS, который, как я знаю, должен быть местным временем в Лос-Анджелесе. В Python, как мне преобразовать это в объект datetime.datetime, который однозначен и правилен? Я знаю, что ввод является неоднозначным во время осеннего перехода из ДСТ; Я в порядке с любым выбором, который случается в течение этого часа, пока он детерминирован.Python: как правильно преобразовать из даты строки в определенный часовой пояс?

Вот моя попытка, что я с удивлением обнаружил, не работает:

>>> import pytz 
>>> from dateutil import parser as date_parser 
>>> PACIFIC = pytz.timezone('US/Pacific') 
>>> result = date_parser.parse('2016-08-01 00:00:00 FOO', tzinfos={'FOO': PACIFIC}) 
>>> result.utcoffset() 
datetime.timedelta(-1, 57600) 
>>> str(result) 
'2016-08-01 00:00:00-08:00' 

Несмотря на то, попросил US/Pacific и это является датой летом, я получаю UTC-8 вместо UTC-7 ,

+0

Проблема здесь в том, что 'pytz' часовых поясов не может быть легко крепится таким образом. Вы должны использовать 'PACIFIC.localize()' на возвращаемом объекте 'datetime.datetime'. Не беспокойтесь о 'tzinfos', если вы используете один известный часовой пояс для всех дат. – Paul

+0

О, также, если вы знаете формат даты и часовой пояс, не используйте 'dateutil.parser', он неэффективен и не применяет формат (так что ошибки в формате могут все же давать дату, но неверный). Используйте 'datetime.strptime' – Paul

+0

Спасибо @Paul; не возражаете ли вы превратить это в обработанный пример в качестве ответа? – jacobsa

ответ

0

Я нашел This, что может помочь. Отрубив его немного, я получил -0700, который вы ищете. Я должен признать, что я не понимаю этот модуль, поэтому не могу указать, где вы можете быстро исправить свой код (и я не использую python в командной строке), но ниже работает.

import datetime 
import pytz 

def report(time): 
    mytz = pytz.timezone('US/Pacific') 
    dtformat = "%Y-%m-%d %H:%M" 
    t = datetime.datetime.strptime(time, dtformat).replace(tzinfo=pytz.utc) 
    print ("*****") 
    print (t) 
    print (mytz.normalize(t)) 

report("2011-08-01 00:00") 

Итак, надеюсь, что это поможет!

+0

Это полезно, но дает неправильный ответ. Результатом последнего заявления печати является '2011-07-31 17: 00: 00-07: 00', но я ищу' 2011-08-01 00: 00: 00-07: 00'. – jacobsa

0

Для этого вы можете использовать dateparser.

import dateparser >>> dateparser.parse('2016-08-01 00:00:00', settings={'TIMEZONE': 'US/Pacific', 'TO_TIMEZONE': 'UTC'}) datetime.datetime(2016, 8, 1, 7, 0)