Я столкнулся с интересной проблемой, касающейся 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.Я не могу указать ни то, ни другое, потому что это приведет к тому, что время будет отключено на полчаса года.
Я рассмотрел следующие решения:
Добавить виртуальный атрибут time_zone в модель.Мне это не нравится, потому что это имеет очень мало смысла в контексте модели, а настройка часового пояса подвержена проблемам с назначением параметров (т. Е. Модель должна демонстрировать различное поведение, когда time_zone обрабатывается до даты, последата и время, когда time_zone равен нулю).
Используйте параметр строки запроса в связи с данными 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>