Как представить переменные часовые пояса смещения в веб-сервисе REST XML? - PullRequest
2 голосов
/ 06 марта 2011

Я столкнулся с интересной проблемой, касающейся Rails REST XML и способа сериализации значений даты и времени.А именно, значения даты и времени представлены в виде значений постоянного смещения, например, так:

<model>
  <date type="datetime">2010-07-21T16:38:03-05:00</date>
</model>

Обратите внимание на значение даты и времени плюс постоянное смещение -0500.При использовании информации из этого веб-сервиса REST такое смещение работает отлично.Но предположим, что я хотел разместить информацию POST в этом веб-сервисе, и я хотел, чтобы Rails учитывал переход на летнее время так же, как и при отправке пользователем веб-формы.Я обнаружил, что могу сделать это:

<model>
  <date type="datetime">2010-07-21 16:38:03</date>
</model>

, и время будет правильно интерпретироваться как предпочтение часового пояса местного пользователя .По сути, это то, что происходит с регулярной отправкой формы.Пока все хорошо.

Также предположим, что мне нужна возможность напрямую указывать часовой пояс в запросе.Причина заключается в том, что конкретный пользователь может изменить предпочтения своего часового пояса в любое время, но запросы API, поступающие от его имени, всегда находятся в фиксированном месте (и, следовательно, в фиксированном часовом поясе).

Это кажется достаточно простым, но усложняется несколькими факторами:

  • Смещения часовых поясов обычно меняются два раза в год (т. е. с -0500 до -0400 и обратно).
  • Rails всегда ожидает постоянный часовой пояссмещения или дата и время будут интерпретироваться как местное время (или предпочтение часового пояса пользователя).
  • Класс времени Ruby не распознает переменные смещения.Например, я могу указать время по восточному стандартному времени (EST) или по восточному летнему времени (EDT), но Time.parse не сможет правильно понять «восточное время» или ET.Я не могу указать ни то, ни другое, потому что это приведет к тому, что время будет отключено на полчаса года.

Я рассмотрел следующие решения:

  1. Добавить виртуальный атрибут time_zone в модель.Мне это не нравится, потому что это имеет очень мало смысла в контексте модели, а настройка часового пояса подвержена проблемам с назначением параметров (т. Е. Модель должна демонстрировать различное поведение, когда time_zone обрабатывается до даты, последата и время, когда time_zone равен нулю).

  2. Используйте параметр строки запроса в связи с данными XML, отправленными POST.Многие люди, кажется, недовольны тем, что строки запросов используются в HTTP-запросах POST, и даже популярные остальные клиенты не , кажется, поддерживают его .

Есть ли другие возможные решения этой проблемы?Я хотел бы указать смещения переменных, как эти, но ни один из них не работает:

<date>2010-07-21 16:38:03 Eastern Time</date>
<date>2010-07-21 16:38:03 Eastern Time (US & Canada)</date>
<date>2010-07-21 16:38:03 ET</date>
<date>2010-07-21 16:38:03 America/New York</date>

1 Ответ

0 голосов
/ 06 марта 2011

Если вы используете ActiveRecord с Postgres, вы сначала настроите свою базу данных для хранения времени с часовыми поясами , но если вам не нужны зоны - просто вам нужно точное времяВаш подход может заключаться в том, чтобы хранить все время в формате UTC, что означает, что вам необходимо надлежащим образом проанализировать все отправленные времена.

Пример анализа UTC.

require 'time' # there is a gotcha here - make sure you have this line

Time.parse("2011-03-01 01:00:00 EST").utc
=> Tue Mar 01 06:00:00 UTC 2011

Time.parse("2011-03-01 01:00:00 GMT").utc
=> Tue Mar 01 01:00:00 UTC 2011

Обратите внимание, что проанализированное время включает часовой пояскак трехбуквенный кодЕсли это не так, он будет использовать предпочтения сервера.Вы могли бы сделать некоторую работу здесь, чтобы решить, что делать, если она не включает зону.Там вы разбираетесь в какой-то строке.

Также обратите внимание, что вызов метода .utc преобразует проанализированный часовой пояс в UTC, поэтому, когда данные попадают в базу данных, все времена сохраняются в одном и том же формате.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...