我想格式化一个日期对象,以便可以显示诸如“3rd July”或“1st October”之类的字符串。我在 Date.strftime 中找不到生成“rd”和“st”的选项。有人知道怎么做吗?
8 回答
除非您使用的是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
created_at.strftime("#{created_at.day.ordinalize} of %m, %y")
将制作“2009 年 7 月 4 日”
我将回应其他所有人,但我只是鼓励您下载activesupport
gem,这样您就可以将其用作库。您不需要所有 Rails 都可以使用ordinalize
.
% gem 安装 activesupport ... % irb irb> 需要 'rubygems' #=> 真 irb> 需要 'activesupport' #=> 真 irb> 3.ordinalize #=> “第三”
我不认为 Ruby 有它,但如果你有 Rails,试试这个:-
puts 3.ordinalize #=> "3rd"
我不知道它是否比 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>
需要'activesupport'
1.ordinal => 'st'
1.ordinalize => '1st'
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 ,则返回块计算的值。在这种情况下,哈希是空的,因此块总是返回感兴趣的值。该块有两个参数,哈希(此处)和正在评估的键。我用下划线表示前者,表示该块不使用它)。一些例子:H
k
H[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。