問題
あなたの問題は、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#strftimeやDateTime#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
が、出力では確かにロケールを尊重します。それはあなたのユースケースにとって重要ではないはずですが、将来の訪問者のために言及する価値があるようです。