尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Humanizer 流式日期 API 详解:OnDate.September 类完整成员指南

发布时间:2026/9/27 10:43:07

资讯中心
01
ARTICLE

Humanizer 流式日期 API 详解:OnDate.September 类完整成员指南

Humanizer 流式日期 API 详解:OnDate.September 类完整成员指南
开发工具【免费下载链接】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.September类为核心系统讲解其 30 个日期访问属性与The(int)工厂方法的签名、语义与源码实现并深入其 T4 代码生成机制与反射测试验证帮助读者在 .NET 6 项目中以强类型、免字符串的方式构造 9 月任意一天的DateOnly值。读完本文你将掌握 Humanizer FluentDate 家族中OnDateDateOnly版与OnDateTime版的区别、序数属性命名规律以及如何与At、AtMidnight、AtNoon等扩展方法组合出精确的时间点。一、类概览OnDate.September 是什么OnDate.September是 Humanizer 流式日期FluentDateAPI 中用于9 月的日期访问器提供以下能力public class OnDate.September类型层级嵌套于 OnDate 类 内部的公共静态类继承链为System.Object→September成员形态全部成员均为public static属性为只读getonly方法为静态工厂返回值类型System.DateOnly日期专用类型不含时间部分命名空间Humanizer可通过using Humanizer;直接使用平台前提DateOnly自 .NET 6 起可用因此OnDate系列仅在NET6_0_OR_GREATER条件下编译见下方源码条件编译部分。同类姊妹类On.September参见 On.September 类文档返回System.DateTime而OnDate.September返回DateOnly二者共同构成 Humanizer 流式日期 API 的双轨设计需要时间分量时用On仅关注日期时用OnDate。二、全部 30 个日期访问属性The1st The30thOnDate.September为 9 月的每一天1 日至 30 日各提供一个静态只读属性语义统一为当前年份的 9 月第 N 天。完整清单如下签名均为public static System.DateOnlygetonly属性含义属性含义The1st9 月 1 日The16th9 月 16 日The2nd9 月 2 日The17th9 月 17 日The3rd9 月 3 日The18th9 月 18 日The4th9 月 4 日The19th9 月 19 日The5th9 月 5 日The20th9 月 20 日The6th9 月 6 日The21st9 月 21 日The7th9 月 7 日The22nd9 月 22 日The8th9 月 8 日The23rd9 月 23 日The9th9 月 9 日The24th9 月 24 日The10th9 月 10 日The25th9 月 25 日The11th9 月 11 日The26th9 月 26 日The12th9 月 12 日The27th9 月 27 日The13th9 月 13 日The28th9 月 28 日The14th9 月 14 日The29th9 月 29 日The15th9 月 15 日The30th9 月 30 日示例假设当前年份为 2026using Humanizer; DateOnly first OnDate.September.The1st; // 2026-09-01 DateOnly mid OnDate.September.The15th; // 2026-09-15 DateOnly last OnDate.September.The30th; // 2026-09-30属性名采用英文序数后缀1st、2nd、3rd、21st、22nd、23rd与 Humanizer 的Ordinalize()扩展输出一致这也是属性命名规律的内在来源详见下文 T4 模板分析。三、动态工厂方法The(int dayNumber)除固定属性外OnDate.September还提供一个按参数取日的静态方法public static System.DateOnly The(int dayNumber);项目说明参数dayNumberSystem.Int32表示目标日期在 9 月中的日序号如 1 表示 9 月 1 日返回值System.DateOnly即当前年份的 9 月第 dayNumber 天适用场景日序号来自运行时变量如用户输入、循环、配置项时无需写 30 个 if 分支示例int day 12; DateOnly target OnDate.September.The(day); // 2026-09-12需要留意的是dayNumber的有效取值范围受 9 月实际天数约束平闰年均为 30 天。传入超出范围的值时底层new DateOnly(year, 9, dayNumber)会抛出ArgumentOutOfRangeException——该行为已被仓库测试显式捕获验证见本文第五部分。四、源码实现与 T4 代码生成机制4.1 手工生成的 September 类实现OnDate.September的实体定义位于 OnDate.Days.cs每个成员都是基于DateTime.Now.Year的极简一行表达式public class September { /// summary /// The nth day of September of the current year /// /summary public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 9, dayNumber); /// summary /// The 1st day of September of the current year /// /summary public static DateOnly The1st new(DateTime.Now.Year, 9, 1); // …… The2nd The30th 同理 }由此可以确认两个实现事实年份取自系统当前时间属性与方法都使用DateTime.Now.Year因此返回值永远落在当年的 9 月跨年调用会得到新一年的日期不存在缓存或固定年份返回值是全新实例每次访问都通过new DateOnly(...)构造属性本质上是无副作用的纯函数。4.2 T4 模板12 个月、全部日期访问器如何批量生成OnDate.Days.cs这份 2336 行的文件并非全部手写而是由 T4 文本模板 OnDate.Days.tt 生成。模板核心逻辑如下const int leapYear 2012; for (var month 1; month 12; month) { var firstDayOfMonth new DateTime(leapYear, month, 1); var monthName firstDayOfMonth.ToString(MMMM); // 生成月份类名如 September // ... public static DateOnly The(int dayNumber) new(DateTime.Now.Year, # month #, dayNumber); for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); // 1 → 1st、2 → 2nd、3 → 3rd…… public static DateOnly The# ordinalDay # new(DateTime.Now.Year, # month #, # day #); } }这段模板揭示了三个关键设计月份类名来自区域性月份名称模板以 2012 年闰年为基准用DateTime.ToString(MMMM)取得英文月份名September从而自动生成 12 个同名嵌套类属性后缀来自Ordinalize()day.Ordinalize()是 Humanizer 自带的序数化扩展输出1st/2nd/3rd/…这正是The1stThe30th命名的直接来源天数来自DateTime.DaysInMonth9 月在 2012 闰年为 30 天故生成 30 个属性若某月为 28/29 天2 月或 31 天如 10 月、12 月生成数量也会随之变化。因此本文表格中的30 个属性并非巧合而是模板按真实历法推算的必然结果。4.3 OnDate 与 OnDateOnly / DateTime 双轨对照OnDate系列OnDate.Days.cs整体以#if NET6_0_OR_GREATER包裹而对应的On系列On.Days.cs无此限制两者结构完全平行仅返回值类型不同// On返回 DateTime.NET Standard 2.0 均可用 public static DateTime The(int dayNumber) new(DateTime.Now.Year, 9, dayNumber); public static DateTime The1st new(DateTime.Now.Year, 9, 1); // OnDate返回 DateOnly仅 .NET 6 public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 9, dayNumber); public static DateOnly The1st new(DateTime.Now.Year, 9, 1);选用原则目标框架为 .NET 6 及以上且业务只关心某年某月某日如生日、账单日、排期时OnDate.September的DateOnly更贴切需要同时携带时间或兼容旧框架时则用On.September。五、测试验证反射扫描保证 12 个月全覆盖仓库通过反射式测试确保所有月份的属性与方法是完整且正确的。相关测试位于 GeneratedFluentDateTests.csOnDateDayPropertiesCoverAllGeneratedDayAccessorsL46-L47遍历OnDate下全部 12 个月份嵌套类对每个以The开头的属性调用GetValue(null)再断言其Year/Month/Day与当前年份 月份序号 属性后缀日号完全一致OnDateTheMethodsCoverAllGeneratedMonthFactoriesL49-L51对每个月份类的The(int)方法反射调用参数为 1断言返回的DateOnly为当月 1 日月份映射表含(September, 9)条目见 L353辅助方法AssertMonthDayPropertiesL171-L193同时捕获TargetInvocationException并断言内部异常为ArgumentOutOfRangeException——这正是对The(dayNumber)越界参数行为的测试锚点TryParseDayPropertyL307-L316从属性名The15th中解析数字 15 并与返回日期比对进一步验证了属性名 ↔ 日期值的一一对应关系。六、实战组合从日期到具体时间点OnDate.September返回的DateOnly可与 Humanizer 的介词扩展PrepositionsExtensions.cs及OnDate的其他成员配合构建当年 9 月某日 具体时刻的完整语义。例如using Humanizer; // 当年 9 月 15 日的正午 DateOnly meetingDay OnDate.September.The15th; // 与 OnDate 其他月份类协同如 9 月最后一天与 10 月第一天 DateOnly sepEnd OnDate.September.The30th; DateOnly octStart OnDate.October.The1st;若需要在DateOnly之上补足时间分量可在 .NET 6 中使用DateOnly.ToDateTime(TimeOnly)或直接改用On.September.The15th再调用At(hour, min, second, millisecond)扩展DateTime meetingStart On.September.The15th.At(14, 30); // 当年 9 月 15 日 14:30 DateTime noonOnLastDay OnDate.September.The30th default ? default : On.September.The30th.AtNoon(); // 当年 9 月 30 日 12:00七、使用注意事项小结框架版本OnDate.September仅在NET6_0_OR_GREATER下编译并可用DateOnly依赖旧框架项目请使用On.September年份语义所有成员基于DateTime.Now.Year永远返回今年的 9 月日期无法直接指定任意年份——如需指定年份请改用In.SeptemberOf(year)DateTime版或自行对DateOnly做AddYears换算参数边界The(int dayNumber)超出 130 会抛出ArgumentOutOfRangeException调用前应校验输入不可变性属性每次访问都会构造新的DateOnly实例无共享可变状态可放心在并发场景使用API 文档对应关系本文对应的权威 API 参考页为 Humanizer.OnDate.September.md其姊妹类文档 Humanizer.OnDate.md 与 Humanizer.On.September.md 可一并查阅。综上OnDate.September以 30 个零参数的强类型属性覆盖了 9 月每一天配合动态The(int)方法与 Humanizer 的介词扩展能在不拼接字符串、不手写new DateOnly(year, 9, n)的情况下写出可读性极佳的日期构建代码其背后 T4 模板的历法推导与反射测试的全覆盖也为所有月份类结构一致、行为可靠提供了实现级保证。赞分享开发工具【免费下载链接】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.September 详解用流式 API 构建 9 月日期DateOnlyHumanizer OnDate.September 详解用流式 API 构建 9 月日期DateOnly 本篇指南聚焦 Humanizer 的 OnDa开发工具Humanizer 流式日期 API 深度解析On.January 类全成员指南Humanizer 流式日期 API 深度解析On.January 类全成员指南 本文围绕 Humanizer 2.11.10 版本文档中的 On.Janua开发工具DeepEval 如何用 MMLU 基准测试自定义 LLM 并解释 overall_score 计分DeepEval 如何用 MMLU 基准测试自定义 LLM 并解释 overall_score 计分 如果你训练或微调了一个自定义 LLM想回答“它到底在通用开发工具上一篇终极指南BCompare_Keygen开源工具实现Beyond Compare 5.x永久激活的完整方案下一篇3分钟搞定BetterNCM安装器网易云音乐终极定制指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。