Ruby Time.parse выдает ошибку вне диапазона
-
03-07-2019 - |
Вопрос
Я использую Time.parse для создания объекта Time из строки.
По какой-то причине
Time.parse("05-14-2009 19:00")
вызывает аргумент ошибки диапазона, тогда как
Time.parse("05-07-2009 19:00")
не
Есть идеи?
Решение
Я предполагаю, что вторая часть строки (14) будет месяцем.
Другие советы
Если вы знаете формат строки, используйте:
Time.strptime(date, format, now=self.now) {|year| ...}
http://www.ruby-doc.org/core-1.9/classes/Time.html#M000266
Это решит вашу проблему и, вероятно, будет быстрее, чем Time.parse
.
РЕДАКТИРОВАТЬ:
Похоже, они взяли strptime
из класса Time, но он вызвал Date.strptime
в любом случае.Если вы используете Rails, вы можете сделать:
Date.strptime("05-14-2009 19:00","%m-%d-%Y %H:%M").to_time
если вы используете чистый рубин, вам нужно:
require 'date'
d=Date._strptime("05-14-2009 19:00","%m-%d-%Y %H:%M")
Time.utc(d[:year], d[:mon], d[:mday], d[:hour], d[:min],
d[:sec], d[:sec_fraction], d[:zone])
Смотрите также: Проблемы форматирования даты и времени в Ruby on Rails.
Это из-за эвристики Time#parse
.
И это благодаря англо-американским форматам.
При использовании тире «-» ожидается мм-дд-гггг, при использовании косой черты «/» — дд/мм/гггг.
Такое поведение изменения намеренно в 1.9.для соблюдения стандартов дат EUR, ISO и JP.
Вероятно, вам это не понадобится для решения этой проблемы, но я все же рекомендую воспользоваться синтаксическим анализатором даты и времени на естественном языке. Хронический, пару раз это сэкономило мне много работы.
Вероятно, он ожидает формата День-Месяц-Год, поэтому ваше первое значение пытается указать 5-й день 14-го месяца.