ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Humanizer 的 OnDate.February:用 DateOnly 流式访问 2 月每一天的完整指南

Humanizer 的 OnDate.February:用 DateOnly 流式访问 2 月每一天的完整指南 开发工具【免费下载链接】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.February 是 Humanizer 流式日期Fluent DateAPI 家族中面向 2 月的专用访问器它以嵌套类的形式为 2 月的每一天提供一个静态属性The1st到The29th并提供一个按天数取值的The(int dayNumber)方法返回值均为System.DateOnly。本文基于当前仓库中 version-3.0.10 的 API 文档 展开并结合源码与测试用例完整覆盖该类全部 29 个属性、动态取值方法、生成原理、闰年处理与测试验证读完即可在自己的 .NET 6 项目中直接使用。OnDate.February 的定位DateOnly 版的流式 2 月访问器在 Humanizer 的Humanizer命名空间下OnDate是一个容器类内部按月份嵌套了 12 个类JanuaryDecember每个类都遵循相同的模式为当月每一天提供一个第 N 天的静态属性以及一个The(int dayNumber)方法。OnDate.February正是其中负责 2 月的那个嵌套类。public class OnDate.February类的继承链为System.Object→February这一点与仓库中 OnDate.Days.cs 源码 的声明一致public class February嵌套于public class OnDate内部。关键设计点在于OnDate系列返回的是System.DateOnly而不是System.DateTime。DateOnly是 .NET 6 引入的、专门表示年-月-日且不含时间部分的日期类型因此整套OnDateAPI 被编译指令#if NET6_0_OR_GREATER包裹仅在 .NET 6 及以上框架中可用。与之相对的仓库中还提供了返回DateTime的 On.Days.cs 系列On.February.The11th等供需要完整时间组件的场景使用。快速上手三行代码拿到 2 月日期引用 Humanizer 包后直接通过静态属性即可获得 2 月某一天年份取当前年份using Humanizer; DateOnly valentinesDay OnDate.February.The14th; // 今年 2 月 14 日 DateOnly arbitraryDay OnDate.February.The(23); // 今年 2 月 23 日与手写new DateOnly(DateTime.Now.Year, 2, 14)相比OnDate.February.The14th以自然语言般的表达消除了魔法数字代码自文档化程度更高。仓库测试 OnDateTests.cs 中给出了等价性的验证方式[Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), OnDate.February.The(11));完整 API 清单29 个属性加 1 个动态方法根据 Humanizer.OnDate.February.md 的 API 文档OnDate.February共暴露 29 个静态属性对应 2 月的 129 天和 1 个静态方法。所有属性均声明为public static System.DateOnly The{第N天} { get; }下表列出全部属性及其语义属性语义属性语义The1st2 月 1 日The16th2 月 16 日The2nd2 月 2 日The17th2 月 17 日The3rd2 月 3 日The18th2 月 18 日The4th2 月 4 日The19th2 月 19 日The5th2 月 5 日The20th2 月 20 日The6th2 月 6 日The21st2 月 21 日The7th2 月 7 日The22nd2 月 22 日The8th2 月 8 日The23rd2 月 23 日The9th2 月 9 日The24th2 月 24 日The10th2 月 10 日The25th2 月 25 日The11th2 月 11 日The26th2 月 26 日The12th2 月 12 日The27th2 月 27 日The13th2 月 13 日The28th2 月 28 日The14th2 月 14 日The29th2 月 29 日The15th2 月 15 日属性命名使用英文序数词后缀1st、2nd、3rd、21st、22nd、23rd等与日常英语表达一致。动态取值方法 The(int dayNumber)除固定属性外还提供按参数取任意一天的方法public static System.DateOnly The(int dayNumber);参数dayNumber类型System.Int32表示 2 月中的第几天返回值System.DateOnly。该方法适合天数在运行时才确定的场景如由业务规则计算出的日期例如OnDate.February.The(userInput)。源码实现解析一行表达式与 T4 代码生成OnDate.February的实现非常精简。在 OnDate.Days.cs 中February 类的核心代码如下public class February { /// summary /// The nth day of February of the current year /// /summary public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 2, dayNumber); /// summary /// The 1st day of February of the current year /// /summary public static DateOnly The1st new(DateTime.Now.Year, 2, 1); // ……The2nd 到 The28th 依此类推…… /// summary /// The 29th day of February of the current year /// /summary public static DateOnly The29th new(DateTime.Now.Year, 2, 29); }从源码结构可以确认几个实现事实年份始终取DateTime.Now.Year所有属性与方法都以当前年份 固定月份 2 目标日构造DateOnly因此每年 2 月调用都会自动得到当年的日期无需手动传入年份属性均为表达式体 getter每个属性内部就是一个DateOnly构造表达式无额外逻辑开销可忽略2 月最多提供到The29thThe29th的存在使闰年场景2 月 29 日天然可用非闰年时该日期不存在构造DateOnly会抛出ArgumentOutOfRangeException这属于DateOnly类型的正常边界行为使用前需按业务判断年份。值得说明的是这份看似重复的代码并非手写而是由T4 文本模板OnDate.Days.tt 自动生成的。模板的核心逻辑如下const int leapYear 2012; for (var month 1; month 12; month) { var monthName new DateTime(leapYear, month, 1).ToString(MMMM); // ……生成 public class 月份名 嵌套类…… for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); // ……生成 public static DateOnly The{序数} new(DateTime.Now.Year, 月份, 天); } }这段模板揭示了两个设计细节模板以 2012 年闰年为基准计算每月天数DateTime.DaysInMonth(2012, 2)返回 29因此 2 月恰好生成The1stThe29th共 29 个属性其他月份如 4 月则只生成到The30th。也就是说每个属性对应合法的一天这一正确性由生成逻辑保证属性名中的序数词由 Humanizer 自身的Ordinalize()扩展方法生成1.Ordinalize()得到1st这正是属性The1st命名中st/nd/rd/th后缀的来源体现了 Humanizer 用自身能力生成自身 API 的巧思Ordinalize定义于 OrdinalizeExtensions.cs。测试验证仓库如何证明 API 行为OnDate.February的行为在 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测试文件的#if NET6_0_OR_GREATER预编译指令与源码保持一致再次确认OnDate系列仅面向 .NET 6。其中OnFebruaryThe用例验证了The(int dayNumber)方法当参数为 11 时结果应等于new DateOnly(当前年, 2, 11)——与源码new(DateTime.Now.Year, 2, dayNumber)的实现完全对应。如果你对某一天的固定属性有疑问也可以仿照该模式用Assert.Equal(new(DateTime.Now.Year, 2, N), OnDate.February.TheNth)自行验证。流式日期家族的横向对比OnDate.February不是孤立的 API理解它与同族 API 的关系能帮你选对工具API返回类型框架要求源码文件用途OnDate.February.The11thDateOnly.NET 6OnDate.Days.cs只需日期、不要时间部分时On.February.The11thDateTime所有支持的框架On.Days.cs需要带时间组件午夜零点的完整日期时间时两个系列结构完全对称均由各自的.tt模板OnDate.Days.tt 与 On.Days.tt生成。在 Humanizer 的流式日期体系里On/OnDate用于定位某年某月某日In/InDate则用于当前时间加/减一段时间例如In.Two.Days与 InDate.SomeTimeFrom.cs月份全名类 API 如On.February、On.March均可在 On.Days.cs 中找到。更多流式日期的使用示例可参考 On 系列 API 文档 与 OnDate 系列 API 文档。使用注意事项与最佳实践确认目标框架为 .NET 6OnDate.February返回DateOnly整个OnDate类在NET6_0_OR_GREATER下才编译。若项目面向 .NET Framework 或 .NET 5请改用返回DateTime的On.February属性方法混用按场景取舍写死的固定日期如情人节The14th优先用属性表达更自然动态计算的天数用The(dayNumber)注意 2 月天数边界The29th只在闰年存在。非闰年构造 2 月 29 日会因超出DateOnly合法范围而抛异常涉及 2 月 29 日时应先判断DateTime.IsLeapYear(DateTime.Now.Year)年份语义所有访问器都以DateTime.Now.Year为基准不提供指定年份的重载。若需某特定年份的 2 月某日应直接使用new DateOnly(year, 2, day)无状态、零开销全部为静态成员与表达式体实现不产生实例状态可放心在热路径与批量循环中调用。综上OnDate.February以最简的 API 面解决了拿到今年 2 月某一天的日常需求配合 Humanizer 的DateOnly支持与 T4 生成机制是流式日期 API 中值得优先采用的表达方式。赞分享开发工具【免费下载链接】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 流式日期访问器完全指南用 DateOnly 构造今年五月的每一天Humanizer OnDate.May 流式日期访问器完全指南用 DateOnly 构造今年五月的每一天 Humanizer 的 OnDate 系列类型开发工具Humanizer OnDate.August 完全指南用 DateOnly 流畅构造 8 月的每一天Humanizer OnDate.August 完全指南用 DateOnly 流畅构造 8 月的每一天 OnDate.August 是 Humanizer F开发工具Humanizer 流式日期 API 详解OnDate.February 与 2 月日期访问器Humanizer 流式日期 API 详解OnDate.February 与 2 月日期访问器 Humanizer 提供了一套以自然语言为核心的 .NET 字开发工具上一篇3步解锁WeMod完整功能Wand-Enhancer终极配置指南下一篇WarcraftHelper魔兽争霸3现代系统兼容性终极解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表