Многие временные метки подразумевают часовой пояс. Чтобы гарантировать, что ваш код будет работать в каждом часовом поясе, вы должны использовать UTC внутренне и прикреплять часовой пояс каждый раз, когда посторонний объект входит в систему.
Python 3.2+:
>>> datetime.datetime.strptime(
... "March 5, 2014, 20:13:50", "%B %d, %Y, %H:%M:%S"
... ).replace(tzinfo=datetime.timezone(datetime.timedelta(hours=-3)))
Предполагается, что вы знаете смещение. Если вы этого не сделаете, но знаете, например, местоположение, вы можете использовать пакет pytz
для запроса смещения в базе данных часовых поясов IANA. Я буду использовать Тегеран в качестве примера, потому что у него есть получасовое смещение:
>>> tehran = pytz.timezone("Asia/Tehran")
>>> local_time = tehran.localize(
... datetime.datetime.strptime("March 5, 2014, 20:13:50",
... "%B %d, %Y, %H:%M:%S")
... )
>>> local_time
datetime.datetime(2014, 3, 5, 20, 13, 50, tzinfo=<DstTzInfo 'Asia/Tehran' +0330+3:30:00 STD>)
Как видите, pytz
определил, что смещение было +3:30 в эту конкретную дату. Теперь вы можете преобразовать это время в UTC, и оно применит смещение:
>>> utc_time = local_time.astimezone(pytz.utc)
>>> utc_time
datetime.datetime(2014, 3, 5, 16, 43, 50, tzinfo=<UTC>)
Обратите внимание, что даты до принятия часовых поясов дадут вам странные смещения. Это связано с тем, что IANA решило использовать среднее местное время:
>>> chicago = pytz.timezone("America/Chicago")
>>> weird_time = chicago.localize(
... datetime.datetime.strptime("November 18, 1883, 11:00:00",
... "%B %d, %Y, %H:%M:%S")
... )
>>> weird_time.astimezone(pytz.utc)
datetime.datetime(1883, 11, 18, 7, 34, tzinfo=<UTC>)
Странные 34 секунды получены из долготы Чикаго. Я использовал эту дату, потому что это день, когда было усыновлен в Чикаго.
person
Janus Troelsen
schedule
06.03.2014
strptime()
сведет вас с ума, если вы его не завернете. См. Мой ответ, основанный на или ответе Вайса на это - person smci   schedule 15.12.2017datetime.strptime
, как упоминали другие. Для тех, кто предпочитает видеообъяснения, см. здесь. - person Ben   schedule 03.02.2021