首页/新闻资讯/正文详情

Humanizer 流式日期 API 详解:On.December 类源码级解析

发布时间:2026/9/25 13:07:10 来源:云帆数科 栏目:资讯中心
Humanizer 流式日期 API 详解:On.December 类源码级解析
开发工具【免费下载链接】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 开发者提供了一组日历般自然的流式日期访问器。本篇文章以On.December为核心完整讲解其 31 个具名日期属性The1stThe31st、通用The(int)方法、构造函数与继承结构并对照仓库源码On.Days.cs与测试用例OnTests.cs剖析其实现原理与适用边界。读完本文你将能在自己的 .NET 项目中熟练使用On.December.The25th这类零魔法数字的日期表达并理解它背后的 T4 代码生成机制。一、On.December是什么On.December是 HumanizerOn静态类内嵌的嵌套类专门为 12 月提供流式日期访问器。它在源码中位于 On.Days.csOnDate.Days.cs中还有对应的DateOnly版本类摘要如下public class On { /// summary /// Provides fluent date accessors for December /// /summary public class December { // ... } }成员说明完整类型名Humanizer.On.December基类System.ObjectHumanizer 文档标注的继承链为 Object → December命名空间Humanizer定位所有成员均为static无需实例化即可调用1.1 构造函数public December();构造函数是编译器生成的默认构造函数用于初始化 December 类的新实例。实际使用中On.December只承载静态成员直接以On.December.TheXxx形式访问即可无需也无法在常规用法中手动构造实例。1.2 全部 31 个具名属性12 月共有 31 天On.December为此提供了从The1st到The31st共 31 个静态只读属性每个属性都返回当前年份的指定日。例如public static DateTime The1st { get; } // 当前年 12 月 1 日 public static DateTime The10th { get; } // 当前年 12 月 10 日 public static DateTime The24th { get; } // 当前年 12 月 24 日平安夜 public static DateTime The25th { get; } // 当前年 12 月 25 日圣诞节 public static DateTime The31st { get; } // 当前年 12 月 31 日跨年夜完整成员清单源码逐一实现The1st、The2nd、The3rd、The4th、The5th、The6th、The7th、The8th、The9th、The10th、The11th、The12th、The13th、The14th、The15th、The16th、The17th、The18th、The19th、The20th、The21st、The22nd、The23rd、The24th、The25th、The26th、The27th、The28th、The29th、The30th、The31st1.3 通用方法The(int dayNumber)当 31 个具名属性无法满足需求例如需要动态计算日期时可调用通用方法public static DateTime The(int dayNumber);参数dayNumber为System.Int32表示当前年份 12 月的第 n 天返回System.DateTime。二、源码实现一行代码背后的机制2.1 属性与方法的真实实现从 On.Days.cs 可以看到所有成员都是一行表达式public class December { public static DateTime The(int dayNumber) new(DateTime.Now.Year, 12, dayNumber); public static DateTime The1st new(DateTime.Now.Year, 12, 1); // The2nd ~ The31st 依此类推 public static DateTime The25th new(DateTime.Now.Year, 12, 25); // ... }核心规律年份始终取DateTime.Now.Year即当前年。月份固定为 12。日具名属性为硬编码数字The(int)方法则透传调用方传入的dayNumber。也就是说On.December.The4th等价于new DateTime(DateTime.Now.Year, 12, 4)。2.2 T4 模板生成12 个月份的同一套代码On.December并非手写代码而是由 T4 模板 On.Days.tt 自动生成。模板的核心逻辑是for (var month 1; month 12; month) { // 用闰年 2012 计算每月天数2 月 29 天 var daysInMonth DateTime.DaysInMonth(2012, month); // 生成月份类 The(int dayNumber) // 再对每一天调用 day.Ordinalize() 生成 The1st/The2nd/The3rd... }因此仓库中同时存在On.January、On.February……On.December共 12 个结构完全对称的嵌套类On.December只是这套模板在 12 月上的产物。属性命名中的1st/2nd/3rd/4th...正是调用了 Humanizer 自身的Ordinalize()扩展方法见 InflectorExtensions.cs 体系生成的序数词后缀。三、典型用法与代码示例using Humanizer; // 具名属性圣诞节当前年份 DateTime christmas On.December.The25th; // 通用方法动态指定日期 DateTime deadline On.December.The(20); // 组合使用先拿到 12 月某日再基于它做运算 var newYearEve On.December.The31st; var firstDayOfNextYear newYearEve.AddDays(1); // 输出示例以 2026 年为例 Console.WriteLine(christmas); // 2026/12/25 0:00:00 Console.WriteLine(deadline); // 2026/12/20 0:00:00需要注意返回的DateTime时间部分为00:00:00午夜。当前年是惰性求值的属性在每次访问时都读取DateTime.Now.Year因此同一属性在同一天内读取结果相同跨年如跨年夜的午夜前后读取则可能不同。具名属性的命名完全遵循英文序数词习惯1/2/3/21/22/23/31 分别对应1st/2nd/3rd/21st/22nd/23rd/31st。四、配套的DateOnly变体OnDate.December从 .NET 6 起仓库还在 OnDate.Days.cs 中提供了返回DateOnly的平行版本public class OnDate { public class December { public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 12, dayNumber); public static DateOnly The1st new(DateTime.Now.Year, 12, 1); // The2nd ~ The31st 依此类推 } }若你的项目面向 .NET 6 且无需时间部分优先使用OnDate.December以避免多余的午夜时间戳语义。对应测试位于 OnDateTests.cs该文件整体以#if NET6_0_OR_GREATER包裹。五、测试验证行为与预期完全一致仓库用 xUnit 事实测试锁定了On.December的行为OnTests.cs[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));测试要点On.December.The4th必须恒等于new DateTime(当前年份, 12, 4)通用方法On.February.The(11)同样走DateTime.Now.Year年份逻辑GeneratedFluentDateTests.cs 中维护了January1 … December12的月份对照表用于系统性校验 12 个月份生成的代码。六、适用场景与注意事项适用场景业务代码中需要表达今年 12 月的某个固定日期如年度结算日、圣诞节促销、年终报告截止日用On.December.The25th比new DateTime(DateTime.Now.Year, 12, 25)更直观、更少魔法数字配合 Humanizer 其他日期扩展如Humanize()、In/InDate系列构建可读的日期业务逻辑。注意事项始终基于当前年无法直接指定其他年份。若要表达2009 年 12 月应改用In系列如In.DecemberOf(2009)见 InTests.cs 中的InDecemberOf2009测试。参数边界The(int dayNumber)若传入超出 1–31 的范围如 0 或 32会触发ArgumentOutOfRangeException由DateTime构造函数抛出调用方需自行校验。时区与并发值来自本地系统时钟的DateTime.Now跨时区部署时以运行机器本地时间为准。七、小结On.December是 Humanizer 流式日期 体系的一个缩影通过 T4 模板为每个月生成 31 个具名静态属性与一个通用The(int)方法让当前年份某月某日的表达从new DateTime(DateTime.Now.Year, 12, 25)进化为On.December.The25th。结合OnDate.DecemberDateOnly 版与In.DecemberOf(2009)指定年份版你可以在不同场景下都获得自然、可读、零歧义的日期代码。若要继续探索可查看同类 API 文档 Humanizer.On.md、Humanizer.OnDate.md以及全部 12 个月的生成代码 On.Days.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点击查看免费下载相关推荐Humanizer 流式日期 API 详解In.Nine 类完整参考与源码级解析Humanizer 流式日期 API 详解 In.Nine 类完整参考与源码级解析 本篇文章聚焦 Humanizer 流式日期FluentDateAPI开发工具Seerr 源码构建与部署完整指南从克隆到开机自启的五步实操Seerr 源码构建与部署完整指南从克隆到开机自启的五步实操 从源码构建 SeerrJellyseerr 社区延续项目的媒体请求管理服务你拿到的不只是最开发工具Humanizer 流式日期 API 详解In 类使用指南与源码剖析Humanizer 流式日期 API 详解In 类使用指南与源码剖析 In 类是 Humanizer 流式日期Fluent Date体系中最常用的静态入口开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

保姆级教程!OpenClaw · Windows版安装部署与常见报错修复(TaoToken 统一 Key 配置版)
保姆级教程!OpenClaw · Windows版安装部署与常见报错修复(TaoToken 统一 Key 配置版)

/* 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 13:07:10

Linux 服务器安全加固技术(4)
Linux 服务器安全加固技术(4)

引言 在网络安全体系中,防火墙是服务器安全的第一道防线。无论你运维的是一台 Web 服务器、数据库实例,还是邮件网关,防火墙都承担着"守门人"的角色——决定哪些数据包可以通过,哪些必须拒之门外。 在 Linux 世界里,防火墙的核心实现方式是包过滤(Packet Fil… · 2026/9/25 13:06:52

快手Agent开发一面:A2A 和 MCP 到底什么关系,TaoToken 统一 Key 怎么配
快手Agent开发一面:A2A 和 MCP 到底什么关系,TaoToken 统一 Key 怎么配

/* 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 13:06:52

表格基础模型上下文选择实战:长度、采样与列顺序调优指南
表格基础模型上下文选择实战:长度、采样与列顺序调优指南

1. 表格基础模型的上下文选择为什么成了新痛点表格基础模型(Tabular Foundation Model)这两年在arXiv上的热度肉眼可见地往上走。从早期的TabPFN到后来的TabDPT、Mitra、CARTE,再到各类针对时序表格、多表关联、异构schema的变体,… · 2026/9/25 16:59:18

具身智能遇上大模型:从任务规划到动作执行的端到端链路实战
具身智能遇上大模型:从任务规划到动作执行的端到端链路实战

简介:这份PDF文档聚焦大模型与具身智能的交叉领域,面向人工智能、机器人方向的研究者与学习者,系统梳理了智能机器人的发展脉络与核心技术框架。内容从周穆王时期偃师造人的古代记载、阿基塔斯蒸汽飞鸟、达芬奇人形机器人草图,一路… · 2026/9/25 16:59:12

Atlas 300V 24G上跑通YOLO:AI推理加速卡部署全攻略
Atlas 300V 24G上跑通YOLO:AI推理加速卡部署全攻略

拿到Atlas 300V 24G这块卡的时候,我的第一反应和很多人一样:这玩意到底算不算“运算加速卡”?它和游戏显卡、工作站显卡有什么区别?拿它跑YOLO到底行不行?这三个问题如果不搞清楚,后面的部署过程会走很多弯… · 2026/9/25 16:59:12

FLoRIST:联邦LoRA微调下行通信的三层压缩方案
FLoRIST:联邦LoRA微调下行通信的三层压缩方案

FLoRIST 是我最近在 MLSys2026 预印本目录里刷到的一个方案,标题指向很清楚:联邦学习 LoRA 微调这条赛道上,把服务端发给客户端的下行通信压缩下来。联邦学习本身是数据不动、模型或模型增量在客户端与服务端之间搬动;LoRA 是低秩… · 2026/9/25 16:59:05

Codex Router进阶配置清单:curate-models、API Key池与自定义端点的10种用法
Codex Router进阶配置清单:curate-models、API Key池与自定义端点的10种用法

Codex Router进阶配置清单:curate-models、API Key池与自定义端点的10种用法 【免费下载链接】codex-router External-model router for Codex with guided Kimi OAuth/API, DeepSeek, safe migration, and rollback. 项目地址: https://gitcode.com/gh_mirrors/c… · 2026/9/25 16:58:53

ORDL医疗数据解析实战:从黑匣子到CDR的逆向工程
ORDL医疗数据解析实战:从黑匣子到CDR的逆向工程

简介:本资源是一份面向机器学习与信号处理方向研究者及MATLAB开发者的在线词典学习(ORDL)算法实践代码包,聚焦大规模流式数据下的稀疏表示建模问题,适用于文本分类、图像去噪、高维信号压缩等典型场景。压缩包为RAR格式… · 2026/9/25 16:58:22

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* 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 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* 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 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* 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 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码