2009-05-31 7 views
2

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

Предыдущий код на самом деле выводит: «Wed Feb 20 18:05:00 UTC 2008». Мой новый код выводит: «Wed Feb 20 16:05:00 UTC 2008».

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

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

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

+0

Возможно, это связано с неявным использованием часового пояса? –

+0

Может быть ... я не знаю! –

ответ

2

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

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


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

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 из (что я, конечно, не заметил ни) и Свист, он работает.

+0

Да, я нахожусь в PST (Сан-Франциско). Означает ли это, что Ruby's Time.parse терпит неудачу? –

+1

Нет, это означает, что вы правильно установили время, но вы выводите его в свой часовой пояс. Обратите внимание, что 1805 в зоне -10 * составляет * 1605 в зоне -8. –

+0

ну, выход отображается в UTC оба раза: "Wed Feb 20 18:05:00 UTC 2008" "Wed Feb 20 16:05:00 UTC 2008" Они не могут быть прав, оба могут ли они ? –

0

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

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

+0

Это была моя первая мысль. Чтение стандарта (версия википедии: http://en.wikipedia.org/wiki/ISO_8601#Time_zone_designators) смещение часа ограничено двумя цифрами; Я действительно не думаю, что 3 будет считаться действительным, и тот факт, что он разбирался вообще, должен считаться ошибкой. Кроме того, 02013 является допустимым обозначением ISO 8601 за текущий год, здесь вы не нуждаетесь в восьмеричной интерпретации. – toddkaufmann

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