我希望以以下格式显示日期:短星期,短月,月中没有前导零但包括"th","st","nd"或"rd"后缀.
例如,问这个问题的那天会显示"Thu Oct 2nd".
我正在使用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
目录中创建一个名为date_format.rb
(或任何您想要的)的新文件并将其放入其中:
Time::DATE_FORMATS.merge!( my_date: lambda { |time| time.strftime("%a, %b #{time.day.ordinalize}") } )
然后在您的视图代码中,您可以通过为其指定新的日期格式来格式化任何日期:
My Date: <%= h some_date.to_s(:my_date) %>
它很简单,很有效,并且易于构建.只需在date_format.rb文件中为每种不同的日期格式添加更多格式行.这是一个更加充实的例子.
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
ActiveSupport提供的方法,该方法将单个符号作为参数,如果该符号被识别为有效的预定义格式,则返回具有适当格式的String.
这些符号由定义Time::DATE_FORMATS
,它是标准格式化函数...或procs的字符串的符号散列.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