如何在 Go 中实现带序数后缀(如 1st、2nd、3rd)的英文日期格式化
技术百科
花韻仙語
发布时间:2026-01-26
浏览: 次 go 的 time.format() 不支持自动添加日期序数后缀(如 "1st"、"2nd"),需手动拼接后缀逻辑,再结合标准布局字符串完成格式化。
Go 标准库的 time.Time.Format() 方法基于固定布局(layout)字符串工作,其底层使用的是“参考时间” Mon Jan 2 15:04:05 MST 2006 的占位符映射机制。它不支持动态修饰符(如英语中 1st/2nd/3rd/4th 这类依赖数值规则的序数后缀),因此直接使用 "Monday 2nd January" 会导致 2nd 被当作字面量处理——其中 2 被解析为日字段(对应 t.Day()),而 nd 则原样输出,

要正确实现“Wednesday 4th March”或“Sunday 1st March”,需将日期格式拆解为两部分:
- 使用 t.Format() 渲染静态部分(如 "Monday " 和 " January");
- 单独提取 t.Day(),根据英语序数规则计算后缀(st/nd/rd/th),再拼接进字符串。
以下是推荐的健壮实现:
func formatVerboseDate(t time.Time) string {
day := t.Day()
var suffix string
switch {
case day%100 >= 11 && day%100 <= 13:
suffix = "th" // 11th, 12th, 13th override all others
case day%10 == 1:
suffix = "st"
case day%10 == 2:
suffix = "nd"
case day%10 == 3:
suffix = "rd"
default:
suffix = "th"
}
return t.Format("Monday ") + fmt.Sprintf("%d%s", day, suffix) + t.Format(" January 2006")
}✅ 注意:此实现正确处理了 11–13 的特殊规则(如 11th, 12th, 13th),这是常见疏漏点——仅判断个位数会错误地将 11 判为 11st。
使用示例:
t1 := time.Date(2015, time.March, 4, 0, 0, 0, 0, time.UTC) t2 := time.Date(2015, time.March, 1, 0, 0, 0, 0, time.UTC) t3 := time.Date(2015, time.March, 11, 0, 0, 0, 0, time.UTC) fmt.Println(formatVerboseDate(t1)) // Wednesday 4th March 2015 fmt.Println(formatVerboseDate(t2)) // Sunday 1st March 2015 fmt.Println(formatVerboseDate(t3)) // Tuesday 11th March 2015
? 小结:Go 的时间格式化强调确定性与无状态,因此不内置语言敏感的智能格式。对本地化或复杂格式需求(如带序数、多语言月份/星期),建议结合 golang.org/x/text 包进行国际化增强;而简单英文序数场景,上述手动后缀拼接方式简洁、高效且完全可控。
# 的是
# 这类
# 这是
# 英文
# 多语言
# 英语
# 不支持
# go
# golang
# format
# 标准库
# 字符串
# switch
# 本地化
# 正确处理
# 两部分
# 修饰符
# th
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Win11触摸板没反应怎么办_开启Win11笔记本
- Win11怎么设置虚拟内存_Windows 11优
- C++友元类使用场景_C++类间协作设计方式讲解
- MAC如何设置网卡MAC地址克隆_MAC终端修改物
- Win10任务栏天气和资讯怎么关闭 Win10禁用
- Win11怎么压缩文件 Win11自带压缩解压功能
- ACF 教程:正确更新嵌套在多层 Group 字段
- Windows10如何更改桌面图标间距_Win10
- Win11怎么关闭右下角弹窗_Win11拦截系统通
- Python对象比较与排序_魔术方法解析【教程】
- Windows怎样关闭桌面弹窗广告_Windows
- 如何在 PHP 单元测试中正确模拟带方法的图像处理
- php订单日志怎么导出excel_php导出订单日
- c# Task.ConfigureAwait(tr
- Python装饰器复用技巧_通用能力解析【教程】
- 如何高效删除 NumPy 二维数组中所有元素相同的
- 如何使用Golang安装API文档生成工具_快速生
- Win11麦克风没声音怎么设置_Win11麦克风权
- Python对象比较与排序_集合使用说明【指导】
- Windows10电脑怎么查看硬盘通电时间_Win
- c++如何用AFL++进行模糊测试 c++ Fuz
- Win11怎么设置应用分屏_Windows11贴靠
- 如何使用Golang构建简易投票统计功能_Gola
- win11如何清理传递优化文件 Win11为C盘瘦
- windows如何禁用驱动程序强制签名_windo
- c++中的std::conjunction和std
- Windows10系统怎么查看显卡型号_Win10
- 如何使用Golang实现容器健康检查_监控和自动重
- Windows的便笺功能如何使用?(桌面备忘技巧)
- 如何在Golang中写入JSON文件_保存结构体数
- MAC如何快速搜索大文件_MAC磁盘空间分析与冗余
- Win11无法识别耳机怎么办_解决Win11插耳机
- 如何在 ACF 中正确更新嵌套多层的 Group
- 如何在Golang中引入测试模块_Golang测试
- PHP的FastAdmin架构适合二次开发吗_特点
- php怎么下载安装后测试是否成功_简单脚本验证方法
- Win10系统更新错误0x80240034怎么办
- Windows10如何更改计算机工作组_Win10
- 如何在Golang中实现微服务负载均衡_Golan
- mac怎么打开终端_MAC终端Terminal使用
- c++如何使用std::bitset进行位图算法_
- Windows10系统怎么查看IP地址_Win10
- Win11怎么关闭OneDrive同步_Win11
- Win10如何设置双wan路由器 Win10双wa
- Win11如何设置自动关机 Win11定时关机命令
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- c# 服务器GC和工作站GC的区别和设置
- Win10怎么更改用户名 Win10修改账户名称操
- C++如何解析JSON数据?(nlohmann/j
- php下载安装包怎么选_threadsafe与nt

QQ客服