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

时间:2008-10-03 00:12:07

标签: ruby-on-rails ruby date

我希望以格式显示日期:短星期,短月,月日,不带前导零,但包括“th”,“st”,“nd”或“rd”后缀。

例如,问这个问题的那天会显示“Thu Oct 2nd”。

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

7 个答案:

答案 0 :(得分:270)

使用'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'

答案 1 :(得分:93)

您可以对数字使用active_support的ordinalize辅助方法。

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

答案 2 :(得分:29)

再过一点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}") }
)

答案 3 :(得分:9)

>> require 'activesupport'
=> []
>> t = Time.now
=> Thu Oct 02 17:28:37 -0700 2008
>> formatted = "#{t.strftime("%a %b")} #{t.day.ordinalize}"
=> "Thu Oct 2nd"

答案 4 :(得分:6)

我喜欢Bartosz的回答,但是,嘿,因为这是我们正在谈论的Rails,让我们在狡猾的情况下迈出一步。 (编辑:虽然我打算使用以下方法进行monkeypatch,但事实证明有一种更清洁的方法。)

DateTime个实例具有ActiveSupport提供的to_formatted_s方法,该方法将单个符号作为参数,如果该符号被识别为有效的预定义格式,则返回具有适当格式的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

答案 5 :(得分:2)

使用%o

Time.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct 2nd"

小心::您不能将其与DateTime一起使用:

DateTime.new( 2018, 10, 2 ).strftime( "%a %b %o" )
=> "Tue Oct %o"

但是,无论如何,您都应该使用Time,这是进行切换的一个很好的理由。

答案 6 :(得分:1)

尽管Jonathan Tran确实说过他首先要寻找星期几的缩写,然后才是缩写的月份,但我认为这对于最终知道Rails具有开箱即用支持的人可能会有用为更常用的长月(有序日期整数),然后是年份,如June 1st, 2018

可以轻松实现:

Time.current.to_date.to_s(:long_ordinal)
=> "January 26th, 2019"

或者:

Date.current.to_s(:long_ordinal)
=> "January 26th, 2019"

如果您愿意,也可以坚持一个时间实例:

Time.current.to_s(:long_ordinal)
=> "January 26th, 2019 04:21"

您可以在Rails API docs中找到有关如何创建自定义格式的更多格式和上下文。