2012-05-07 2 views
15

Я пишу веб-клиент электронной почты на Python, и возник вопрос о том, в каком часовом поясе должен отображаться заголовок «Дата» электронного письма при отправке.Должен ли почтовый заголовок «Дата» быть местным отправителем или UTC?

RFC 2822 состояния в разделе 3.3, что:

Дата и время-день следует выразить по местному времени.

Это кажется двусмысленным для меня; вопрос - местное время, кто? Сервер электронной почты или отправитель? Естественно, я предполагаю отправителя (который может находиться в любом часовом поясе и может быть изменен в настройках учетной записи). Дальнейшее замешательство возникло, когда я просмотрел функцию email.utils.formatdate Python, которая, кажется, предлагает только две альтернативы: UTC или местное время (на сервере). Мне кажется, что нет возможности указать альтернативный часовой пояс, или я что-то упускаю?

Передача timeval для форматирования с использованием time.mktime(senders_tz_aware_now_datetime.timetuple()) приводит к дате строки UTC, которая чувствует себя неправильно, учитывая то, что RFC говорит выше.

Итак, какой часовой пояс должен быть «Дата», и существует ли какая-либо стандартная функция для создания соответствующей строки даты?

ответ

2

Просто используйте UTC, и вы станете счастливее.

Это то, что происходит, когда спецификации используют такие термины, как СЛЕДУЕТ. Я думаю, что оба СЛЕДУЮТ могут быть запрещены спецификациями, потому что они всегда создают ненужную сложность.

Использование UTC совершенно верно.

+0

Это не будет сделано, я конвертирую объект datetime, содержащий информацию о часовом поясе, используя метод timetuple, который означает, что is_dst уже установлен. Также он не отвечает на мой вопрос о том, что такое правильное представление даты. – kuhnza

+1

Изменил мой разум, проделайте легкий путь, и вы успеете выпить пиво вечером. – sorin

+1

Ха-ха Мне нравится ваш стиль. Тем не менее, я хотел бы получить некоторую идею о том, как это обычно обрабатывается, поскольку я предполагаю, что это имеет последствия для целого ряда почтовых клиентов, о которых я никогда не слышал, не говоря уже о том, чтобы иметь время или ресурсы для тестирования. – kuhnza

8

Если вы хотите присоединиться к RFC, пройдите localtime=True, который возвращает строку даты с местным временем и в нужном часовом поясе (при условии, что вы правильно настроили его).

>>> email.utils.formatdate(localtime=True) 
'Mon, 07 May 2012 12:09:16 -0700' 

Без localtime=True вы получите строку даты, представляющую время UTC:

>>> email.utils.formatdate() 
'Mon, 07 May 2012 19:08:55 -0000' 

-0000 по-видимому, указывает на UTC, хотя RFC специально рекомендует использовать +0000. Не уверен, что это ошибка в email.utils.

Вот соответствующий питон документация:

Дополнительный LocalTime является флагом, когда Правда, интерпретирует формат: первый формат, и возвращает дату по отношению к местному часовому поясу, а не UTC, должным образом принимая летнее время во внимание. Значение по умолчанию - False означает, что используется UTC.

+0

Спасибо, конечно, это то, что мы изначально думали, сделало бы трюк. К сожалению, ваш ответ поднимает тот самый вопрос, который меня озадачивает: что такое «правильный часовой пояс»? Установка 'localtime = True' возвращает часовой пояс сервера, а не отправителя. Следовательно, мой вопрос, должен ли он быть местным часовым поясом сервера или отправителя? Можно предположить, что часовой пояс отправителя - это правильная вещь. Однако в этом случае я не могу видеть formatdate, предоставляя необходимые функции для этого. – kuhnza

+2

Не имеет значения, в какой временной зоне отправитель находится до тех пор, пока вы создаете согласованную метку времени, которая представляет время, в которое было отправлено электронное письмо. Клиент-получатель должен правильно интерпретировать его. Вот почему @Sorin предложил идти с UTC, что является самым простым способом. – spinlok

+0

Я согласен с тем, что это не имеет значения, но меня беспокоит, что RFC говорит, что ДОЛЖНО появляться как местное время. – kuhnza

0

Это относится к первому результату при поиске по запросу «местное время электронной почты клиента»; к сожалению, два ответа и сопроводительные комментарии едва затрагивают реализацию python и не позволяют полностью поговорить с сюжетной линией (это то, что кормит ответ Google).

RFC однозначен, потому что это очевидно: заголовок «^ Date:» является локальным в момент его написания. Почтовый клиент обычно записывает заголовок «^ Date:» (в любой из многих реализаций, которые я рассматривал). Для большинства (настроенных) клиентов это будет местное время, о котором сообщается операционной системой клиента.

В случае веб-почты местное время может быть предоставлено агентом пользователя (который в свою очередь получает локальное время от ОС). Более типично он будет установлен пользователем в веб-приложении (a la gmail).

Важно отметить, что если вы «следуете RFC» (вероятно, хорошая идея для сетевого протокола), результатом поведения клиентов RECEIVING будет, как правило, дата, когда почта была отправлена, как видно отправителю. В этом весь смысл «СЛЕДУЕТ» в RFC. Я не хочу видеть UTC, пытаясь выяснить, в какое время коллега отправил электронное письмо; Я хочу их местное время. Таким образом, я могу понять разницу во времени на один шаг (их местное время для моего), а не два (их местное время до UTC до моего местного времени). Я также получаю немедленные подсказки о контексте их сообщений (было ли это ночное рабочее время? И т. Д.).

Смежные вопросы