You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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) %>

解释下这个写法:

  1. 先用strftime("%-d %b %Y")生成你原本想要的日期格式(比如5 Nov 2024)
  2. 然后用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:55:23