1

Ruby on Railsで日付を解析して、月と日を取得できるようにしようとしています。

 DateTime.parse("07/09") // Works
 DateTime.parse("02/07/1975") // Works
 DateTime.parse("08/26/1983") // Fails 
 DateTime.parse("04/28/1982") // Fails
 DateTime.parse("10/17/1961") // Fails

なぜそれは失敗するのでしょうか?他にも失敗するものがいくつかあり、私が見ることができる共通のスレッドはありません。

4

4 に答える 4

3

それDateTime.parse("xx/xx/xxxx")は、あなたがそれにフォーマットを与えていることを前提としているからです。DateTime("dd/mm/yyyy")つまり、米国以外のほとんどの世界にとって意味のある方法です。26か月、28か月、または17か月がないため、最後の3つの例は機能しません。2番目の例は機能しますが、おそらくあなたが思うことを与えていないことに注意してください。

 DateTime.parse("02/07/1975").month # => 7

の代わりにparse、を使用strptimeして、日付を解析する形式について明示できるようにします。

DateTime.strptime("02/07/1975", "%m/%d/%Y")
DateTime.strptime("02/07/1975", "%m/%d/%Y").month # => 2
于 2013-03-26T14:40:20.083 に答える
2

strptimeDateTimeで試してください。フォーマット文字列を受け取ります。

ruby-doc.orgのドキュメント

于 2013-03-26T02:16:43.500 に答える
0

問題

あなたの問題は、Rubyに日付と時刻に関連するクラスがいくつかあるという事実から生じています。これらには以下が含まれます:

各クラスはその機能と実装の詳細が異なりますが、特定の文字列を解析するのはTimeだけです。例えば:

Date.new "08/26/1983"
# => ArgumentError: comparison of String with 0 failed

DateTime.new "08/26/1983"
# => ArgumentError: comparison of String with 0 failed

Time.new "08/26/1983"
# => 0008-01-01 00:00:00 -0500

明らかに、それは西暦0008年ではないため、選択した日付クラスが理解できる構造化された日付を渡す必要があります。

解決

#strptimeを使用して日付文字列の形式を指定する必要があります。例えば:

Date.strptime('08/26/1983', '%m/%d/%Y').to_s
# => "1983-08-26"

DateTime.strptime('08/26/1983', '%m/%d/%Y').to_s
# => "1983-08-26T00:00:00+00:00"

次に、 DateTime#strftimeDateTime#rfc2822など、選択したクラスが提供するフォーマットメソッドを使用して、アプリケーションが必要とする方法で出力をフォーマットできます。

代わりにGNUDateを使用してください

GNU dateにアクセスできる場合は、より自由な構文解析を利用できます。それでもロケールの問題が発生する可能性がありますが、一般的にGNUの日付はかなり堅牢です。例えば:

%x(date -d 1983/08/26).chomp
# => "Fri Aug 26 00:00:00 EDT 1983"

%x(date -d 08/26/1983).chomp
=> "Fri Aug 26 00:00:00 EDT 1983"

GNU dateはヨーロッパ順(例)の入力日付を受け入れるとは思いませんdd/mm/yyyyが、出力では確かにロケールを尊重します。それはあなたのユースケースにとって重要ではないはずですが、将来の訪問者のために言及する価値があるようです。

于 2013-03-26T15:19:11.663 に答える
0

日付の解析に関する重要なことの1つは、制御することです。12/1/2000Rubyの設計者は、フォーマットであると想定するのに適切な決定を下しました"DD/MM/YYYY"。これは、一般的な利益のためであり、メリカンを間違って擦るだけですが、繰り返しになりますが、奇妙な支配者がいて、「色」を面白く綴り、道路も。

日付が奇妙な形式であることがわかっているので、日付の実際の形式を指定するために使用できます。主要な月、またはDate.strptime残りの月に使用します...それら...どちらでもかまいません。DateTime.strptimeTime.strptime'%m/%d/%Y''%d/%m/%Y'

Date、DateTime、Timeにもこのparseメソッドがあり、さまざまな形式を処理できますが、その1か月と1日の問題で問題が発生します。'メリカン対みんな-他の日付と衝突しないと確信している場合は、コードの開始点としてそれらを使用します。

日付データのソースがわからない場合、1つの戦術は、'%m/%d'フォーマットを使用してファイルの解析を開始することとrescue、解析エラーです。ある種の可能性が高いものに遭遇した場合はrewind、ファイルとretryロードを使用した'%d/%m'形式です。

または...真の柔軟性については、ほとんどめちゃくちゃ素晴らしい慢性の宝石を見てください。それでも%m/%dvs.の%d/%m問題を乗り越えますが、それは仕方がありません。

データはどこからでも取得できるため、LOCALE設定を確認したり、受信データの経度/緯度座標を知っていても、ソフトウェアが日付形式を適切に決定する方法はありません。

于 2013-03-26T15:45:48.557 に答える