开发工具【免费下载链接】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点击查看免费下载导读InDate.Nine是 Humanizer 流畅日期FluentDateAPI 家族中面向数字 9 的嵌套静态类它把9 天后9 周后9 个月后9 年后这类相对日期计算封装成可读的属性与方法并统一返回 .NET 6 的System.DateOnly值类型。本文以 API 参考文档 为主体结合 InDate.SomeTimeFrom.cs 源码实现与 FluentDate 生成机制、测试用例完整覆盖该类的全部 4 个属性与 8 个方法并深入讲解其基于UtcNow、AddDays/AddMonths/AddYears的底层语义帮助你写出既可读又具备确定性边界约束的日期计算代码。一、InDate.Nine 是什么InDate.Nine是 Humanizer 中InDate类的一个嵌套静态类位于Humanizer命名空间下专门提供与数字9相关的相对日期访问入口。它的声明如下public static class InDate.Nine从继承关系看它继承自System.Object。需要强调的是InDate本身是一个public partial class见 InDate.cs其成员由多个文件共同构成月份工厂January、February……December与JanuaryOf(year)等InDate.Months.cs年份入口TheYear(int year)InDate.cs相对日期数值入口OneTen十个嵌套静态类Nine即其中之一InDate.SomeTimeFrom.cs。与返回DateTime的In.Nine见 In.SomeTimeFrom.cs不同InDate.Nine的全部成员都以DateOnly为返回值——这是 .NET 6 起引入的、不含时间部分的纯日期类型适用于只看日期不看时间的业务场景。因此整个InDate类族都用#if NET6_0_OR_GREATER条件编译保护仅在 .NET 6 及以上目标框架可用。二、成员总览4 个属性 8 个方法InDate.Nine的全部公开成员可归纳为下表成员类别名称签名含义属性Daysstatic DateOnly Days { get; }从现在起 9 天后的日期属性Weeksstatic DateOnly Weeks { get; }从现在起 9 周后的日期属性Monthsstatic DateOnly Months { get; }从现在起 9 个月后的日期属性Yearsstatic DateOnly Years { get; }从现在起 9 年后的日期方法DaysFrom(DateOnly date)static DateOnly DaysFrom(DateOnly date)指定日期起 9 天后方法DaysFrom(DateTime date)static DateOnly DaysFrom(DateTime date)指定日期时间起 9 天后方法WeeksFrom(DateOnly date)static DateOnly WeeksFrom(DateOnly date)指定日期起 9 周后方法WeeksFrom(DateTime date)static DateOnly WeeksFrom(DateTime date)指定日期时间起 9 周后方法MonthsFrom(DateOnly date)static DateOnly MonthsFrom(DateOnly date)指定日期起 9 个月后方法MonthsFrom(DateTime date)static DateOnly MonthsFrom(DateTime date)指定日期时间起 9 个月后方法YearsFrom(DateOnly date)static DateOnly YearsFrom(DateOnly date)指定日期起 9 年后方法YearsFrom(DateTime date)static DateOnly YearsFrom(DateTime date)指定日期时间起 9 年后两类成员的定位非常清晰属性无参以现在为基准回答9 个时间单位之后是哪一天方法带参以调用者提供的日期为基准回答从某一天起再过 9 个时间单位是哪一天且每种单位都提供DateOnly与DateTime两个重载。三、属性详解基于 UtcNow 的9 个时间单位之后四个属性在 InDate.SomeTimeFrom.cs 中逐一实现核心模式是先以DateTime.UtcNow计算偏移再通过DateOnly.FromDateTime截取日期部分。以Days与Months为例public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(9)); public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(9));结合源码可以提炼出三条重要实现事实基准是DateTime.UtcNow而非本地时间。四个属性全部基于 UTC 时钟计算因此9 天后实际上是UTC 当前时刻 9 天。这与 fluent-dates-and-time-spans.mdx 场景指南中的提醒一致不带From/Of(year)的属性都会读取当前时钟在要求可重复结果的确定性代码中应谨慎使用。周以 7 天换算。Weeks的实现是DateTime.UtcNow.AddDays(63)9 * 7与In.Nine.Weeks的DateTime.UtcNow.AddDays(63)完全对应——周被定义为固定 7 天属于固定时长语义。月份与年份走日历算法。Months调用AddMonths(9)、Years调用AddYears(9)它们继承 .NET 日历归一化规则详见第五节是按日历计算而非按天数估算。返回类型统一为DateOnly意味着属性天然丢弃了时分秒部分——例如 2026-09-23 07:54 UTC 时刻下调用InDate.Nine.Days得到的是 2026-10-02 这一天的日期。四、方法详解从指定日期出发的确定性计算八个*From方法都以入参日期为起点不依赖系统时钟因此结果完全可预测、可测试。每个时间单位都有DateOnly与DateTime两个重载二者的实现策略略有差异。4.1 DateOnly 重载直接调用 Add 系列扩展以DaysFrom与YearsFrom为例源码 InDate.SomeTimeFrom.cspublic static DateOnly DaysFrom(DateOnly date) date.AddDays(9); public static DateOnly YearsFrom(DateOnly date) date.AddYears(9);DateOnly在 .NET 6 原生提供AddDays、AddMonths、AddYears方法因此这里直接委托给 BCL 即可无需任何转换。4.2 DateTime 重载先偏移、再转换当入参是DateTime时实现多一步DateOnly.FromDateTime转换public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(9)); public static DateOnly YearsFrom(DateTime date) DateOnly.FromDateTime(date.AddYears(9));这保证了两个重载返回类型一致DateOnly调用方无需关心入参究竟传的是纯日期还是带时间的时刻。4.3 各方法的偏移量速查方法底层实现偏移量DaysFrom(DateOnly/DateTime)AddDays(9)9 天WeeksFrom(DateOnly/DateTime)AddDays(63)63 天9 周 × 7 天MonthsFrom(DateOnly/DateTime)AddMonths(9)日历 9 个月YearsFrom(DateOnly/DateTime)AddYears(9)日历 9 年五、源码级原理T4 模板如何生成 NineInDate.Nine并非手写代码而是由 T4 文本模板 InDate.SomeTimeFrom.tt 在构建时批量生成的。模板核心是一个从 1 到 10 的循环#for (var i 1; i 10; i){ var plural i 1 ? s : ; var day Day plural; var week Week plural; var month Month plural; var year Year plural; # public static class # i.ToWords().Dehumanize() # { public static DateOnly # day # DateOnly.FromDateTime(DateTime.UtcNow.AddDays(# i #)); // ... 其余成员 } #}#这段模板揭示了三个设计细节类名由i.ToWords().Dehumanize()派生9.ToWords()得到英文单词 nine再经Dehumanize()规范化为 PascalCase 的Nine。这就是OneTen十个嵌套类命名的来源也解释了为何类名是英文单词而非数字。成员名由单复数规则派生i 1时生成Day、Week、Month、Year单数形式i 1时追加s得到Days、Weeks、Months、YearsFrom方法同理如DaysFrom。周统一以i * 7天表达模板中Weeks的实现是AddDays(i * 7)i 9即 63 天。同族的 DateTime 版本In.Nine由 In.SomeTimeFrom.tt 生成且额外包含Seconds、Minutes、Hours三个更细粒度单位见 In.SomeTimeFrom.cs而InDate.Nine只保留日期粒度的 Day/Week/Month/Year符合DateOnly不含时间成分的定位。六、InDate.Nine 与 In.Nine 的对照同一个数字 9Humanizer 提供了两套面向不同返回类型的入口对照如下维度InDate.NineIn.Nine返回类型DateOnly纯日期DateTime含时间可用框架.NET 6#if NET6_0_OR_GREATER全框架成员数量4 属性 8 方法7 属性 14 方法含秒/分/时时间单位Day / Week / Month / YearSecond / Minute / Hour / Day / Week / Month / Year相对属性基准DateTime.UtcNowDateTime.UtcNow选择建议只关心哪一天时用InDate.Nine例如排期、到期日、节假日计算需要保留时刻信息时用In.Nine例如9 天后的下午 3 点整。七、测试如何验证 Nine 的正确性仓库的 FluentDate 测试对生成类族做了系统性验证可作为理解InDate.Nine行为的依据GeneratedFluentDateTests.cs 中维护了一张RelativeAmounts映射表[Nine] 9并通过反射遍历InDate的全部嵌套类型InDateRelativeDatePropertiesReturnExpectedUtcOffsets对每个相对属性在调用前后分别取DateTime.UtcNow断言属性返回值落在[before amount, after amount]区间内验证属性确实以 UTC 时钟为基准InDateRelativeDateOnlyMethodsReturnExpectedOffsetsFromProvidedDate与InDateRelativeDateTimeMethodsReturnExpectedOffsetsFromProvidedDateTime对方法则直接断言date.AddDays(amount)、date.AddMonths(amount)等精确偏移结果InDateMonthPropertiesReturnExpectedDates等用例覆盖InDate的月份工厂。InDateTests.cs 还提供了手写用例例如用OnDate.January.The21st作为基准、断言InDate.Five.DaysFrom(baseDate)等于baseDate.AddDays(5)示范了注入固定起始日期以保证测试可重复的推荐用法——InDate.Nine的*From方法正是这一类确定性计算的入口。八、实战使用与注意事项8.1 基础用法示例using Humanizer; // 属性基于 UTC 当前时刻 DateOnly inNineDays InDate.Nine.Days; // 2026-10-02示例以 2026-09-23 为当前日期 DateOnly inNineWeeks InDate.Nine.Weeks; // 2026-11-25 DateOnly inNineMonths InDate.Nine.Months; // 2027-06-23 DateOnly inNineYears InDate.Nine.Years; // 2035-09-23 // 方法基于注入的起始日期结果确定可测 var start new DateOnly(2026, 2, 20); DateOnly d1 InDate.Nine.DaysFrom(start); // 2026-03-01 DateOnly d2 InDate.Nine.MonthsFrom(start); // 2026-11-20 DateOnly d3 InDate.Nine.YearsFrom(start); // 2035-02-20 // DateTime 重载时刻入参日期出参 var moment new DateTime(2026, 2, 20, 14, 30, 0); DateOnly d4 InDate.Nine.DaysFrom(moment); // 2026-03-01忽略时分秒8.2 三个必须注意的边界行为属性依赖系统时钟不适合确定性代码。Days/Weeks/Months/Years都基于DateTime.UtcNow两次调用之间跨越 UTC 午夜会导致结果不同单元测试或幂等业务中请优先使用*From方法注入固定日期。GeneratedFluentDateTests对属性采用区间断言而非精确断言正是为了容忍这一时钟特性。月/年运算遵循日历归一化。AddMonths/AddYears会把不存在的日期向月末收敛例如从 2028-02-29闰年算InDate.Nine.YearsFrom会得到 2037-02-28 而非 2037-02-29。这是 BCL 的标准行为并非 Humanizer 特有。周是固定 7 天月不是 30 天。Weeks/WeeksFrom本质是AddDays(63)而Months/MonthsFrom是日历月偏移二者不应混用需要精确天数时请用 Days 系列或 NumberToTimeSpanExtensions 的Weeks()扩展构造TimeSpan。8.3 与其他 FluentDate API 协同InDate.Nine可以很方便地与 InDate 的月份工厂如InDate.April、InDate.AprilOf(2025)、TheYear(int)以及 OnDate 的日期构造器组合使用构建出接近自然语言的日期表达式。完整的调用示例可参考场景指南 fluent-dates-and-time-spans.mdx其中特别指出InDate/OnDate是In/On在兼容框架.NET 6上的DateOnly对应实现且月份/年份运算不涉及特定文化的Calendar选择。九、相关 API 与延伸阅读本类 API 参考Humanizer.InDate.Nine.md父类总览Humanizer.InDate.md、DateTime 版同类 Humanizer.In.Nine.md实现源码InDate.SomeTimeFrom.cs、生成模板 InDate.SomeTimeFrom.tt测试用例GeneratedFluentDateTests.cs、InDateTests.cs场景指南fluent-dates-and-time-spans.mdx赞分享开发工具【免费下载链接】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 InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期Humanizer InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期 Humanizer 的 FluentD开发工具freeCodeCamp 每日编程挑战解析JavaScript 实现 Due Date9 个月后日期计算freeCodeCamp 每日编程挑战解析JavaScript 实现 Due Date9 个月后日期计算 本篇技术指南围绕 freeCodeCamp前端后端教育Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算 本篇技术指南聚焦 Humanizer 流式日期开发工具上一篇网盘直链下载助手完整上手攻略一个油猴脚本解锁六大网盘真实直链下一篇ascend-transformer-boost 训练侧 pad_with_hidden_state 算子参数校验、Shape 推导与 Runner 执行链路解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考