Humanizer OnDate.December 流畅日期 API 完全指南:用 C 优雅构造当年 12 月的每一天
开发工具【免费下载链接】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点击查看免费下载导读OnDate.December是 Humanizer 流畅日期FluentDate体系中专为 12 月设计的静态访问器集合用于以自然语言般的The1st…The31st属性与The(dayNumber)方法直接构造「当前年份」12 月任意一天的DateOnly值。本文以 Humanizer.OnDate.December.md 的 API 参考为骨架结合 OnDate.Days.cs 源码与 OnDateTests.cs 测试完整列出全部 31 个成员、签名与行为边界并给出可直接编译运行的实战示例——读完你即可在自己的 .NET 6 项目中无歧义地写出「今年 12 月 25 日」这类日期表达式同时理解它为何不能被随意用于确定性代码。OnDate.December 是什么FluentDate 体系中的 12 月访问器类定义与继承关系OnDate.December是一个public静态嵌套类位于Humanizer命名空间下public class OnDate.December继承关系System.Object→OnDate.December没有任何额外基类它是外部类OnDate的嵌套类型OnDate本身封装了一组与月份一一对应的嵌套类JanuaryDecember每个月份类都提供同一套「第 N 天」访问模式与 Humanizer.OnDate.md 中描述的OnDate类配套使用源码位于 OnDate.Days.cs文件顶部以#if NET6_0_OR_GREATER条件编译因此OnDate家族只在 .NET 6 及更高目标框架上可用因为其返回值是System.DateOnly该类型自 .NET 6 起引入。与 On.December 的区别DateOnly vs DateTimeFluentDate 体系存在两套平行的月份访问器返回值类型不同外部类嵌套月份类成员返回类型文件OnDateOnDate.DecemberSystem.DateOnlyOnDate.Days.csOnOn.DecemberSystem.DateTimeOn.Days.cs两者的成员名、语义完全一致只是返回类型不同OnDate.December.The25th返回DateOnly纯日期、无时间分量而On.December.The25th返回DateTime午夜零点。在 .NET 6 上需要纯日期场景如生日、截止日、报表维度时优先使用OnDate版本。成员设计Ordinal 命名风格成员命名采用英文序数词的省略形式The1st、The2nd、The3rd、The4th……这使调用点读起来像一句自然语言OnDate.December.The25th直译即「十二月二十五日」可读性远高于new DateOnly(year, 12, 25)。从源码看这正是 Humanizer「Humanize」设计哲学的体现——让日期构造也具备可读性。全部成员清单31 个静态属性与 1 个静态方法根据关联文档与源码OnDate.Days.csOnDate.December共公开31 个静态属性The1stThe31st 1 个静态方法 The(int)全部返回System.DateOnly全部是「当年 12 月的第 N 天」。属性速查表属性返回的日期当年属性返回的日期当年The1st12 月 1 日The17th12 月 17 日The2nd12 月 2 日The18th12 月 18 日The3rd12 月 3 日The19th12 月 19 日The4th12 月 4 日The20th12 月 20 日The5th12 月 5 日The21st12 月 21 日The6th12 月 6 日The22nd12 月 22 日The7th12 月 7 日The23rd12 月 23 日The8th12 月 8 日The24th12 月 24 日The9th12 月 9 日The25th12 月 25 日The10th12 月 10 日The26th12 月 26 日The11th12 月 11 日The27th12 月 27 日The12th12 月 12 日The28th12 月 28 日The13th12 月 13 日The29th12 月 29 日The14th12 月 14 日The30th12 月 30 日The15th12 月 15 日The31st12 月 31 日The16th12 月 16 日每个属性均以 get-only 静态属性形式提供签名统一为public static System.DateOnly The10th { get; }参数化方法The(int)用于按数字动态构造日期覆盖固定属性无法表达的全部场景例如从业务数据读到的日号public static System.DateOnly The(int dayNumber);项说明参数dayNumberSystem.Int32表示 12 月中的日号合法范围 131返回值System.DateOnly即当年 12 月dayNumber日的日期边界行为传入超出当月合法范围的值如The(0)、The(32)会抛出ArgumentOutOfRangeException因为底层DateOnly构造函数会对「不存在的月/日组合」抛异常场景文档 fluent-dates-and-time-spans.mdx 明确提示不可能的月/日组合构造函数会 throw注意12 月固定为 31 天不存在 2 月 29 日式的闰年歧义因此所有属性在任意年份都安全可用。源码实现原理一行表达式背后的机制底层实现OnDate.December的全部成员都基于同一个朴素表达式实现没有任何缓存、格式化或区域文化参与public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 12, dayNumber); public static DateOnly The25th new(DateTime.Now.Year, 12, 25);即读取DateTime.Now.Year拿到当前系统时间所在年份以new DateOnly(年份, 12, 日号)构造纯日期。因此可以明确两点事实年份永远来自DateTime.Now而非DateTime.UtcNow也不是可注入的起始日期——这是设计上的取舍属性是惰性求值的 get-only 属性每次访问都会重新读取当前年份。在同一年的不同时刻调用结果一致跨年后调用则自动得到新一年的 12 月对应日期。生成方式T4 模板该文件并非手写而是由 OnDate.Days.tt 这个 T4 文本模板生成。模板头部以2012作为闰年参考常量、循环 12 个月逐月生成每个月份的 31 个属性OnDate.Days.tt。这解释了为什么 12 个月份类的成员结构完全对称——它们来自同一套模板驱动可维护性集中在模板而不是 2300 余行生成代码上。仓库中同族的 T4 还包括 In.Months.tt、On.Days.tt 等构成完整的 FluentDate 生成体系。测试印证OnDateTests.cs 用 xUnit 验证了 December 成员的确定性行为[Fact] public void OnDecemberThe4th() Assert.Equal(new(DateTime.Now.Year, 12, 4), OnDate.December.The4th);测试断言OnDate.December.The4th恒等于new DateOnly(DateTime.Now.Year, 12, 4)直接印证「年份取自 Now、月份固定 12、日号固定 4」的实现事实。实战用法可复制到 .NET 6 项目的完整示例基础用法using Humanizer; // 当年 12 月 25 日圣诞节返回 DateOnly DateOnly christmas OnDate.December.The25th; // 当年 12 月 31 日跨年夜 DateOnly newYearsEve OnDate.December.The31st; // 动态日号从业务变量构造 int day GetDayFromBusinessData(); // 例如 18 DateOnly day18 OnDate.December.The(day); // 打印结果如 2026-12-25 Console.WriteLine(christmas.ToString(yyyy-MM-dd));组合运用配合 Humanizer 其他扩展OnDate返回的DateOnly可以无缝衔接 Humanizer 的日期人性化扩展构造「距今多久」的可读描述using Humanizer; using Humanizer.Localisation; // 当年 12 月 31 日相对今天的描述取决于运行时日期 DateOnly deadline OnDate.December.The31st; string when deadline.Humanize(); // 例如 2 days from now // 也可以先转 DateTime 再交给 DateTime 版本扩展 DateTime d On.December.The31st; // 注意 On 返回 DateTime午夜 0 点与确定性代码的冲突重要陷阱场景文档 fluent-dates-and-time-spans.mdx 明确警告不带From或Of(year)后缀的属性会读取DateTime.Now或UtcNow应避免在确定性代码中使用。具体到OnDate.December测试中用「当年」断言之所以成立是因为测试断言右侧同样使用DateTime.Now.Year两侧在同一年内求值一致若你的业务逻辑需要固定年份如报表固定统计 2025 年 12 月直接使用OnDate.December.The31st会让结果随运行年份漂移此时应改用显式构造// 确定性写法显式指定年份 var fixedDate new DateOnly(2025, 12, 31); // 或者先拿 OnDate 结果再通过 In 系列重定位年份 DateOnly moved InDate.December.Of(2025); // 若需要年份重定位能力参见 InDate 系列原则总结OnDate.December适合「今天所在的年份」这类语义明确的场景日历 UI、当年活动排期跨年不变的硬编码日期请使用显式DateOnly构造保证测试与业务可重复。与其他 FluentDate 访问器的对照与选型OnDate.December只是 FluentDate 大体系的一角选型时请对照下表访问器家族返回类型典型成员适用场景OnDate.Month.TheNthDateOnlyOnDate.December.The25th当年某月某日的纯日期本主题On.Month.TheNthDateTimeOn.December.The25th当年某月某日的午夜时间点InDate.Month.Of(年)DateOnlyInDate.December.Of(2025)指定年份的某月日期可重定位年份In.Month.Of(年)DateTimeIn.December.Of(2025)指定年份某月日期的时间点版本In.Two.MonthsFrom(起始)DateOnly/DateTimeIn.Two.MonthsFrom(start)日历月运算AddMonths语义月份与年份的From/Of变体本质上是DateTime.AddMonths/AddYears的日历级运算见 fluent-dates-and-time-spans.mdx它们不做文化区域历法选择也没有TimeSpan式的估算误差而OnDate系列则是最朴素的「今年 N 月 N 日」构造器。从源码结构看所有月份类共享同一套模板生成行为完全对称掌握 12 月即可类推其余 11 个月。版本与可用性说明OnDateDateOnly版流畅日期自2.11.10起在兼容目标框架上提供见 fluent-dates-and-time-spans.mdx 的版本说明本文关联文档即来自version-2.11.10文档集源码层面OnDate家族以#if NET6_0_OR_GREATER条件编译仅在 .NET 6 目标框架可见.NET Framework / .NET Core 3.1 等旧目标请使用OnDateTime版使用前请确认项目TargetFramework至少为net6.0并引用 Humanizer 2.11.10 或更高版本的程序集Humanizer命名空间无需额外配置即可直接using Humanizer;调用。结语OnDate.December用 32 个精心命名的静态成员把「今年 12 月的某一天」这一高频业务表达压缩成一行自然语言式代码The1st到The31st覆盖全部日号The(int)处理动态日号底层统一由new DateOnly(DateTime.Now.Year, 12, dayNumber)支撑。理解其「年份取自DateTime.Now、惰性求值、T4 生成、仅限 .NET 6」四条实现事实你就能在日历应用、活动排期等场景中安全使用它并在需要固定年份时果断转向显式DateOnly构造或InDate系列——这正是 FluentDate 设计留给开发者的选择边界。延伸阅读OnDate API 总览 | On 类DateTime 版 12 月访问器 | FluentDate 场景指南 | OnDate 源码含全部月份类 | 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.December 完全指南用 Fluent API 构造当前年份十二月的 DateOnly 日期Humanizer OnDate.December 完全指南用 Fluent API 构造当前年份十二月的 DateOnly 日期 本篇技术指南聚焦 Huma开发工具CAMEL OpenAICompatibleModel 详解统一接入任意 OpenAI 兼容模型后端的通用模型后端CAMEL OpenAICompatibleModel 详解统一接入任意 OpenAI 兼容模型后端的通用模型后端 本文基于 CAMEL 仓库中 OpenAI开发工具ChatGPT for Google浏览器扩展的插件系统设计终极指南如何构建模块化AI搜索助手ChatGPT for Google浏览器扩展的插件系统设计终极指南如何构建模块化AI搜索助手 ChatGPT for Google是一款创新的浏览器扩展插件开发工具上一篇Omost日志分析工具通过运行日志优化生成参数的实用技巧下一篇gpt-ai-assistant内存优化大型对话的History分页处理全解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考