2015-11-21 2 views
1

Как я могу принять эту строку даты:Разбираем дату в определенном часовом поясе с Python

«2015-01-01»

и, предполагая, что в определенном часовом поясе (например, «Американо Mountain "), преобразуйте его в метку времени POSIX?

Как так:

magic_parse_function("2015-01-01", pytz.timezone("US-Mountain")) -> 1420095600 

Я провел некоторое время соскабливать документы и этот сайт, играя с осведомленными/не знает объекты даты и времени, и я надеясь для не-слишком- безумное решение. Ниже не работает, последние две строки вывода идентичны, и они должны быть 3600 секунд друг от друга:

import datetime 
import time 
import pytz 
timestring = "2015-01-01" 
pacific = pytz.timezone("US/Pacific") 
mountain = pytz.timezone("US/Mountain") 
(year, month, day) = timestring.split('-') 
year = int(year) 
month = int(month) 
day = int(day) 
unaware = datetime.datetime(year, month, day, 0, 0, 0, 0) 
# aware_pacific = pacific.localize(unaware) 
# aware_mountain = mountain.localize(unaware) 
aware_mountain = unaware.replace(tzinfo=mountain) 
aware_pacific = unaware.replace(tzinfo=pacific) 
print time.mktime(aware_pacific.timetuple()) 
print time.mktime(aware_mountain.timetuple()) 
+1

Предполагая, что полночь не обязательно правильная вещь. Не каждый часовой пояс * имеет * местную полночь на каждый день. Некоторые (например, Бразилия) пропускают с 23:59:59 до 01:00:00 в день весеннего перерыва DST. –

+0

Кроме того, похоже, что у вас есть решение, используя 'localize'. Почему вы прокомментировали это и заменили? –

+0

localize() void replace() не влияет на выход. Я думаю, проблема заключается в том, что timetuple() отбрасывает информацию о часовом поясе, поэтому я надеюсь, что кто-то скажет мне альтернативный (т. Е. Изящный) способ получить временную метку из известного объекта datetime. – shiftycow

ответ

2

Там находятся три шага:

  1. Преобразовать строку даты в наивным datetime объект:

    from datetime import datetime 
    
    dt = datetime(*map(int ,'2015-01-01'.split('-'))) 
    
  2. Получить часовой пояс-Aware DATETIME объект:

    import pytz # $ pip install pytz 
    
    aware = pytz.timezone("US/Mountain").localize(dt, is_dst=None) 
    

    is_dst=None вызывает исключение для неоднозначных или несуществующих времен. Here're more details about what is is_dst flag and why do you need it, see "Can I just always set is_dst=True?" section

  3. Получить POSIX метки:

    timestamp = aware.timestamp() 
    

    .timestamp() доступна начиная с Python 3.3+. См. multiple solutions for older Python versions.

+0

Может быть предпочтительнее 'datetime.strptime (" 2015-01-01 ","% Y-% m-% d ")' вместо 'datetime (* map (int, ' 2015-01-01'.split ('-'))) '. –

+0

@TreyHunner: '.strptime()' более мощный и более точный. Его следует использовать в целом. В этом примере я выбрал более простой (более понятные сообщения об ошибках, например, pass ''2015-01-32'') более явный и более эффективный код, который не требует, чтобы OP знала коды формата strftime. – jfs

+0

Я пришел с помощью решения timedelta, чтобы получить отметку времени UNIX в связанном ответе. Я надеялся на что-то менее «уродливое», но я думаю, мне нужно будет перейти на Python3 для этого. Кроме того, я использую strptime в реальной реализации. Тем не менее, карта * - это классный трюк. – shiftycow