Humanizer OnDate.March 流畅日期 API 详解:用 DateOnly 构建三月的可读日期表达式

发布时间:2026/9/27 8:35:13
Humanizer OnDate.March 流畅日期 API 详解:用 DateOnly 构建三月的可读日期表达式 开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载本篇技术指南深入解析 Humanizer FluentDate 体系中的OnDate.March类它是面向System.DateOnly的流畅日期访问器让你以OnDate.March.The14th或OnDate.March.The(14)这种接近自然语言的表达式直接获取当前年份 3 月 14 日这一日期值。读完本文你将掌握该类的全部 31 个静态属性与The(int)方法的签名、返回值语义、底层实现原理T4 模板代码生成、运行环境前提.NET 6以及它与On系列DateTime版本的对应关系并能在自己的 .NET 项目中直接落地使用。OnDate.March 类是什么OnDate.March是 Humanizer 中OnDate静态类的一个嵌套类文档原文将其定义为Provides fluent date accessors for March为三月提供流畅的日期访问器。其完整声明为public class OnDate.March继承关系为System.Object→OnDate.March同时该类还带有一个无参构造函数March()用于初始化类的实例由于成员均为静态实际使用时无需实例化。在 API 文档中OnDate.March暴露的成员可以分成三类31 个静态只读属性The1st到The31st分别对应 3 月的 1 日到 31 日1 个静态方法The(int dayNumber)按传入的日期数字返回对应的 3 月日期1 个构造函数March()。OnDate.March属于 Humanizer FluentDate 命名空间 中的OnDate体系。与On类返回System.DateTime不同OnDate系列专门为 .NET 6 引入的DateOnly类型设计因此整个类被#if NET6_0_OR_GREATER条件编译指令保护——只有目标框架为 .NET 6 或更高版本时这些成员才可用。全部 31 个日期属性The1st 到 The31stOnDate.March为 3 月的每一天都生成了一个静态属性属性名采用英文序数词风格命名The1st、The2nd、The3rd……The31st每个属性都返回一个System.DateOnly值语义为当前年份三月的第 N 天。完整清单如下属性说明属性说明The1st3 月 1 日The17th3 月 17 日The2nd3 月 2 日The18th3 月 18 日The3rd3 月 3 日The19th3 月 19 日The4th3 月 4 日The20th3 月 20 日The5th3 月 5 日The21st3 月 21 日The6th3 月 6 日The22nd3 月 22 日The7th3 月 7 日The23rd3 月 23 日The8th3 月 8 日The24th3 月 24 日The9th3 月 9 日The25th3 月 25 日The10th3 月 10 日The26th3 月 26 日The11th3 月 11 日The27th3 月 27 日The12th3 月 12 日The28th3 月 28 日The13th3 月 13 日The29th3 月 29 日The14th3 月 14 日The30th3 月 30 日The15th3 月 15 日The31st3 月 31 日The16th3 月 16 日每个属性的签名完全一致例如public static System.DateOnly The14th { get; }API 文档中标注的Property Value类型均为System.DateOnly。由于属性是静态且只读的访问时直接使用OnDate.March.The14th即可无需任何实例。The(int) 方法按数字取三月的任意一天除了固定命名的属性OnDate.March还提供一个通用的The(int dayNumber)方法用于按日期数字动态获取 3 月的某一天public static System.DateOnly The(int dayNumber);参数dayNumberSystem.Int32表示要获取的 3 月日期数字如 14 表示 3 月 14 日返回值System.DateOnly即当前年份 3 月dayNumber日对应的日期。实际使用示例using Humanizer; var piDay OnDate.March.The14th; // 3 月 14 日圆周率日 var sameDay OnDate.March.The(14); // 与上面等价动态传参 Console.WriteLine(piDay); // 输出形如2026-03-14 Console.WriteLine(piDay sameDay); // True当日期数字需要在运行时计算、无法预先静态写出时例如来自用户输入或循环遍历The(int)是比 31 个命名属性更灵活的选择。底层实现T4 模板批量生成的源代码OnDate.March并非手写代码而是由 T4 文本模板自动生成。模板位于 src/Humanizer/FluentDate/OnDate.Days.tt其生成逻辑如下以闰年2012为基准遍历 1 到 12 月通过new DateTime(leapYear, month, 1).ToString(MMMM)得到月份英文名从而生成January、February、March等 12 个嵌套类对每个月用DateTime.DaysInMonth(leapYear, month)确定该月天数3 月为 31 天因此March类恰好生成 31 个属性每个日期属性的名字由day.Ordinalize()生成——这正是 Humanizer 自己的序数词扩展方法1→1st、2→2nd、3→3rd、21→21st等从而得到The1st、The2nd、The3rd直到The31st的属性名每个属性与The(int)方法内部都统一使用new(DateTime.Now.Year, month, day)构造DateOnly。生成的实体代码位于 src/Humanizer/FluentDate/OnDate.Days.cs。以March类从第 391 行开始为例其成员实现如下public class March { /// summary /// The nth day of March of the current year /// /summary public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 3, dayNumber); /// summary /// The 1st day of March of the current year /// /summary public static DateOnly The1st new(DateTime.Now.Year, 3, 1); // ... The2nd 到 The31st 依此类推 }从源码结构可以看出两个关键事实年份取自系统当前时间所有成员都使用DateTime.Now.Year作为年份因此返回的总是当前年份的 3 月日期。若在 2026 年运行OnDate.March.The1st即为2026-03-01跨年自动生效由于年份是运行时动态取的应用程序跨年后无需修改任何代码访问器会自动指向新一年的 3 月。测试验证生成结果如何被保障仓库通过两层测试保证 31 个属性与The(int)方法的正确性1. 直接断言测试tests/Humanizer.Tests/FluentDate/OnDateTests.cs该测试文件使用与生成代码相同的DateTime.Now.Year构造期望值验证访问器与手写构造的结果一致[Fact] public void OnJanuaryThe23rd() Assert.Equal(new(DateTime.Now.Year, 1, 23), OnDate.January.The23rd); [Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), OnDate.February.The(11));2. 反射式全覆盖测试tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs该测试通过反射遍历OnDate下所有月份嵌套类OnDateDayPropertiesCoverAllGeneratedDayAccessors断言所有月份嵌套类的静态属性都能被解析为月 日并返回正确的DateOnlyOnDateTheMethodsCoverAllGeneratedMonthFactories断言每个月份类都存在The(int)方法且调用The(1)返回该月 1 日解析属性名时采用The前缀 序数后缀的规则TryParseDayProperty能识别1st/2nd/3rd/4th…全部 31 个属性名。这两类测试共同确保了模板生成的 31 个属性数量正确、命名符合序数词规则、返回日期与手写new DateOnly(year, 3, day)完全等价。环境前提与限制使用OnDate.March需要注意以下约束目标框架必须为 .NET 6 或更高因为返回值类型是System.DateOnly整个OnDate类连同InDate都被#if NET6_0_OR_GREATER条件编译包裹见 src/Humanizer/FluentDate/OnDate.Days.cs 第 1 行。在 .NET Framework 或 .NET 5 及以下项目中无法使用属性是静态的直接通过OnDate.March.The14th访问不需要实例化March类The(int)的入参是普通整数传入 1~31 之间的任意整数即可若需要特定命名可优先使用属性版本。与 On.MarchDateTime 版的对应关系Humanizer 的 FluentDate 提供了两套平行的日期 APIOn系列返回DateTimeOnDate系列返回DateOnly。场景文档 fluent-dates-and-time-spans.mdx 明确说明InDateandOnDateprovide correspondingDateOnlyvalues on compatible frameworks——即在支持DateOnly的框架上OnDate是On的对应版本。两者的成员结构完全平行On.March.The14th返回包含时间分量的DateTime时间为零点而OnDate.March.The14th返回不含时间的DateOnly。在选择时可以参考以下规则只需要日期语义、不关心时间部分、且目标是 .NET 6优先使用OnDate.March需要DateTime例如要与旧 API 互操作、参与时区转换使用On.March。此外InDate系列如InDate.March的月份访问器与In(5).Days之类的相对偏移提供了从当前日期偏移的DateOnly访问器与OnDate的绝对某月某日语义互补共同构成完整的 FluentDate 体验。相关 API 参考可见 Humanizer.OnDate.March、Humanizer.OnDate 与 Humanizer.InDate。实战组合示例将命名属性、动态方法与DateOnly的既有能力组合起来可以写出高度可读的业务代码using Humanizer; // 1) 静态命名圆周率日与白色情人节 DateOnly piDay OnDate.March.The14th; DateOnly whiteDay OnDate.March.The14th.AddDays(0); // 3 月 14 日 // 2) 动态传参根据配置项决定日期 int configuredDay 8; // 假设来自配置 DateOnly womenDay OnDate.March.The(configuredDay); // 3 月 8 日 // 3) 结合 DateOnly 计算本月剩余天数 DateOnly today DateOnly.FromDateTime(DateTime.Now); DateOnly endOfMarch OnDate.March.The31st; int daysLeftInMarch endOfMarch.DayNumber - today.DayNumber; Console.WriteLine($3 月还剩 {daysLeftInMarch} 天);以上代码同时体现了OnDate.March的两大价值代码自文档化OnDate.March.The14th比new DateOnly(2026, 3, 14)表达意图更直接与年份自适应无需关心具体年份始终指向当前年份的 3 月。小结OnDate.March是 Humanizer FluentDate 体系中OnDate静态类的 3 月访问器提供 31 个静态DateOnly属性The1st–The31st与一个The(int)动态方法全部返回当前年份三月的对应日期。它由 OnDate.Days.tt 模板借助 Humanizer 自身的Ordinalize()自动生成实体代码位于 src/Humanizer/FluentDate/OnDate.Days.cs并通过 OnDateTests.cs 与 GeneratedFluentDateTests.cs 双重验证。使用时需注意 .NET 6 的环境前提并可参照On.MarchDateTime版在两种返回类型之间按需选择。赞分享开发工具【免费下载链接】HumanizerHumanizer meets all your .NET needs for manipulating and displaying strings, enums, dates, times, timespans, numbers and quantities项目地址https://gitcode.com/gh_mirrors/hu/Humanizer点击查看免费下载相关推荐Humanizer OnDate.March 流式日期访问器详解用自然语言式 API 构建 DateOnly 三月日期Humanizer OnDate.March 流式日期访问器详解用自然语言式 API 构建 DateOnly 三月日期 OnDate.March 是 Huma开发工具Humanizer OnDate.March 流式日期 API 指南用一行代码表达三月第几日的 DateOnly 访问器Humanizer OnDate.March 流式日期 API 指南用一行代码表达三月第几日的 DateOnly 访问器 本文以 Humanizer 的开发工具Humanizer OnDate.September 详解用流式 API 构建 9 月日期DateOnlyHumanizer OnDate.September 详解用流式 API 构建 9 月日期DateOnly 本篇指南聚焦 Humanizer 的 OnDa开发工具上一篇SmartTube终极指南如何在Android TV上完美开启HDR视频播放下一篇终极指南深入理解Trino分布式事务的两阶段提交实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询