在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