путаница с форматированием даты и времени в python

Поправьте меня, если я ошибаюсь, но предположим, что у нас есть дата:

Wed, 27 Jun 2018 11:20:33 -0500

Если мы используем дату и время в python для преобразования этого (datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500', '%a, %d %b %Y %H:%M:%S %z')), это генерирует время на 1 час больше, чем UTC, что составляет 12:20:33. Однако на самом деле это не должно быть UTC-5 (минус 5 часов). Я использую этот формат даты, который хранится в файле XML. Многие из них имеют -0500 или +0000 в конце метки времени. Я что-то упустил здесь?

import datetime
dt = datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500',
                                 '%a, %d %b %Y %H:%M:%S %z')
print(dt.timestamp())

print(datetime.datetime.fromtimestamp(int(dt.timestamp())).strftime('%Y-%m-%d %H:%M:%S'))

person dataviews    schedule 17.07.2018    source источник


Ответы (1)


Здесь правильно сгенерирован часовой пояс

>>> import datetime
>>> datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500', '%a, %d %b %Y %H:%M:%S %z')
datetime.datetime(2018, 6, 27, 11, 20, 33, tzinfo=datetime.timezone(datetime.timedelta(-1, 68400)))

datetime.timedelta(-1, 68400) означает -5 часов, что верно.

Вы должны добавить к своему вопросу все шаги, которые приводят к вашему «неправильному» результату, и то, что вы ожидаете вместо этого.

РЕДАКТИРОВАТЬ: Теперь, когда вы отредактировали свой вопрос - ваша проблема связана с использованием .timestamp() и .fromtimestamp() - эти методы не зависят от часового пояса, поэтому они не сохраняют информацию о часовом поясе.

Вы должны хранить его самостоятельно, если хотите:

t = datetime.datetime.strptime('Wed, 27 Jun 2018 11:20:33 -0500', '%a, %d %b %Y %H:%M:%S %z')

stamp = t.timestamp()
stored_zone = t.tzinfo

t2 = datetime.datetime.fromtimestamp(stamp, tz=stored_zone)

Это снова создаст эквивалентный объект datetime с тем же часовым поясом, поэтому t == t2

t3 = datetime.datetime.fromtimestamp(stamp, tz=datetime.timezone.utc)

Это снова сгенерирует ту же дату и время, но в часовом поясе utc, поэтому оно будет отображаться как 16:20, но внутри это то же время, все еще t == t3!!! Просто часовой пояс отличается, но оба представляют один и тот же момент времени.

Часовые пояса сбивают с толку. Я рекомендую читать документы несколько раз и тестировать все. Или просто используйте pytz.

person nosklo    schedule 17.07.2018
comment
так что я передаю в -0500, это не имеет отношения к тому, что конвертирует python? - person dataviews; 17.07.2018
comment
@dataviews Я не понимаю вопроса. Вы передали -0500 в строке. strptime проанализировал его и добавил к дате и времени информацию о часовом поясе минус пять часов. Что неверно? - person nosklo; 17.07.2018
comment
Теперь я добавил свой код. Когда я запускаю свой код, -0500 дает +1 час, а не минус 5 часов. - person dataviews; 17.07.2018
comment
Однако я пытаюсь достичь -5 часов. Я не уверен, почему это происходит с моей стороны. - person dataviews; 17.07.2018
comment
@dataviews ты CST? datetime.datetime.fromtimestamp генерирует дату и время по местному времени, а не по UTC, поэтому -0500 покажется вам +1 час. - person Adam Smith; 17.07.2018
comment
Я могу воспроизвести проблему, которую описывает @dataviews. Я в восточном времени. Я также получил результат 2018-06-27 12:20:33 но я также могу воспроизвести решение - person Hack-R; 17.07.2018
comment
Теперь я понимаю, что я сделал неправильно. Я попробовал ваше решение, но на выходе получаю: 2018-06-27 11:20:33-05:00. - person dataviews; 17.07.2018
comment
@dataviews добавил некоторые пояснения, надеюсь, это поможет - person nosklo; 17.07.2018
comment
Теперь я получаю 16:20:33 - person dataviews; 17.07.2018
comment
@dataviews точно, 11 это 16 - 5; поэтому, когда вы меняете часовой пояс на utc, вы получаете 16! - person nosklo; 17.07.2018
comment
То есть, если время показывает TIMESHOWN -0500, то это на самом деле не TIMESHOWN минус 5 часов? Я думал, что TIMESHOWN -0500 берет это время и минус 5 часов, чтобы получить конечное время. Но, может быть, я все время ошибался, и TIMESHOWN — это фактическое время, полученное после вычитания 5?? - person dataviews; 17.07.2018
comment
ВРЕМЯ -0500 означает, что ВРЕМЯ находится в часовом поясе минус 5 часов по сравнению с гринвичским UTC - это означает, что ВРЕМЯ на 5 часов отстает от UTC. Если вы используете UTC, вам нужно добавить 5 часов к TIME, чтобы получить NEW_TIME -0000 (UTC) - person nosklo; 17.07.2018
comment
После -05:00 Земля будет вращаться за 5 часов, а Солнце займет то же положение на небе в UTC, - person nosklo; 17.07.2018
comment
это имеет смысл. Большое спасибо за прекрасное объяснение! - person dataviews; 17.07.2018
comment
Знаете ли вы о библиотеке, которая поддерживает передачу нескольких различных строковых форматов, или в какой-то степени мне всегда нужно было бы определять директивы? - person dataviews; 18.07.2018