Да, это немного сбивает меня с толку, поэтому я попытаюсь объяснить сверху!
У меня есть веб-приложение rails. Это внутреннее приложение компании, и оно будет использоваться только в Великобритании. Одной из функций приложения является управление собраниями. У встреч есть дата и время начала. В форме есть средство выбора даты/времени, которое позволяет пользователю выбрать дату и время встречи. Я сохраняю эту дату КАК ЕСТЬ в базе данных. Все встречи длятся 2 часа, поэтому время окончания просто начало + 2 часа.
Пример:
2013-06-23 6:45PM in the form is stored in the db as 2013-06-23 18:45:00
2013-12-23 6.45pm in the form is stored in the db as 2013-12-23 18:45:00
Обратите внимание, что первая дата указана во время летнего времени (BST), а вторая — во время GMT. Мне на самом деле все равно, GMT это или BST: встреча происходит в это время, абсолютно.
Внутри веб-приложения rails я просто распечатываю точную дату и время из БД — конечно, в красивом формате!
Теперь в какой-то момент я отправляю электронное письмо организатору встречи и человеку, с которым они встречаются. Это электронное письмо сообщает им дату и время встречи и т. д., а также включает файл iCal (.ics), который они могут поместить в свой календарь (обычно Outlook, но также Apple или Gmail).
Проблема, с которой я сталкиваюсь, заключается в том, что (используя приведенные выше примеры) Outlook показывает собрания следующим образом:
Meeting #1: Start: 23/06/2013 7:45pm, End: 23/06/2013 9:45pm
Meeting #2: Start: 23/12/2013 6:45pm, End: 23/12/2013 8:45pm
Обратите внимание, что он скорректировал первый из-за BST/GMT.
Текст файла .ics содержит этот код:
Встреча №1:
BEGIN:VCALENDAR
...
DTEND:20130623T204500Z
DTSTART:20130623T184500Z
...
END:VCALENDAR
Встреча №2:
BEGIN:VCALENDAR
...
DTEND:20131223T204500Z
DTSTART:20131223T184500Z
...
END:VCALENDAR
Поэтому я кодирую даты/время, используя часовой пояс Z (UTC). Я понимаю, почему Outlook неправильно конвертирует время UTC в время BST для № 1 и оставляет № 2 в покое (потому что GMT == UTC)
Мой вопрос: как мне остановить это происходит? Я хочу, чтобы время, на которое запланировано собрание, было абсолютным, фактическим временем, независимо от GMT/BST: 18:45.
Должен ли я хранить дату и время в формате UTC в БД? Как это будет сделано (я предполагаю, что это будет применяться ко всем датам, а не только к датам начала встречи). И как повторно преобразовать их обратно в фактическое время и дату, когда я отображаю их в веб-приложении?
Дополнительно: у меня есть запись в моем файле initializers/time_formats.rb, например:
:ical => "%Y%m%dT%H%M00Z"
Таким образом, даты получаются как «20130623T184500Z». Я использую это при создании ics. И это, я думаю, проблема - если дата/время во время BST, я не хочу использовать Z, а что-то еще?
d = DateTime.now
=> Wed, 11 Sep 2013 12:25:10 +0100
d.utc
=> Wed, 11 Sep 2013 11:25:10 +0000
Итак, я могу преобразовать дату в UTC перед сохранением в БД. Как отменить преобразование при извлечении? - person user2563682   schedule 11.09.2013