在Ruby on Rails中,如何格式化一个带有"th"后缀的日期,例如"Sun Oct 5th"?

10 浏览
0 Comments

在Ruby on Rails中,如何格式化一个带有"th"后缀的日期,例如"Sun Oct 5th"?

我想要以以下格式显示日期:缩写的星期几,缩写的月份,日期没有前导零,但包括 \"th\"、\"st\"、\"nd\" 或 \"rd\" 后缀。\n例如,提问这个问题的那天将显示为 \"Thu Oct 2nd\"。\n我正在使用 Ruby 1.8.7,但是 Time.strftime 似乎不能实现这个功能。如果有的话,我更倾向于使用标准库。

0
0 Comments

问题的原因:在Ruby on Rails中,格式化日期时,需要添加日期后缀,例如"Sun Oct 5th"。但是默认的日期格式化方法并不支持添加后缀。

解决方法:可以创建一个新的文件,在config/initializers目录下,命名为date_format.rb(或其他任意名称),并在其中添加代码块Time::DATE_FORMATS.merge!(),用于定义日期格式化规则。然后在视图代码中,通过指定新的日期格式来格式化日期。

具体实现步骤如下:

1. 在config/initializers目录下创建date_format.rb文件。

2. 在date_format.rb文件中添加以下代码块:

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

3. 在视图代码中,通过将日期赋值给新的日期格式来格式化日期,例如:

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

4. 如果需要定义其他日期格式,可以在date_format.rb文件中添加更多的Time::DATE_FORMATS.merge!()代码块来定义。

下面是一个更详细的示例:

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}") }
)

对于Rails 3,ActiveSupport的用法发生了一些变化,以下是等效的代码:

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

以上就是问题的原因和解决方法。在Ruby on Rails中,通过定义日期格式化规则,并指定新的日期格式,可以实现在日期中添加后缀的格式化。

0
0 Comments

问题的出现原因是需要在日期中添加序数后缀(如"th")来格式化日期,以便显示为"Sun Oct 5th"这样的形式。

解决方法是使用Ruby on Rails提供的active_support库中的ordinalize辅助方法。该方法可以将数字转换为带有序数后缀的形式。

使用示例代码如下:

>> require 'active_support/core_ext/integer/inflections'
>> date = Date.new(2020, 10, 5)
>> formatted_date = date.strftime("%a %b #{date.day.ordinalize}")
>> puts formatted_date
=> "Sun Oct 5th"

这样就可以通过将日期的day部分与ordinalize方法的结果拼接起来,来实现日期格式化并添加序数后缀的效果。

0
0 Comments

问题出现的原因是:用户想要在Ruby on Rails中格式化日期,希望能够包含英文序数词后缀,例如"Sun Oct 5th"。

解决方法是使用active_support库中的ordinalize方法。具体步骤如下:

1. 引入'active_support'库:

require 'active_support/core_ext/integer/inflections'

2. 创建一个时间对象:

time = Time.new

3. 使用strftime方法格式化日期,并在格式化字符串中使用ordinalize方法将日期的天数转换为带有序数词后缀的形式:

time.strftime("%a %b #{time.day.ordinalize}")

这样就可以得到类似"Fri Oct 3rd"的格式化日期。

需要注意的是,如果你使用的是Ruby 2.0版本的IRB,你需要先运行上述的引入语句,因为这个方法不包含在标准库中。

0