web-dev-qa-db-ja.com

Ruby Time.parseで範囲外エラーが発生する

Time.parseを使用して、文字列からTimeオブジェクトを作成しています。

何らかの理由で

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

範囲エラーの引数を引き起こしますが、

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

ではない

何か案は?

20
Tony

私の推測では、文字列の2番目の部分(14)が月になると予想しています。

このリンクは解析に役立つ場合があります。

12
Brandon

文字列の形式がわかっている場合は、次を使用します。

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

http://www.Ruby-doc.org/core-1.9/classes/Time.html#M000266

それはあなたの問題を解決し、おそらくTime.parseよりも速いでしょう。

編集:

Timeクラスからstrptimeを取得したように見えますが、とにかくDate.strptimeと呼ばれていました。 Railsを使用している場合は、次のことができます。

Date.strptime("05-14-2009 19:00","%m-%d-%Y %H:%M").to_time

pure Rubyを使用する場合は、次のものが必要です。

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 の日付と時刻のフォーマットの問題。

26
Miquel

これは、Time#parseのヒューリスティックが原因です。

そして、それは英米のフォーマットによるものです。

ダッシュ '-'の場合はmm-dd-yyyyを予期し、スラッシュ '/'の場合はdd/mm/yyyyを予期します。

この動作変更 1.9では意図的に。 eur、iso、jpの日付基準を達成するため。

14
Oinak

この問題を解決するためにおそらくそれは必要ありませんが、それでも自然言語の日付/時刻パーサーをチェックすることをお勧めします Chronic 、それは私に数回多くの仕事を節約しました。

4
Jonas Elfström

おそらくDay-Month-Year形式を想定しているため、最初の値は14か月目の5日目を指定しようとしています。

0
James Avery