问题
您的问题源于 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,以应用程序需要的任何方式格式化输出。
改用 GNU 日期
如果您可以访问 GNU 日期,则可以利用其更自由的解析。您可能仍然会遇到语言环境问题,但总的来说 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
),但肯定会在输出中尊重语言环境。这对您的用例来说并不重要,但对于未来的访问者来说似乎值得一提。