Различия в разборе строки даты между Ruby 1.9.3 и Ruby 1.8.7 - PullRequest
3 голосов
/ 28 февраля 2012

с Ruby 1.8.7:

>> require 'time'
>> Time.parse '01/28/2012'
=> Sat Jan 28 00:00:00 +0200 2012
>> Time.parse '28/01/2012'
=> ArgumentError: argument out of range

С Ruby 1.9.3:

>> require 'time'
>> Time.parse '28/01/2012'
=> 2012-01-28 00:00:00 +0200
>> Time.parse '01/28/2012'
=> ArgumentError: argument out of range

Похоже, что в Ruby 1.8.7 он принимал американский формат (месяц / день / год), тогда как в Ruby 1.9.3 он принимает только не американский формат (день / месяц / год).

Есть ли способ изменить это поведение, чтобы оно было похоже на Ruby 1.8.7?

Ответы [ 2 ]

7 голосов
/ 28 февраля 2012

Можно ли использовать Time.strptime("01/28/2012", "%m/%d/%Y") вместо Time.parse?Таким образом, вы лучше контролируете, как Ruby будет анализировать дату.

Если нет драгоценных камней: (например, ruby-american_date ), чтобы Ruby 1.9 Time.parse вел себя какRuby 1.8.7, но используйте его только в случае крайней необходимости.

1.9.3-p0 :002 > Time.parse '01/28/2012'
ArgumentError: argument out of range

1.9.3-p0 :003 > require 'american_date'
1.9.3-p0 :004 > Time.parse '01/28/2012'
 => 2012-01-28 00:00:00 +0000 
0 голосов
/ 13 ноября 2012

Ruby 1.9.3, похоже, изменил формат разбора даты по умолчанию ...

в рубине 1.8.7

"11/14/2012".to_time
==> Wed Nov 14 00:00:00 UTC 2012

В Ruby 1.9.3

"11/14/2012".to_time
ArgumentError: invalid date

Преобразование to_time теперь принимает% d,% m,% Y в качестве формата строки ...

В Ruby 1.9.3

"14/11/2012".to_time
2012-11-14 00:00:00 UTC

Обратите внимание на другой формат вывода. Time.now.to_s также возвращает другой формат в 1.9.3. Берегись!

Я видел другой пост, в котором говорилось, что to_time было преднамеренно устарело в Ruby 1.9.3, но, похоже, был изменен только формат синтаксического анализа.

Кроме того ...

В 1.8.7

Time.parse("11/14/2012", "%m,%d,%Y")
==> Wed Nov 14 06:00:00 UTC 2012

В 1.9.3

Time.parse("11/13/2012", "%m,%d,%Y")
==> ArgumentError: argument out of range

Time.strptime не существует в 1.8.7, только в 1.9.3, поэтому я не вижу способа сделать мой код обратно совместимым с 1.8.7 после внесения необходимых изменений в 1.9.3.

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