ARTICLE DETAIL

资讯详情

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

Humanizer `On.March` 流式日期访问器完全指南:三月 31 个日期属性与源码实现解析

Humanizer `On.March` 流式日期访问器完全指南:三月 31 个日期属性与源码实现解析 开发工具【免费下载链接】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 的On.March类展开它是流式日期Fluent DateAPI 家族中专门表达当前年份三月的某一天的静态访问器集合。读完本文你将掌握On.March.The1stThe31st全部 31 个日期属性的准确语义与返回类型、The(int dayNumber)方法的动态取值用法并理解这些 API 由 T4 模板批量生成的底层原理、与At/AtNoon/AtMidnight等介词扩展的组合套路以及读取当前年份这一行为在可重复测试与确定型代码中的注意事项。On.March类概览On.March是嵌套在静态类On内部的公共类位于Humanizer命名空间下用于为三月提供流式日期访问器fluent date accessorspublic class On.March从继承关系看它是一个直接继承自System.Object的普通类类内所有成员都是public static因此使用时不需实例化直接以On.March.xxx形式调用。该类的完整源码位于 src/Humanizer/FluentDate/On.Days.cs整个On类在同一文件中按月份嵌套定义了JanuaryDecember共 12 个类似的月类。在 Humanizer 的日期 API 体系中On系列承担构造日历日期的职责On.April.The3rd、On.March.The15th这类调用读起来就是一句自然语言。配套的还有提供DateOnly变体的OnDate类以及表示将来时间的In系列如In.Two.MonthsFrom(startingPoint)三者共同构成 website/docs/scenarios/fluent-dates-and-time-spans.mdx 中描述的可读性日期构造器。完整 API 清单31 个静态日期属性On.March为三月的每一天1 日至 31 日提供对应的静态属性命名采用序数词后缀The1st、The2nd、The3rd……每个属性的返回值都是System.DateTime语义统一为当前年份三月的第 N 天。属性总表属性名说明返回类型On.March.The1st当前年份三月的第 1 天System.DateTimeOn.March.The2nd当前年份三月的第 2 天System.DateTimeOn.March.The3rd当前年份三月的第 3 天System.DateTimeOn.March.The4th当前年份三月的第 4 天System.DateTimeOn.March.The5th当前年份三月的第 5 天System.DateTimeOn.March.The6th当前年份三月的第 6 天System.DateTimeOn.March.The7th当前年份三月的第 7 天System.DateTimeOn.March.The8th当前年份三月的第 8 天System.DateTimeOn.March.The9th当前年份三月的第 9 天System.DateTimeOn.March.The10th当前年份三月的第 10 天System.DateTimeOn.March.The11th当前年份三月的第 11 天System.DateTimeOn.March.The12th当前年份三月的第 12 天System.DateTimeOn.March.The13th当前年份三月的第 13 天System.DateTimeOn.March.The14th当前年份三月的第 14 天System.DateTimeOn.March.The15th当前年份三月的第 15 天System.DateTimeOn.March.The16th当前年份三月的第 16 天System.DateTimeOn.March.The17th当前年份三月的第 17 天System.DateTimeOn.March.The18th当前年份三月的第 18 天System.DateTimeOn.March.The19th当前年份三月的第 19 天System.DateTimeOn.March.The20th当前年份三月的第 20 天System.DateTimeOn.March.The21st当前年份三月的第 21 天System.DateTimeOn.March.The22nd当前年份三月的第 22 天System.DateTimeOn.March.The23rd当前年份三月的第 23 天System.DateTimeOn.March.The24th当前年份三月的第 24 天System.DateTimeOn.March.The25th当前年份三月的第 25 天System.DateTimeOn.March.The26th当前年份三月的第 26 天System.DateTimeOn.March.The27th当前年份三月的第 27 天System.DateTimeOn.March.The28th当前年份三月的第 28 天System.DateTimeOn.March.The29th当前年份三月的第 29 天System.DateTimeOn.March.The30th当前年份三月的第 30 天System.DateTimeOn.March.The31st当前年份三月的第 31 天System.DateTime方法The(int dayNumber)除了 31 个命名属性On.March还提供一个参数化方法用于动态取得三月的任意一天public static System.DateTime The(int dayNumber);参数dayNumber类型System.Int32表示目标日期在三月中的日序号131。返回System.DateTime即当前年份三月第dayNumber天。边界行为从源码new(DateTime.Now.Year, 3, dayNumber)可以看出dayNumber会直接传入DateTime构造函数超出 131 范围例如The(32)或The(0)会抛出ArgumentOutOfRangeException这是由System.DateTime构造函数本身强制校验的Humanizer 未做额外包装。参数化方法与命名属性的取舍很直接写死业务日期如营销活动固定为 3 月 14 日用The14th更自文档化日期来自变量或计算结果时用The(dayNumber)。源码实现一行表达式与 T4 模板批量生成On.March的每个成员实现都极其精简本质是对DateTime构造函数的封装。以属性The1st为例源码为public static DateTime The1st new(DateTime.Now.Year, 3, 1);即取当前系统时间的年份固定月份 3固定日序号返回值带 0 时 0 分 0 秒不携带时区信息。The(int dayNumber)同理public static DateTime The(int dayNumber) new(DateTime.Now.Year, 3, dayNumber);从源码结构看这段代码并非手写 12 个月 × 各自天数的大量样板而是由一个 T4 文本模板批量生成的。src/Humanizer/FluentDate/On.Days.tt 中模板以 2012 年闰年用于覆盖 2 月 29 日为基准遍历 12 个月用firstDayOfMonth.ToString(MMMM)取得英文月份名作为嵌套类名再用day.Ordinalize()生成The1st、The2nd……这种序数后缀for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); // 生成 public static DateTime TheordinalDay new(DateTime.Now.Year, month, day); }Ordinalize()是 Humanizer 自身的序数词扩展实现位于 src/Humanizer/OrdinalizeExtensions.cs模板由此保证1 → 1st、2 → 2nd、3 → 3rd、21 → 21st等英文序数后缀的规范性。这也是为什么On.March的 31 个属性名严格遵循英文序数词形。顺带一提模板对每个月的天数取自闰年 2012 的DateTime.DaysInMonth所以二月生成到The29th而三月固定生成 31 个属性——三月在任何年份都有 31 天因此On.March不存在闰年下溢问题。组合用法从三月某日到完整时间点On.March.TheNth只产出日期时间为 00:00:00。要拼出完整的业务时间点可与 PrepositionsExtensions 提供的扩展方法链式组合using Humanizer; // 当前年份 3 月 14 日 14:30:00 var piDay On.March.The14th.At(14, 30); // 当前年份 3 月 1 日 12:00:00 var noon On.March.The1st.AtNoon(); // 当前年份 3 月 31 日 00:00:00 var monthEndMidnight On.March.The31st.AtMidnight(); // 动态日序号某月的第 n 天 var dynamicDay On.March.The(dayNumber);At(int hour, int min 0, int second 0, int millisecond 0)允许一次性指定时、分、秒、毫秒AtNoon()等价于At(12)AtMidnight()等价于At(0)。官方可运行示例 website/docs/_examples/scenarios-fluent-dates/Program.cs 演示了同类用法如In.AprilOf(2025).AddDays(2).At(14, 30)可直接参照此模式组织三月日程。如需将三月日期固定到指定年份而非当前年份可用PrepositionsExtensions.In(int year)var marchFirst2026 On.March.The1st.In(2026); // 2026-03-01 00:00:00若目标框架支持DateOnly.NET 6可改用OnDate.March系列源码见 src/Humanizer/FluentDate/OnDate.Days.cs其 API 形状与On.March完全一致只是返回System.DateOnly。测试验证Humanizer 测试套件 tests/Humanizer.Tests/FluentDate/OnTests.cs 直接验证了On系列访问器与当前年份构造的等价性[Fact] public void OnJanuaryThe23rd() Assert.Equal(new(DateTime.Now.Year, 1, 23), On.January.The23rd); [Fact] public void OnDecemberThe4th() Assert.Equal(new(DateTime.Now.Year, 12, 4), On.December.The4th); [Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), On.February.The(11));这些断言确认了两点实现事实命名属性与new DateTime(DateTime.Now.Year, month, day)完全等价The(dayNumber)方法同样以DateTime.Now.Year为年份基准。On.March的成员遵循同一模板逻辑行为可由此类推。使用注意事项与边界依赖当前年份On.March所有成员都读取DateTime.Now.Year因此结果随调用时刻变化。官方场景文档 website/docs/scenarios/fluent-dates-and-time-spans.mdx 明确建议在需要可重复执行的代码或测试中避免依赖当前时间的访问器应注入固定起始日期例如用In.Two.MonthsFrom(startingPoint)配合显式DateTime或直接用In(2026)/OnDate固定年份。本地时间而非 UTCDateTime.Now是本地时钟时间跨时区部署时同一代码在不同服务器上会得到不同结果需要 UTC 语义时应自行用DateTime.UtcNow.Year组合构造。时间部分恒为 0属性与The(n)返回的时间均为午夜零点需要具体时刻务必再接At/AtNoon/AtMidnight。参数范围The(dayNumber)的dayNumber越界会抛异常三月固定 31 天不存在 2 月 29 日式的闰年特例。API 归属On.March属于 Humanizer 的Humanizer.FluentDate命名空间文件组见 src/Humanizer/FluentDate 目录随主程序集一并分发引入using Humanizer;即可使用无需额外安装独立包。相关 API 与延伸阅读同族 API[On类12 个月完整访问器源码 src/Humanizer/FluentDate/On.Days.cs](website/docs/api/Humanizer.On.md)、OnDate类DateOnly变体配套扩展PrepositionsExtensionsAt/AtNoon/AtMidnight/In(year)实战场景流式组合日期与时长 及官方示例 Program.cs测试佐证OnTests.cs简而言之On.March.The14th一类调用把三月十四日变成了可读、可组合、类型安全的 C# 表达式——在报表截止日、活动排期、账单日等固定日历场景中它比手写new DateTime(DateTime.Now.Year, 3, 14)更贴近业务语义也让代码评审者一眼读懂意图。赞分享开发工具【免费下载链接】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 流畅日期访问器 On.March 全解析3 月日期构建 API 的用法与源码实现Humanizer 流畅日期访问器 On.March 全解析3 月日期构建 API 的用法与源码实现 导读 On.March 是 Humanizer 流畅日期开发工具Stable-Baselines3 Logger 完整指南自定义日志格式与训练指标解读Stable Baselines3 Logger 完整指南自定义日志格式与训练指标解读 Stable Baselines3SB3内置了一套灵活的日志系统开发工具Humanizer 流式日期 API 详解On.June 六月日期访问器完全指南Humanizer 流式日期 API 详解On.June 六月日期访问器完全指南 本篇技术指南围绕 Humanizer 流式日期Fluent DateAP开发工具上一篇ComfyUI-WanVideoWrapper如何在10分钟内生成1025帧长视频的完整指南 下一篇AI 文献综述怎么做Scientific Agent Skills 论文全文检索 假设生成 证据溯源写作完整教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表