Правильный формат ISO 8601 - PullRequest
2 голосов
/ 31 мая 2009

Я выполняю рефакторинг кода для библиотеки Ruby. Этот код включает в себя анализатор даты. Один из тестов состоял в том, чтобы проанализировать эту строку «2008-02-20T8: 05: 00-010: 00», которая должна быть ISO 8601 .

Предыдущий код на самом деле будет выводить: «Ср 20 Февраля 18:05:00 UTC 2008». Мой новый код выдает следующее: «Ср 20 Фев 16:05:00 UTC 2008».

Мой вопрос: какой из них правильный?

Time.parse в Ruby дает второе. Но опять же, я хочу быть на 100% уверен, что предыдущий код и тест были ошибочными.

Какой из них прав? (Возможно, анализируя строку с библиотекой на другом языке? - я знаю только Ruby.)

Ответы [ 2 ]

2 голосов
/ 31 мая 2009

Правильное время UTC - 1805. Группа времени показывает 0805 в зоне -10, поэтому, чтобы получить UTC, добавьте 10 к данному времени. Таким образом, 1805. Поскольку 1805 меньше 2400, это тот же день.

Если ваш код дает 1605, то почти наверняка у вас неверно установлен часовой пояс на зону -8, которая является тихоокеанским стандартным временем.


Ага, похоже, ваш формат ввода испорчен. Обратите внимание:

irb(main):003:0> Time.parse("2008-02-20T8:05:00-010:00") 
=> Wed Feb 20 08:05:00 -0700 2008

Я оказался в зоне -7, так что это подходит для моей страны. Но

irb(main):004:0> t=Time.parse("2008-02-20T8:05:00-010:00")
=> Wed Feb 20 08:05:00 -0700 2008
irb(main):005:0> t
=> Wed Feb 20 08:05:00 -0700 2008
irb(main):006:0> t.getutc
=> Wed Feb 20 15:05:00 UTC 2008

Я получаю неожиданный результат. Теперь соблюдайте:

irb(main):007:0> t=Time.parse("2008-02-20T8:05:00-10:00")
=> Wed Feb 20 11:05:00 -0700 2008
irb(main):008:0> t.getutc
=> Wed Feb 20 18:05:00 UTC 2008

Ожидается ожидаемый результат. Увидеть разницу? Первый пример против второго:

irb(main):004:0> t=Time.parse("2008-02-20T8:05:00-010:00")
irb(main):007:0> t=Time.parse("2008-02-20T8:05:00-10:00")

Я вынул лишние 0 (которые I , конечно, тоже не заметил) и, чёрт, это работает.

0 голосов
/ 06 августа 2011

Я знаю, что это довольно старый, но я просто наткнулся на него.

Держу пари, что что-то где-то интерпретирует 010 как восьмеричное число со значением 8. Возможно, это ошибка в реализации Time.parse()?

...