Rails中如何在strftime格式字符串里为日期添加序数后缀?
给日期天数添加序数后缀的实现方法
嘿,这个问题我刚好碰到过!其实Ruby标准库的strftime本身并没有直接生成序数后缀(st/nd/rd/th)的格式指令,但咱们有几种优雅的方式实现,不用单独拆分天数变量~
如果你用的是Rails项目(大部分ERB场景都是Rails)
Rails的ActiveSupport已经给数字类型封装了ordinalize方法,能自动给数字加上正确的序数后缀。我们可以结合strftime和字符串替换来实现:
<%= @shop.date_opened.strftime("%-d %b %Y").sub(/\d+/, &:ordinalize) %>
解释下这个写法:
- 先用
strftime("%-d %b %Y")生成你原本想要的日期格式(比如5 Nov 2024) - 然后用
sub(/\d+/, &:ordinalize)匹配字符串里的第一个数字(也就是天数),把它替换成带序数后缀的版本,最终输出5th Nov 2024
如果你觉得替换的方式不够直观,也可以先拼接序数化的天数和其他日期部分:
<%= "#{@shop.date_opened.day.ordinalize} #{@shop.date_opened.strftime("%b %Y")}" %>
如果是纯Ruby环境(没有Rails的ActiveSupport)
那我们可以自己实现一个简单的ordinalize方法,再用同样的思路处理:
首先在你的Ruby代码里定义这个方法:
def ordinalize(num) suffix = case num % 100 when 11..13 then 'th' else case num % 10 when 1 then 'st' when 2 then 'nd' when 3 then 'rd' else 'th' end end "#{num}#{suffix}" end
然后在ERB里这样用:
<%= @shop.date_opened.strftime("%-d %b %Y").sub(/\d+/) { |d| ordinalize(d.to_i) } %>
小提示:
为什么要处理11-13的情况?因为11、12、13不管最后一位是什么,都用th后缀,这是英文序数的特殊规则,咱们的方法已经覆盖了这个场景~
内容的提问来源于stack exchange,提问作者rctneil
相关产品推荐
相关产品推荐

