
开发工具【免费下载链接】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点击查看免费下载OnDate.May是 Humanizer 流式日期FluentDate体系中面向 5 月的一组静态访问器它把当前年份的某月某日封装成The1st、The2nd、……The31st这样的自然语言属性以及一个通用的The(int dayNumber)方法返回值统一为 .NET 6 引入的DateOnly类型。阅读本文后你将掌握OnDate.May的完整 API 面、底层实现原理T4 模板生成、测试验证方式以及它和On.May返回DateTime在适用场景上的关键差异从而在日程计算、报表日期构造等业务中写出更具可读性的日期代码。OnDate 在 Humanizer FluentDate 体系中的位置Humanizer 的核心目标是把正常字符串、类型名、枚举字段、日期字段等转换成人类友好的格式。其中 FluentDate 目录专门负责流式日期构造让开发者用接近自然语言的代码写出日期而不是一遍遍手写new DateTime(year, month, day)。从源码结构看FluentDate 分为两条平行家族On/In返回DateTime的访问器。例如On.May.The10th表示当前年份 5 月 10 日的DateTimeIn.MayOf(2025)表示2025 年 5 月的某一天OnDate/InDate与上面一一对应的DateOnly版本仅在NET6_0_OR_GREATER条件下编译见 OnDate.Days.cs 首行的#if NET6_0_OR_GREATER因为DateOnly类型自 .NET 6 起才可用。OnDate.May即属于后者它内嵌在OnDate类中和January、February、……、December等 12 个兄弟类并列每个类负责一个自然月。官方场景文档 fluent-dates-and-time-spans.mdx 也明确提到InDate和OnDate在兼容的框架上提供对应的DateOnly值。OnDate.May 类总览依据 Humanizer.OnDate.May API 参考该类可概括为Provides fluent date accessors for May为 5 月提供流式日期访问器public class OnDate.May继承关系为System.Object → May。从 OnDate.Days.cs 的实现看它实质上是一个静态访问器容器不保存任何状态每个成员都直接根据DateTime.Now.Year动态计算当年的日期。类成员由两部分构成31 个静态只读属性The1st到The31st覆盖 5 月的每一天1 个静态方法The(int dayNumber)按任意日号动态取值。所有成员统一返回System.DateOnly。注意OnDate.May是嵌套在OnDate内部、且OnDate处于Humanizer命名空间因此完整使用形式为Humanizer.OnDate.May.The10th。属性成员The1st The31st文档为该类列出了 31 个属性语义完全一致The nth day of May of the current year当前年份 5 月的第 n 天。全部签名形如public static System.DateOnly The10th { get; }为便于速查将属性按语义分组列出属性含义当前年份 5 月的……The1st1 日The2nd2 日The3rd3 日The4thThe9th4 9 日The10thThe19th10 19 日The20th20 日The21st21 日The22nd22 日The23rd23 日The24thThe29th24 29 日The30th30 日The31st31 日5 月最后一天属性名中的序数后缀1st / 2nd / 3rd / 21st / 22nd / 23rd 等并非手工编写而是调用 Humanizer 自己的Ordinalize()扩展生成——这一点在 T4 模板源码中有直接证据见下文。5 月固定有 31 天因此属性恰好覆盖 1 至 31 号。实战示例using Humanizer; // OnDate 位于 Humanizer 命名空间 DateOnly laborDay OnDate.May.The1st; // 当年 5 月 1 日劳动节 DateOnly midMay OnDate.May.The15th; // 当年 5 月 15 日 DateOnly monthEnd OnDate.May.The31st; // 当年 5 月 31 日方法成员The(int dayNumber)对于动态日号使用通用方法public static System.DateOnly The(int dayNumber);参数dayNumberSystem.Int32表示想要获取的 5 月日号返回值System.DateOnly即当前年份 5 月第dayNumber天边界行为底层实现为new(DateTime.Now.Year, 5, dayNumber)与直接构造DateOnly完全等价。因此若dayNumber超出 1 31如 32、0、负数会抛出ArgumentOutOfRangeException这与DateOnly构造函数本身的校验行为一致。DateOnly anniversary OnDate.May.The(20); // 当年 5 月 20 日等价于 The20th从 OnDateTests.cs 的测试风格可以推断The(n)与对应的具名属性返回的日期是完全一致的测试中对 1 月、2 月、12 月的The23rd、The(11)、The4th做了Assert.Equal验证五月类遵循同一套生成逻辑。源码实现与 T4 模板生成机制OnDate.May并非手写代码而是由 T4 文本模板批量生成的。模板位于 OnDate.Days.tt其核心循环逻辑为const int leapYear 2012; // 用闰年作基准保证每个月都取到满天数 for (var month 1; month 12; month) { 生成 public class 月名月份名取自 new DateTime(leapYear, month, 1).ToString(MMMM) for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { 属性名 day.Ordinalize() // 调用 Humanizer 的序数化扩展 生成 public static DateOnly The序数 new(DateTime.Now.Year, month, day); } }几个值得注意的实现细节序数名由Ordinalize()生成1.Ordinalize()得1st、2得2nd、3得3rd、21得21st所以模板产出的属性名正是文档中见到的The1st/The2nd/The3rd/The21st/The22nd/The23rd闰年 2012 作为基准月长模板用 2012 年计算每月天数保证 2 月也生成到The29th其余月份天数不受影响年份取运行时值每个成员的表达式都是new(DateTime.Now.Year, month, day)即当年。这意味着同一行代码在跨年时返回的年份会变化代码中应把它视为当前年份语义而非可复现的常量生成物受版本条件约束模板输出文件 OnDate.Days.cs 整体被#if NET6_0_OR_GREATER包裹OnDate.May只在 .NET 6 及更高目标框架或支持DateOnly的环境中可用。模板与生成文件的对应关系在 Humanizer.csproj 中有明确声明None UpdateFluentDate\OnDate.Days.tt GeneratorTextTemplatingFileGenerator LastGenOutputOnDate.Days.cs / Compile UpdateFluentDate\OnDate.Days.cs DesignTimeTrue AutoGenTrue DependentUponOnDate.Days.tt /即OnDate.Days.cs是OnDate.Days.tt的自动生成产物AutoGenTrue。测试如何验证 OnDate 行为Humanizer 用 xUnit 测试锁定了流式日期的语义见 OnDateTests.cs#if NET6_0_OR_GREATER public class OnDateTests { [Fact] public void OnJanuaryThe23rd() Assert.Equal(new(DateTime.Now.Year, 1, 23), OnDate.January.The23rd); [Fact] public void OnDecemberThe4th() Assert.Equal(new(DateTime.Now.Year, 12, 4), OnDate.December.The4th); [Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), OnDate.February.The(11)); } #endif测试模式清楚地印证了实现契约具名属性如The23rd等价于new DateOnly(DateTime.Now.Year, month, day)方法The(n)与具名属性返回同一语义的值测试同样受NET6_0_OR_GREATER条件约束与生成代码的编译边界一致。OnDate.May由于与January、December等类共享同一 T4 模板行为完全同构可放心按上述模式使用。使用场景与注意事项适用场景日历型业务日期如每年 5 月 1 日的劳动节假期5 月第 2 个周日的母亲节月末结算日The31st等属性名即文档注释代码即注释报表与日程构造把DateOnly与InDate、DateTime的AddMonths/AddYears组合做日历级而非固定时长的日期运算详见 fluent-dates-and-time-spans.mdx 中的建议与 Humanizer 其他日期 API 串联例如将OnDate.May.The10th交给DateHumanizeExtensions等做人性化输出。注意事项当前年份语义所有属性都基于DateTime.Now.Year动态取值。官方场景文档明确提醒依赖现在的属性不适合写入确定性代码/测试——需要可复现时应改为显式注入基准日期仅限 .NET 6DateOnly类型决定了OnDate.May只在NET6_0_OR_GREATER目标上编译如果你的项目还在用netstandard2.0或.NET Framework请改用返回DateTime的 On.May 系列对应实现见 On.Days.cs参数越界会抛异常The(32)、The(0)等非法日号会触发DateOnly构造的参数校验异常调用前应自行约束输入范围返回的是纯日期DateOnly不携带时区与时刻信息若后续需要与DateTimeOffset等含时区类型对接需自行补充时区转换。相关 API 一览OnDate.May只是OnDate12 个月份类的代表之一同族 API 还包括OnDate.January、OnDate.February OnDate.December其余月份的同构访问器OnDateOnDate容器类总览On.May返回DateTime的对应版本InDate、In相对日期DaysFrom、MonthsFrom、MayOf(2025)等家族PrepositionsExtensionsAt、AtNoon、AtMidnight等介词扩展。借助OnDate.May这组访问器你可以在 .NET 6 项目中把当前年份的 5 月日期写成近乎自然语言的表达式显著提升日历相关代码的可读性与自文档化程度结合源码中的 T4 生成机制与测试用例也能更透彻地理解 Humanizer FluentDate 家族的整体设计思路。赞分享开发工具【免费下载链接】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.May 流畅日期访问器用 OnDate.May.The1st 一键构造五月任意日期Humanizer OnDate.May 流畅日期访问器用 OnDate.May.The1st 一键构造五月任意日期 本篇技术指南聚焦 Humanizer 的开发工具Humanizer OnDate.May 详解用流式 API 优雅地构造五月日期Humanizer OnDate.May 详解用流式 API 优雅地构造五月日期 导读 OnDate.May 是 Humanizer 流式日期Fluent开发工具Humanizer OnDate.May 流式日期访问器完全指南用 DateOnly 构造今年五月的每一天Humanizer OnDate.May 流式日期访问器完全指南用 DateOnly 构造今年五月的每一天 Humanizer 的 OnDate 系列类型开发工具上一篇Obsidian 插件热重载Hot-Reload原理与开发实践基于 hot-reload-master 源码剖析下一篇南京信息工程大学本科生毕业论文LaTeX模板2025终极排版解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考