Humanizer OnDate.September 流式日期 API 完全指南:用 DateOnly 表达“九月第 N 天“

发布时间:2026/9/25 3:27:43

Humanizer OnDate.September 流式日期 API 完全指南:用 DateOnly 表达“九月第 N 天“ 开发工具【免费下载链接】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 流式日期Fluent DateAPI 的实战指南聚焦OnDate.September这一为.NET 6 的DateOnly类型设计的九月日期访问器它用 30 个静态属性The1stThe30th和 1 个参数化方法The(int)把当前年份的 9 月某天变成自然语言般的强类型代码。读完本文你将掌握该 API 的完整成员清单、底层实现原理含 T4 模板生成机制、边界行为、测试验证方式以及如何与InDate、In、On等其他流式 API 配合写出可读性极高的日期代码。一、OnDate.September 是什么OnDate.September是 Humanizer 中OnDate静态类位于 src/Humanizer/FluentDate/OnDate.Days.cs的嵌套类专门用于构造当前年份九月的任意一天返回类型为System.DateOnly。其 API 文档website/versioned_docs/version-2.11.10/api/Humanizer.OnDate.September.md给出的类声明为public class OnDate.September继承关系为System.Object→September所有成员均为public static。与OnDate.January、OnDate.December等其余 11 个月份嵌套类一样它把某年某月某日这一最常见的日期构造场景简化成一句近乎口语的表达式例如using Humanizer; // 当前年份 9 月 23 日 DateOnly nationalDay OnDate.September.The23rd;这段代码等价于手写new DateOnly(DateTime.Now.Year, 9, 23)但语义一目了然无需关注年份、月份与日期构造参数的顺序读到代码即知九月二十三号。二、成员全览30 个静态属性 1 个参数化方法OnDate.September的公开 API 分为两部分全部为静态成员无需实例化即可调用。2.1 静态属性 The1st ~ The30th九月共 30 天因此该类提供The1st到The30th共 30 个静态只读属性每个属性返回当前年份对应日期的DateOnly。下表按日期顺序完整列出属性名均遵循英语序数词后缀规则1 用st、2 用nd、3 用rd、其余用th属性含义属性含义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 日每个属性的签名统一为public static System.DateOnly The30th { get; }2.2 参数化方法 The(int dayNumber)当目标日期不是常用固定日、或希望以变量方式传入时使用The(int)方法public static System.DateOnly The(int dayNumber);参数dayNumberSystem.Int32表示九月的第几天130。返回值System.DateOnly。int day 5; DateOnly date OnDate.September.The(day); // 等价于 OnDate.September.The5th注意传入超出 130 范围的数值如0、31、-1时DateOnly构造函数会抛出ArgumentOutOfRangeException这一点由 tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs 中的反射测试显式捕获验证见下文测试验证一节。三、底层实现一行表达式 T4 模板生成3.1 属性与方法的真实实现OnDate.September的源码位于 src/Humanizer/FluentDate/OnDate.Days.cs 第 1561 行起。每个成员都只是当前年份 固定月份 9 目标日的DateOnly构造表达式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返回值始终是当前年份的九月日期。跨年如 12 月 31 日调用后同一表达式会返回新一年的日期。从源码结构可以推断若需要特定年份应改用InDate.SeptemberOf(2025)这类带年份参数的 API见下文。返回DateOnly与On类返回DateTime形成互补。OnDate系整套类被#if NET6_0_OR_GREATER条件编译指令包裹见 src/Humanizer/FluentDate/OnDate.Days.cs 第 1 行仅在 .NET 6 及以上目标框架可用因为DateOnly类型自 .NET 6 才引入。零分配、无缓存每个属性调用即构造逻辑上是纯计算没有状态与共享可变数据。3.2 T4 模板12 个月份类的来源OnDate.Days.cs并非手写而是由 T4 文本模板 src/Humanizer/FluentDate/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); // 生成 public class monthName public static DateOnly The(int dayNumber) new(DateTime.Now.Year, month, dayNumber); // 用 Ordinalize() 生成 The1st/The2nd/... 属性名 for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); public static DateOnly TheordinalDay new(DateTime.Now.Year, month, day); } }模板以闰年 2012 为基准计算各月天数2 月 29 天因此生成的每个月份类都恰好拥有The1st至The当月天数的属性九月的 30 天对应 30 个属性。属性名中的序数词st/nd/rd/th由 Humanizer 自身的Ordinalize()扩展生成——这正是Humanizer 用 Humanizer 来生成自己的一个有趣体现。四、为什么用 OnDate.September使用场景与对比4.1 典型业务场景OnDate.September最适用于**代码中固定引用某些日期敏感日**的场景例如开学日、教师节9 月 10 日OnDate.September.The10th每月账单日、发布日、巡检日等固定日期的 9 月版本与DateOnly相关的领域模型字段赋值、测试夹具中的固定日期示例using Humanizer; // 教师节当前年份 9 月 10 日 DateOnly teachersDay OnDate.September.The10th; // 用变量构造第 15 个工作日标记 int businessDay 15; DateOnly target OnDate.September.The(businessDay);4.2 与其他流式 API 的对比Humanizer 的 FluentDate 体系目录 src/Humanizer/FluentDate/提供四套风格互补的入口入口类返回类型表达语义代表性示例OnDate.SeptemberDateOnly当前年份 9 月某天OnDate.September.The1stOn.SeptemberDateTime当前年份 9 月某天带时间分量On.September.The1stInDate.September/InDate.SeptemberOf(year)DateOnly当前年份 / 指定年份 9 月 1 日InDate.SeptemberOf(2025)In.September/In.SeptemberOf(year)DateTime当前年份 / 指定年份 9 月 1 日In.SeptemberOf(2009)对应源码与测试On类位于 src/Humanizer/FluentDate/On.Days.cs其September嵌套类第 1568 行起实现与OnDate.September完全同构仅返回DateTime。In.September的语义由 tests/Humanizer.Tests/FluentDate/InTests.cs 验证In.September等于new(DateTime.Now.Year, 9, 1)In.SeptemberOf(2009)等于new(2009, 9, 1)。官方文档示例website/docs/_examples/scenarios-fluent-dates/Program.cs展示了流式日期的完整用法In.Two.MonthsFrom(startingPoint)、In.AprilOf(2025).AddDays(2).At(14, 30)等说明In/InDate侧重相对时间与指定年份而On/OnDate侧重当前年份的绝对日期。选型建议需要纯日期无时间部分且年份取当前年用OnDate.September需要DateTime或后续要叠加时间用On.September需要指定特定年份改用InDate.SeptemberOf(year)或In.SeptemberOf(year)。五、测试验证生成式 API 如何被保证正确Humanizer 对该类 API 的正确性验证非常系统。两个测试文件覆盖了成员存在性与返回值正确性两个层面tests/Humanizer.Tests/FluentDate/OnDateTests.cs手写断言验证OnDate.January.The23rd、OnDate.December.The4th、OnDate.February.The(11)均返回当前年份 对应月 对应日的DateOnly。tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs通过反射自动遍历所有生成成员OnDateDayPropertiesCoverAllGeneratedDayAccessors遍历OnDate下所有月份嵌套类的全部静态属性用TryParseDayProperty解析TheNNth形式的属性名并断言其值等于new DateOnly(当前年, 月, 日)OnDateTheMethodsCoverAllGeneratedMonthFactories遍历每个月份类的The(int)方法并断言The(1)等于当月 1 日当属性构造抛异常时如传入非法日期测试会捕获TargetInvocationException并断言其内部异常为ArgumentOutOfRangeException月份表Months数组中 September 对应数字 9作为反射断言的依据。这两个测试共同保证了只要 T4 模板生成逻辑不变OnDate.September的 30 个属性与The(int)方法就始终与当前年份 9 月 N 日的语义保持一致。六、使用注意事项与限制目标框架限制OnDate整套 API 需要 .NET 6DateOnly类型的前提。在 .NET Framework 或 .NET 5 及以下项目中不可用此时请使用返回DateTime的On.September。年份是运行时当前年返回值随调用时刻变化不能用于表示固定年份的日期跨年进程或午夜边界调用时结果可能变化。参数范围The(int dayNumber)只接受 130越界会抛ArgumentOutOfRangeException。官方文档与源码均未提供超出后自动钳制或滚入下月的行为。无时间分量返回的是DateOnly午夜零点语义若业务需要具体时刻如9 月 10 日 8:30 开课可组合ToDateTime(TimeOnly)或改用On.September系列。区域性无关类名与属性名是固定的英文序数词命名不受当前线程CultureInfo影响任何区域下调用结果一致。七、小结OnDate.September是 Humanizer 流式日期体系在DateOnly时代的典型代表30 个语义直白的静态属性加一个参数化方法把当前年份九月第 N 天这一高频构造场景封装成近乎自然语言的代码。它的实现极简一行DateOnly构造、来源可溯T4 模板生成、测试反射全量校验与On/In/InDate系列共同构成一套完整的日期表达工具链。需要进一步了解整体设计可阅读仓库根目录的 ARCHITECTURE.md 与 DESIGN.md完整的流式日期使用示例参见 website/docs/_examples/scenarios-fluent-dates/Program.cs。赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐SurfSense 前端性能规则详解用 Promise.all() 并行化独立异步操作消除请求瀑布流SurfSense 前端性能规则详解用 Promise.all 并行化独立异步操作消除请求瀑布流 本文以 SurfSense 仓库内置的 Vercel Re开发工具PostHog Desktop 深链接体系URL Scheme 注册、Handler 路由与 OAuth 回调全解PostHog Desktop 深链接体系URL Scheme 注册、Handler 路由与 OAuth 回调全解 本文基于 PostHog 仓库中桌面端d开发工具Humanizer InDate.Two 流畅日期 API 指南用 DateOnly 优雅表达从现在起两天/两周/两月/两年Humanizer InDate.Two 流畅日期 API 指南用 DateOnly 优雅表达从现在起两天/两周/两月/两年 本篇技术指南聚焦于 .NET开发工具上一篇3步开启你的Switch游戏之旅yuzu模拟器完全使用手册下一篇class-transformer与电子商务产品数据处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/25 3:27:43

SpringBoot容器内存调优:从OOM Killed到全链路排查

先说一个我踩了很久才想明白的坑。之前把一个SpringBoot订单服务部署到HoRain云托管的Kubernetes集群上,内存limit给了2G,当时觉得这个量绰绰有余。结果跑了大概三周,容器开始反复重启。我第一时间去翻应用日志,一个OutOfMemoryEr…

2026/9/25 4:17:44

Delphi 12.3 下 ReportMachine 7.0 安装配置与报表开发实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:17:44

USRP B210入门避坑指南:USB供电、固件匹配与UHD驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:17:44

Mendeley Reference Manager全攻略:从文献管理到Word引用生成

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 4:17:44

CarSim安装与Simulink联合仿真配置全流程指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑