Humanizer 中文支持需显式指定 zh-CN 文化,全局设 CultureInfo.DefaultThreadCurrentCulture;数字读法分 Ordinalize(序数)和 SpellOut(基数);须安装 Humanizer.Core.zh-CN 子包并确保版本匹配。

Humanizer 日期转中文描述:用 ToHumanize() 但要注意文化上下文
默认情况下 ToHumanize() 输出英文(如 “2 hours ago”),想输出中文必须显式指定 zh-CN 文化。不设 culture 会走当前线程默认,线上环境容易出错。
- 正确写法:
DateTime.Now.AddHours(-2).ToHumanize(new CultureInfo("zh-CN"))→ “2 小时前” - 若项目全局用中文,建议在启动时设置:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("zh-CN"); - 注意
ToHumanize()对未来时间也生效,比如DateTime.Now.AddMinutes(5)返回 “5 分钟后”,无需额外判断方向 - 它不处理格式化精度,
TimeSpan.FromMinutes(1.8)会被截断为 “1 分钟”,不会显示秒级
数字转中文读法:用 Ordinalize() 和 SpellOut() 区分场景
Ordinalize() 是“第几”的序数表达,SpellOut() 是“几十几”的基数读法,二者语义不同,混用会导致逻辑错误。
- 序数(带“第”):
21.Ordinalize(new CultureInfo("zh-CN"))→ “第二十一” - 基数(纯读数):
123.SpellOut(new CultureInfo("zh-CN"))→ “一百二十三” - 小数支持有限:
3.14.SpellOut()报错,需先转整数或手动拆解 - 大数字(如百万以上)在中文里默认不自动加“万/亿”,
10000.SpellOut()返回 “一万个”,不是 “一万”——这是 Humanizer 的设计限制,不是 bug
安装与基础引用:NuGet 包名是 Humanizer.Core.zh-CN,不是 Humanizer
只装 Humanizer 主包,调用中文方法会静默失败或回退英文。中文支持是按语言拆分的子包,必须单独引用。
- NuGet 命令:
dotnet add package Humanizer.Core.zh-CN - 同时需确保主包版本匹配,例如
Humanizer.Core.zh-CN 4.0.0要求Humanizer 4.0.0(非 3.x) - ASP.NET Core 项目中,若用
IStringLocalizer混用 Humanizer,注意资源文件路径和 culture 传递链路,否则zh-CN可能被覆盖
常见报错:System.Globalization.CultureNotFoundException 或空字符串返回
这通常不是代码写错,而是 culture 名称拼写错误或未加载对应资源。Humanizer 对 culture 名称大小写敏感,且不接受别名(如 zh 不行,必须 zh-CN)。
- 检查是否误写成
zh-china、ZH-CN或zh_Hans—— 全部无效 - 运行时验证 culture 是否可用:
CultureInfo.GetCultures(CultureTypes.AllCultures).Any(c => c.Name == "zh-CN") - 某些 Linux 容器缺少中文 locale,需在 Dockerfile 中添加:
RUN apt-get update && apt-get install -y locales && locale-gen zh_CN.UTF-8 - 如果返回空字符串而非抛异常,大概率是 culture 加载失败后 fallback 到空实现,务必加日志输出实际传入的
CultureInfo实例










