在Ruby on Rails中,如何使用“th”后缀格式化date,如“Sun 10月5日”?

我想按照以下格式显示date:短周日,短月,不含前导零但包括“th”,“st”,“nd”或“rd”后缀的月份。

例如,这个问题被问到的那一天将会显示“十月二号星期四”。

我正在使用Ruby 1.8.7,而Time.strftime似乎并没有这样做。 如果存在的话,我更喜欢一个标准库。

使用“active_support”的ordinalize方法。

>> time = Time.new => Fri Oct 03 01:24:48 +0100 2008 >> time.strftime("%a %b #{time.day.ordinalize}") => "Fri Oct 3rd" 

请注意,如果您在Ruby 2.0中使用IRB,则必须先运行:

 require 'active_support/core_ext/integer/inflections' 

您可以在数字上使用active_support的ordinalize帮助器方法。

 >> 3.ordinalize => "3rd" >> 2.ordinalize => "2nd" >> 1.ordinalize => "1st" 

把Patrick McKenzie的答案稍微提一点,你可以在你的config/initializers目录中创build一个名为date_format.rb (或者你想要的)的新文件,并把它放在里面:

 Time::DATE_FORMATS.merge!( my_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") } ) 

然后在您的视图代码中,您可以简单地通过指定新的date格式来格式化任何date:

 My Date: <%= h some_date.to_s(:my_date) %> 

它很简单,它的工作,并容易build立。 只需在date_format.rb文件中为每种不同的date格式添加更多格式行。 这是一个更充实的例子。

 Time::DATE_FORMATS.merge!( datetime_military: '%Y-%m-%d %H:%M', datetime: '%Y-%m-%d %I:%M%P', time: '%I:%M%P', time_military: '%H:%M%P', datetime_short: '%m/%d %I:%M', due_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") } ) 
 >> require 'activesupport' => [] >> t = Time.now => Thu Oct 02 17:28:37 -0700 2008 >> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}" => "Thu Oct 2nd" 

我喜欢Bartosz的回答,但是,嘿,因为这是我们正在谈论的Rails,让我们来进一步狡猾。 (编辑:虽然我只是monkeypatch下面的方法,原来有一个更清洁的方法。)

DateTime实例具有由to_formatted_s提供的to_formatted_s方法,该方法将单个符号作为参数,如果该符号被识别为有效的预定义格式,则返回具有适当格式的String。

这些符号是由Time::DATE_FORMATS定义的,它是符号散列到标准格式函数的string…或者特效。 Bwahaha。

 d = DateTime.now #Examples were executed on October 3rd 2008 Time::DATE_FORMATS[:weekday_month_ordinal] = lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") } d.to_formatted_s :weekday_month_ordinal #Fri Oct 3rd 

但是,嘿,如果你无法抵抗这个monkeypatch的机会,你总是可以给一个更清洁的界面:

 class DateTime Time::DATE_FORMATS[:weekday_month_ordinal] = lambda { |time| time.strftime("%a %b #{time.day.ordinalize}") } def to_my_special_s to_formatted_s :weekday_month_ordinal end end DateTime.now.to_my_special_s #Fri Oct 3rd