Humanizer 流式日期 API 详解:On.August 类的全部成员、实现原理与实战用法

发布时间:2026/9/29 8:19:26

Humanizer 流式日期 API 详解:On.August 类的全部成员、实现原理与实战用法 开发工具【免费下载链接】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静态类为 .NET 开发者提供了一套口语化的流式日期访问器fluent date accessors让你可以用On.August.The23rd这样接近自然语言的表达式直接获得当前年份的 8 月 23 日。本篇以On.August类为切入点逐一解析其全部 31 个静态属性与The(int)方法并结合源码揭示其由 T4 模板自动生成的实现机制、On与OnDate两个入口的差异以及实际使用中的注意事项帮助你彻底掌握 Humanizer 流式日期 API 的正确用法。一、类概览On.August 是什么On.August是 On 类 内部嵌套的一个公开类其唯一职责是提供 8 月August的流式日期访问器。官方 API 文档Humanizer.On.August.md中给出的类声明为public class On.August该类直接继承自System.Object本身不携带任何状态全部成员均为public static因此使用时不需要实例化直接通过On.August.xxx静态访问即可。类的官方摘要为Provides fluent date accessors for August即为 8 月提供流式日期访问器。从源码角度看On是一个容器类内部为一年 12 个月各嵌套了一个同名字类January、February、…、DecemberAugust只是其中之一。完整的生成代码位于 On.Days.cs约第 1370 行开始是August类的定义。二、31 个静态属性The1st 到 The31st 完整清单On.August的核心成员是 31 个静态只读属性分别对应 8 月的第 1 天到第 31 天8 月为大月共 31 天。每个属性的声明形态完全一致例如文档中的The10th声明为public static System.DateTime The10th { get; }全部 31 个属性及含义如下属性值均为System.DateTime年份取自当前年属性含义属性含义The1st当年 8 月 1 日The17th当年 8 月 17 日The2nd当年 8 月 2 日The18th当年 8 月 18 日The3rd当年 8 月 3 日The19th当年 8 月 19 日The4th当年 8 月 4 日The20th当年 8 月 20 日The5th当年 8 月 5 日The21st当年 8 月 21 日The6th当年 8 月 6 日The22nd当年 8 月 22 日The7th当年 8 月 7 日The23rd当年 8 月 23 日The8th当年 8 月 8 日The24th当年 8 月 24 日The9th当年 8 月 9 日The25th当年 8 月 25 日The10th当年 8 月 10 日The26th当年 8 月 26 日The11th当年 8 月 11 日The27th当年 8 月 27 日The12th当年 8 月 12 日The28th当年 8 月 28 日The13th当年 8 月 13 日The29th当年 8 月 29 日The14th当年 8 月 14 日The30th当年 8 月 30 日The15th当年 8 月 15 日The31st当年 8 月 31 日The16th当年 8 月 16 日属性命名遵循英文序数词规则1 为st、2 为nd、3 为rd其余为th11、12、13 也遵循th8 月不涉及这些特例。每个属性的值都精确指向当前年份的 8 月对应日期这一点非常关键它永远返回的是DateTime.Now.Year这一年的 8 月某天而不是固定年份。源码实现印证On.Days.cs 中August类开头的实现为public class August { /// summary /// The nth day of August of the current year /// /summary public static DateTime The(int dayNumber) new(DateTime.Now.Year, 8, dayNumber); /// summary /// The 1st day of August of the current year /// /summary public static DateTime The1st new(DateTime.Now.Year, 8, 1); // ... The2nd ~ The31st 以此类推 }可见每个属性本质上都是new DateTime(DateTime.Now.Year, 8, dayNumber)的语法糖封装属性的 Ordinalize 后缀只是为了让调用点读起来更像人话。测试用例 OnTests.cs 验证了这一行为模式以其他月份为例[Fact] public void OnJanuaryThe23rd() Assert.Equal(new(DateTime.Now.Year, 1, 23), On.January.The23rd); [Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), On.February.The(11));测试确认了属性/方法返回值 当年 指定月份 指定日这一等式。三、动态方法The(int dayNumber)除 31 个固定属性外On.August还提供一个参数化方法用于获取 8 月任意一天public static System.DateTime The(int dayNumber);参数dayNumberSystem.Int32类型表示 8 月内的天数1 到 31。返回值System.DateTime即当年 8 月dayNumber日的零点时刻。使用示例DateTime d1 On.August.The(1); // 当年 8 月 1 日 DateTime d2 On.August.The(15); // 当年 8 月 15 日 DateTime d3 On.August.The(31); // 当年 8 月 31 日The(int)与The1st~The31st固定属性的关系是固定属性是The(int)对 1~31 各参数值的预生成特化。二者底层实现完全一致都走new(DateTime.Now.Year, 8, dayNumber)这条路径差别只在于调用点的可读性——On.August.The23rd比On.August.The(23)更接近自然语言。当日期在循环、配置驱动等动态场景中才能确定时应使用The(int)当日期是写死的常量时优先使用固定属性以获得最佳可读性。需要提醒的是如果传入超出 1~31 范围的值如The(0)或The(32)DateTime构造函数会抛出ArgumentOutOfRangeException因为 8 月没有对应的日期。使用动态方法时应对输入做合法性校验。四、实现原理T4 模板自动生成On.August及另外 11 个月份类并非手写代码而是由 T4 文本模板Text Template Transformation Toolkit批量生成的。生成模板位于 On.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 { ... } for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); // 输出 public static DateTime TheordinalDay new(DateTime.Now.Year, month, day); } }这段模板揭示了三个重要事实年份基准采用 2012 闰年模板以 2012 年作为标尺来计算每个月的天数因为 2012 是闰年能覆盖 2 月 29 日这一极端情况。月份名通过new DateTime(2012, month, 1).ToString(MMMM)获得本地化英文名从而生成January~December12 个嵌套类。天数由DateTime.DaysInMonth决定每个类生成多少个TheNth属性取决于该月在 2012 年有多少天。8 月有 31 天因此August恰好生成 31 个属性而 2 月因闰年会生成 29 个属性。序数后缀由Ordinalize()产生属性名中的1st/2nd/3rd/th后缀正是 Humanizer 自身的 OrdinalizeExtensions 能力在生成期内的复用——库用它生成自己的 API属于自举dogfooding设计。这意味着On.August的完整形态31 属性 1 方法全部由模板在构建期展开最终产物是 On.Days.cs 中约 2345 行代码的一部分开发者无需手工维护每个日期访问器。五、On 与 OnDateDateTime 与 DateOnly 双版本除了返回System.DateTime的On系列Humanizer 还提供了面向System.DateOnly的OnDate系列OnDate.August、OnDate.August.The1st等其定义在 OnDate.Days.cspublic class August { public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 8, dayNumber); public static DateOnly The1st new(DateTime.Now.Year, 8, 1); // ... The2nd ~ The31st }OnDate系列的特点与使用建议仅在 .NET 6 及以上目标框架可用。生成模板 OnDate.Days.tt 开头使用#if NET6_0_OR_GREATER指令包裹低于该版本的编译目标不会包含OnDate类型。返回值类型为DateOnly纯日期、无时间分量而On系列返回DateTime含零点时间分量。如果你的业务只需要某年某月某日这一概念如生日、纪念日、排期优先用OnDate以避免无意义的时间分量如果需要与DateTime.Now直接比较或参与时间运算则用On。两者的月份类结构、属性命名、生成方式完全对称OnDate.August同样拥有The1st~The31st与The(int)全部成员。六、实战使用示例6.1 获取指定日期using Humanizer; // 当年 8 月 23 日属性方式可读性最佳 DateTime meetingDay On.August.The23rd; // 当年 8 月 1 日与 8 月 31 日 DateTime monthStart On.August.The1st; DateTime monthEnd On.August.The31st; // 动态天数变量方式 int targetDay 15; DateTime dynamicDay On.August.The(targetDay); // .NET 6 使用 DateOnly 版本 DateOnly anniversary OnDate.August.The23rd;6.2 计算距离某个 8 月日期的剩余天数TimeSpan remaining On.August.The31st - DateTime.Today; Console.WriteLine($距当年 8 月 31 日还有 {remaining.Days} 天);6.3 与 Humanizer 其他 API 组合使用On.August返回的DateTime可以无缝接入 Humanizer 的其他扩展例如用 DateHumanizeExtensions 做相对时间描述Console.WriteLine(On.August.The1st.Humanize()); // 例如 3 days from now Console.WriteLine(On.August.The1st.Ordinalize()); // 例如 August 1st七、使用注意事项年份是动态的On.August.The23rd返回的是当前年份的 8 月 23 日其年份取自DateTime.Now.Year。跨年运行时如程序跨越 12 月 31 日持续运行两次调用的返回值年份可能不同这一点在缓存计算结果、日志落库等场景中要特别留意。返回时刻为当天零点On系列返回的DateTime时间分量为00:00:00即当天的开始时刻需要当天其他时刻时请在此基础上自行AddHours等操作。参数范围校验The(int dayNumber)仅接受 1~31 的合法天数越界会抛出ArgumentOutOfRangeException。OnDate的框架门槛OnDate系列仅在NET6_0_OR_GREATER目标下编译产出若项目目标框架低于 .NET 6请使用On系列。可读性与动态性取舍固定属性The23rd适合字面量日期The(int)适合动态计算出的日期二者返回值语义完全等价。八、相关资源导航API 参考文档Humanizer.On.August.md生成源码On.Days.csAugust类自第 1370 行起生成模板On.Days.ttDateOnly 版本生成源码OnDate.Days.csDateOnly 版本生成模板OnDate.Days.tt单元测试OnTests.cs 与 OnDateTests.cs其他月份类On.January~On.December同位于 On.Days.cs结构与On.August完全一致仅月份参数与天数不同。赞分享开发工具【免费下载链接】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 流式日期 API 详解On.August 类的用法、源码实现与测试验证Humanizer 流式日期 API 详解On.August 类的用法、源码实现与测试验证 Humanizer 为 .NET 开发者提供了名为 Fluent开发工具Humanizer 流式日期 API 详解In.Two 类在 C 中的用法与实现原理Humanizer 流式日期 API 详解In.Two 类在 C 中的用法与实现原理 导读 In.Two 是 Humanizer 流式日期FluentDat开发工具Humanizer 流式日期 API 详解InDate.Six 类的属性、方法与实现原理Humanizer 流式日期 API 详解InDate.Six 类的属性、方法与实现原理 本文以 Humanizer 2.13.14 版本文档 InDate.开发工具上一篇ComfyUI-WanVideoWrapper模块化AI视频生成框架的技术解析与实践指南下一篇快速上手抖音无水印下载:douyin-downloader 单条、批量与直播下载教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/29 8:14:26

模2运算详解:从异或到CRC校验的底层原理与实操

做通信协议和底层软件这行,几乎天天要和模2运算打交道。奇偶校验、CRC校验、LFSR伪随机序列、汉明码纠错,这些看似各不相同的技术,剥开外壳后核心全是模2加法、模2减法、模2乘法、模2除法这一套四则运算。很多人一开始觉得简单,不…

2026/9/29 8:14:26

攻击者画像关键技术:从日志聚类到团伙处置的工程实践

简介:这是一份面向网络安全从业者、安全态势感知研究人员及高校相关专业学生的技术文献,聚焦攻击者画像这一主动防御关键环节,帮助读者理解如何从攻击行为中识别意图、预测威胁并辅助溯源。资源为单份PDF文档,压缩包约1008KB&…

2026/9/29 9:14:30

测试用例设计万能思路:六种核心方法助你打造高质量用例

做了这么多年测试,我见过太多人写用例时盯着需求文档发呆,然后凭感觉刷刷刷列出一堆用例,评审会上被追问两句就底虚。测试用例这东西,看起来就是“前置条件 操作步骤 预期结果”,可为什么不同人写出来的用例质量和数…

2026/9/29 9:14:30

Codex配置本地自定义Agent:TOML、AGENTS.md与优先级实战

如果你想让 Codex 成为真正服务于自己项目的本地自定义 Agent,那 TOML、AGENTS.md 和优先级这三个词会是你绕不开的关卡。我最早以为把配置里的模型名改成 DeepSeek 就能直接跑,结果命令行反复报错,最后才明白,接入点、项目指令、…

2026/9/29 9:14:30

C++异常处理最佳实践:从错误模型到RAII与安全设计

1. 为什么异常处理的“最佳实践”首先是取舍问题1.1 异常不是 bug,而是一种错误上报机制但凡用 C 写过一段时间的人,都会遇到这种争论:异常到底该不该用?C 异常处理从语言诞生之初就带着争议,一部分老派开发者坚持 “异…

2026/9/29 9:14:30

AI写代码、不画帧:Opus 5.5+Python+FFmpeg生成30秒粒子动画全解析

事情是这样的。我想让 Opus 5.5 帮我做一条 30 秒的视频,但最后成品里它一帧都没「生成」——所有画面,没有一帧是 AI 直接画出来的。你可能觉得这很怪,但恰恰是这次尝试,让我彻底理解了 AI 在视频创作里真正该站的位置。它不是替…

2026/9/29 9:09:29

CFBench 评测实战:用 TaoToken 统一 Key 跑通 LLM 约束遵循基准

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

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/29 7:00:49

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/29 0:04:04

AI Evals实战指南:从零搭建LLM应用评估体系与CI/CD集成

1. 为什么AI Evals值得你花时间搞明白做LLM应用的人,迟早会撞上同一堵墙:模型输出飘忽不定,今天答得好好的,明天换个问法就胡说八道。你改了一版提示词,感觉好像好了点,但到底好了多少?说不清。…

2026/9/29 0:04:04

Java采购管理系统实战:从数据库设计到事务一致性

简介:这是一套面向Java Web初学者与课程设计者的采购管理系统完整源码,采用JSP技术搭建,配合MySQL数据库,用于解决企业采购信息的管理问题,适合作为毕业设计、课程大作业或进销存类项目的参考模板。系统实现了用户登录…

2026/9/29 3:53:39

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

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

2026/9/26 19:58:38

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

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

2026/9/29 6:36:14

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

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

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

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

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