25

我想格式化一个日期对象,以便可以显示诸如“3rd July”或“1st October”之类的字符串。我在 Date.strftime 中找不到生成“rd”和“st”的选项。有人知道怎么做吗?

4

8 回答 8

40

除非您使用的是Rails,否则请将此ordinalize方法(无耻地从 Rails 源中提取的代码)添加到Fixnum

class Fixnum
  def ordinalize
    if (11..13).include?(self % 100)
      "#{self}th"
    else
      case self % 10
        when 1; "#{self}st"
        when 2; "#{self}nd"
        when 3; "#{self}rd"
        else    "#{self}th"
      end
    end
  end
end

然后像这样格式化您的日期:

> now = Time.now
> puts now.strftime("#{now.day.ordinalize} of %B, %Y")
=> 4th of July, 2009
于 2009-07-04T12:08:04.700 回答
28
created_at.strftime("#{created_at.day.ordinalize} of %m, %y")

将制作“2009 年 7 月 4 日”

于 2009-07-04T10:43:58.207 回答
24

我将回应其他所有人,但我只是鼓励您下载activesupportgem,这样您就可以将其用作库。您不需要所有 Rails 都可以使用ordinalize.

% gem 安装 activesupport
...
% irb
irb> 需要 'rubygems'
#=> 真
irb> 需要 'activesupport'
#=> 真
irb> 3.ordinalize
#=> “第三”
于 2009-07-04T17:56:20.527 回答
8

我不认为 Ruby 有它,但如果你有 Rails,试试这个:-

puts 3.ordinalize #=> "3rd"
于 2009-07-04T10:34:25.577 回答
1

似乎我第三次重新讨论这个话题,所以我用一些额外的评论/用法更新了我的要点。

https://gist.github.com/alterisian/4154152

干杯,伊恩。

于 2013-08-12T11:20:45.377 回答
1

我不知道它是否比 switch-case 快那么多(任何?),但我用结尾做了一个常数:

DAY_ENDINGS = ["th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "th", "st", "nd", "rd", "th", "th", "th", "th", "th", "th", "th", "st"]

然后就像这样使用它:

DAY_ENDINGS[date.mday]

因为我想要一个里面的结局

<span>th</span>
于 2014-06-11T09:47:54.903 回答
1

需要'activesupport'
1.ordinal => 'st'
1.ordinalize => '1st'

于 2014-12-11T11:29:05.033 回答
0
require 'time'
H = Hash.new do |_,k|
  k +
  case k
  when '1', '21', '31'
    'st'
  when '2', '22'
    'nd'
  when '3', '23'
    'rd'
  else
    'th'
  end
end 
def fmt_it(time)
  time.strftime("%A %-d, %-l:%M%P").sub(/\d+(?=,)/, H) 
end
fmt_it(Time.new)
  #=> "Wednesday 9th, 1:36pm"
fmt_it(Time.new + 3*24*60*60)
  #=> "Saturday 12th, 3:15pm"

我使用了String#sub的形式(可以使用sub!),它以哈希 ( H) 作为第二个参数。

使用的正则表达式sub读取“匹配一个或多个数字后跟逗号”。(?=,)是一个积极的前瞻

我使用带有块的Hash::newH形式创建了(空)哈希。这仅仅意味着如果没有 key ,则返回块计算的值。在这种情况下,哈希是空的,因此块总是返回感兴趣的值。该块有两个参数,哈希(此处)和正在评估的键。我用下划线表示前者,表示该块不使用它)。一些例子:HkH[k]H

H['1']  #=>  "1st" 
H['2']  #=>  "2nd" 
H['3']  #=>  "3rd" 
H['4']  #=>  "4th" 
H['9']  #=>  "9th" 
H['10'] #=> "10th" 
H['11'] #=> "11th" 
H['12'] #=> "12th" 
H['13'] #=> "13th" 
H['14'] #=> "14th" 
H['22'] #=> "22nd" 
H['24'] #=> "24th" 
H['31'] #=> "31st" 

有关格式化指令,请参见Time#strftime

于 2020-09-10T18:46:12.780 回答