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),仅供参考

相关新闻

从对话历史到长期记忆:用Dify构建AI“后见之明”复盘工作流

从对话历史到长期记忆:用Dify构建AI“后见之明”复盘工作流

1. 为什么要把"后见之明"塞进 AI 系统里如果你做过 AI 对话类应用,一定遇到过这种尴尬:用户昨天明明在对话里说了自己养了一只叫"豆包"的猫、最讨厌吃香菜、目前在准备法考,今天换个话题又问了一句"你记得我上次说的…

2026/9/30 8:23:49 阅读更多 →
电商购物车与支付模块功能测试实战:用XMind解构业务契约

电商购物车与支付模块功能测试实战:用XMind解构业务契约

1. 这不是教科书,是我在电商项目里写崩三次购物车测试用例后总结的实战手册功能测试、测试用例、xmind、购物车、支付——这五个词凑在一起,不是考试题,而是我去年在一家中型电商平台做质量保障时,连续三周被产品和开发轮番“灵魂…

2026/9/30 8:23:12 阅读更多 →
TensorFlow本质:张量计算图与生产级AI部署

TensorFlow本质:张量计算图与生产级AI部署

1. 这不是“装个库”那么简单:TensorFlow到底在解决什么问题?你搜“tensorflow”,页面上跳出来的全是“安装失败”“版本冲突”“CUDA不匹配”——但真正卡住你的,从来不是那几行报错,而是你根本没想清楚:T…

2026/9/30 8:22:28 阅读更多 →

最新新闻

FTTR全光家庭网络:从物理层重构Wi-Fi体验

FTTR全光家庭网络:从物理层重构Wi-Fi体验

简介:本资源为华为FTTR全光家庭网络创新解决方案的完整技术白皮书PDF,面向通信工程师、宽带网络规划人员、运营商装维团队及智能家居方案集成商,聚焦解决大户型Wi-Fi覆盖弱、千兆宽带实际速率不足(实测常低于签约带宽20%&#xff…

2026/9/30 11:03:55 阅读更多 →
网络安全技术基础入门:从核心概念到职业发展路线

网络安全技术基础入门:从核心概念到职业发展路线

网络安全技术基础——第1章:网络安全概述 说句实在话,我见过太多人一上来就撸工具、扫端口、翻漏洞报告,结果学了一个月连“这个漏洞到底危害在哪”都讲不清楚。网络安全这个方向,看着门槛低,实际上非常吃基础。你手里有工具&…

2026/9/30 11:03:55 阅读更多 →
JavaWeb从入门到实战:SpringBoot+MySQL搭建完整项目全攻略

JavaWeb从入门到实战:SpringBoot+MySQL搭建完整项目全攻略

很多刚接触 JavaWeb 的同学都有一种感觉:书翻了好几遍,视频也刷了,一打开 IDEA 却不知道从哪里下手。今天想结合我自己做项目、带新人的实际经验,把 JavaWeb 从“配置环境”到“跑通一个完整项目”的这条路彻底捋一遍。无论你是要…

2026/9/30 11:03:55 阅读更多 →
Sniffnet 贡献指南:从 Issue 认领到合并的完整流程与代码质量门禁

Sniffnet 贡献指南:从 Issue 认领到合并的完整流程与代码质量门禁

网络桌面应用数据可视化 【免费下载链接】sniffnet Comfortably monitor your network traffic 🕵️‍♂️ 项目地址: https://gitcode.com/GitHub_Trending/sn/sniffnet 点击查看 免费下载 Sniffnet 是一款用 Rust 编写的开源网络流量监控工具&#xf…

2026/9/30 11:03:55 阅读更多 →
排序算法从入门到实践:复杂度、稳定性与避坑指南

排序算法从入门到实践:复杂度、稳定性与避坑指南

我经常和刚学算法的朋友说,如果只选一类算法来入门,我肯定推荐排序。原因很简单:排序算法是数据结构、分治、递归、复杂度分析这些概念的天然载体。最近很多同学在刷各种排序算法,从冒泡、快排到归并、堆排序,还有各种…

2026/9/30 11:03:55 阅读更多 →
tar解压失败排查与修复:从gzip报错到完整复原

tar解压失败排查与修复:从gzip报错到完整复原

最近排查一个线上问题时,连着在三台服务器上撞见了同一种尴尬场面: tar -zxvf 刚解压到一半,终端里刷出一行 gzip: stdin: unexpected end of file ,紧接着就是 tar: Error is not recoverable: exiting now ,退…

2026/9/30 11:02:54 阅读更多 →

日新闻

Base64 图片头部特征识别:从文件头到格式判断的完整指南

Base64 图片头部特征识别:从文件头到格式判断的完整指南

1. 项目概述:为什么说看懂 base64 图片头部是基本功这几年跟 base64 打交道的机会越来越多,后端接口返回图片、前端渲染验证码、小程序里存小图、还有一些老系统导出报表,动不动就给你一段长到怀疑人生的 base64 字符串。很多人拿到字符串就直…

2026/9/30 0:00:35 阅读更多 →
Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

Java公交站牌广告管理系统:JSP+Servlet+MySQL实战落地指南

简介:本资源是一份面向Java初学者与课程设计学生的公交站牌广告灯箱管理系统毕业设计文档,聚焦城市公共广告资源信息化管理痛点,提供从需求分析到技术实现的完整方案。文档采用标准学术论文结构,含摘要、英文摘要、目录及五章正文…

2026/9/30 0:00:35 阅读更多 →
用 Redis Lua 构建大模型 API 多租户原子配额治理体系

用 Redis Lua 构建大模型 API 多租户原子配额治理体系

我去年年底接了一个内部 AI 平台的治理需求,背景很直接:公司把 DeepSeek、MiniMax 这类大模型 API 统一封装成内部网关,开放给几个业务团队用。结果第一个月账单出来,额度直接超了 4 倍。仔细查日志,发现原因并不复杂—…

2026/9/30 0:00:35 阅读更多 →

周新闻

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

如何划分训练/验证集: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 8:16:59 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

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

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

2026/9/29 16:41:41 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/29 8:24:48 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/29 19:29:29 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/29 5:58:00 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/29 3:55:56 阅读更多 →