Ruby Time.parse выдает ошибку вне диапазона - PullRequest
19 голосов
/ 29 апреля 2009

Я использую Time.parse для создания объекта Time из строки.

Почему-то

Time.parse("05-14-2009 19:00")

вызывает аргумент нашей ошибки диапазона, тогда как

Time.parse("05-07-2009 19:00")

не

Есть идеи?

Ответы [ 5 ]

26 голосов
/ 29 апреля 2009

Если вы знаете формат строки, используйте:

Time.strptime(date, format, now=self.now) {|year| ...}   

http://www.ruby -doc.org / ядро-1.9 / классы / Time.html # M000266

Это решит вашу проблему и, вероятно, будет быстрее, чем Time.parse.

EDIT:

Похоже, они взяли 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 .

14 голосов
/ 29 апреля 2009

Это из-за эвристики Time#parse.

И это связано с англо-американскими форматами.

С тире '-' он ожидает мм-дд-гггг, с косыми чертами '/' он ожидает дд / мм / гггг.

Это поведение намеренно меняет в 1.9. выполнить стандарты даты, даты, даты и даты.

12 голосов
/ 29 апреля 2009

Полагаю, ожидалось, что вторая часть строки (14) будет месяцем.

Эта ссылка может помочь вам разобрать ее.

4 голосов
/ 29 апреля 2009

Вам, вероятно, это не нужно, чтобы решить эту проблему, но я все же рекомендую проверить синтаксический анализатор даты / времени на естественном языке Хронический , он несколько раз спас меня от работы.

0 голосов
/ 29 апреля 2009

Вероятно, ожидается формат день-месяц-год, поэтому ваше первое значение пытается указать 5-й день 14-го месяца.

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