
开发工具【免费下载链接】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点击查看免费下载In.Nine是 Humanizer FluentDate 子模块为数字 9 生成的一组静态成员它把DateTime.UtcNow.AddXxx(9)这类底层调用封装成In.Nine.Days、In.Nine.MonthsFrom(date)这样可读性极强的表达式。本文以version-2.11.10的 API 文档为主体结合仓库中src/Humanizer/FluentDate/下的 T4 生成源码与tests/Humanizer.Tests/FluentDate/的测试用例完整介绍它的 7 个属性、7 个方法、底层实现原理与实战用法读完即可在自己项目中直接用上这套流式日期语法。In.Nine 是什么FluentDate 家族中的数字 9入口Humanizer 的 FluentDate 是一组让日期计算读起来像自然语言的 APIIn.Five.DaysFrom(someDate)表示从某个日期起 5 天后On.January.The21st表示1 月 21 日。其中In是顶层入口类In.Nine是它的嵌套静态类专门负责与数字9相关的所有相对日期计算涵盖秒、分钟、小时、天、周、月、年七种时间单位。从源码结构看In.Nine由 T4 文本模板 In.SomeTimeFrom.tt 统一生成模板对i 1..10循环用i.ToWords().Dehumanize()把数字转成英文单词Nine再按单复数规则拼出Seconds/Minutes/Hours/Days/Weeks/Months/Years成员名最终产出 In.SomeTimeFrom.cs 中的One到Ten十个嵌套类Nine正是其中之一见该文件第 721–806 行。这意味着In.Nine的 API 形态与In.One到In.Ten完全对称只要掌握了Nine其余数字类即可触类旁通。此外同一子模块中还提供了面向DateOnly的 InDate 系列在 .NET 6 及以上可用以及用于生成 T4 的 In.SomeTimeFrom.tt 与 In.Months.tt。属性Properties9 个时间单位从现在起In.Nine提供了 7 个只读静态属性语义全部是从现在起 9 个 X 之后底层均基于DateTime.UtcNow计算返回System.DateTime属性文档语义底层实现来自生成源码In.Nine.Seconds9 seconds from nowDateTime.UtcNow.AddSeconds(9)In.Nine.Minutes9 minutes from nowDateTime.UtcNow.AddMinutes(9)In.Nine.Hours9 hours from nowDateTime.UtcNow.AddHours(9)In.Nine.Days9 days from nowDateTime.UtcNow.AddDays(9)In.Nine.Weeks9 weeks from nowDateTime.UtcNow.AddDays(63)即 9 × 7In.Nine.Months9 months from nowDateTime.UtcNow.AddMonths(9)In.Nine.Years9 years from nowDateTime.UtcNow.AddYears(9)文档中对应的签名形如public static System.DateTime Seconds { get; } public static System.DateTime Minutes { get; } public static System.DateTime Hours { get; } public static System.DateTime Days { get; } public static System.DateTime Weeks { get; } public static System.DateTime Months { get; } public static System.DateTime Years { get; }从生成源码可见两个值得注意的实现事实基于 UTC 时刻属性值是读取那一刻的DateTime.UtcNow加偏移因此每次访问都会重新计算。若在代码中多次读取同一属性结果会随当前 UTC 时间推进而略有差异适合一次性取值使用。周以天为倍数Weeks不是调用AddDays(9)而是AddDays(63)即 9 周按 7 天/周换算符合测试中对RelativeDateUnit.Week的amount * 7断言见 GeneratedFluentDateTests.cs 第 265–276 行。方法Methods9 个时间单位从指定日期起与属性一一对应In.Nine还提供 7 个静态方法语义是从传入的 date 起 9 个 X 之后同样返回System.DateTime方法文档语义底层实现In.Nine.SecondsFrom(date)9 seconds from the provided datedate.AddSeconds(9)In.Nine.MinutesFrom(date)9 minutes from the provided datedate.AddMinutes(9)In.Nine.HoursFrom(date)9 hours from the provided datedate.AddHours(9)In.Nine.DaysFrom(date)9 days from the provided datedate.AddDays(9)In.Nine.WeeksFrom(date)9 weeks from the provided datedate.AddDays(63)In.Nine.MonthsFrom(date)9 months from the provided datedate.AddMonths(9)In.Nine.YearsFrom(date)9 years from the provided datedate.AddYears(9)文档中的完整签名如下所有方法的参数类型与返回类型均为System.DateTimepublic static System.DateTime SecondsFrom(System.DateTime date); public static System.DateTime MinutesFrom(System.DateTime date); public static System.DateTime HoursFrom(System.DateTime date); public static System.DateTime DaysFrom(System.DateTime date); public static System.DateTime WeeksFrom(System.DateTime date); public static System.DateTime MonthsFrom(System.DateTime date); public static System.DateTime YearsFrom(System.DateTime date);与属性相比方法版是确定性的给定同一个date无论何时调用、调用多少次结果始终一致因此更适合在需要可复现计算的业务逻辑中使用。实战用法与组合示例结合仓库提供的 FluentDate 示例 scenarios-fluent-dates/Program.cs可以看到这套 API 的典型组合方式——先用In.Two.MonthsFrom做相对偏移再用In.AprilOf(2025)与.At(14, 30)构造绝对日期using Humanizer; var startingPoint new DateTime(2025, 1, 20, 9, 0, 0); var twoMonthsLater In.Two.MonthsFrom(startingPoint); // 2025-03-20 09:00 var appointment In.AprilOf(2025).AddDays(2).At(14, 30); // 2025-04-02 14:30 Console.WriteLine($Two months later: {twoMonthsLater:yyyy-MM-dd HH:mm}); Console.WriteLine($Appointment: {appointment:yyyy-MM-dd HH:mm});把其中的数字换成Nine即可获得9 天后的日期9 个月后的时刻等表达式// 从现在起 9 天基于 UTC var dueDate In.Nine.Days; // 从指定日期起 9 个月 var deadline In.Nine.MonthsFrom(new DateTime(2025, 1, 20)); // 从指定日期起 9 年 var anniversary In.Nine.YearsFrom(new DateTime(2025, 1, 20));与手写date.AddDays(9)相比In.Nine.DaysFrom(date)的收益主要在可读性与可组合性表达式本身即文档且能与In类的月份属性如In.September、In.SeptemberOf(2025)自然混排。底层原理T4 模板如何生成 In.NineIn.Nine不是手写代码而是由 T4 模板驱动的生成代码这一点从仓库布局可以清楚看到模板文件 In.SomeTimeFrom.tt 内含for (var i 1; i 10; i)循环每次迭代生成一个以i.ToWords().Dehumanize()命名的嵌套类类内部为 7 个时间单位各生成一个属性基于DateTime.UtcNow和一个方法基于传入的date模板引用$(TargetPath)程序集并import namespaceHumanizer说明生成阶段直接复用了 Humanizer 自身的数字转单词能力生成结果即 In.SomeTimeFrom.cs其中Nine类的属性与方法实现与本文前面表格完全一致。这套模板生成 × 代码复用的机制保证了In.One到In.Ten的 API 高度一致任何数字类的行为模式都可互相印证。测试验证Nine 的偏移如何被断言仓库用反射式测试对包括In.Nine在内的全部生成 API 做了系统校验核心依据是 GeneratedFluentDateTests.csInRelativeDatePropertiesReturnExpectedUtcOffsets第 9–10 行遍历In下所有相对日期嵌套类型对每个静态属性在DateTime.UtcNow前后采样区间内断言Assert.InRange(actual, Add(before, amount, unit), Add(after, amount, unit))验证属性值确实落在当前时刻 9 个时间单位的窗口内InRelativeDateMethodsReturnExpectedOffsetsFromProvidedDate第 13–14 行以固定基准new DateTime(2024, 2, 29, 10, 20, 30, DateTimeKind.Utc)调用每个*From(date)方法并用Assert.Equal(Add(date, amount, unit), actual)精确断言偏移量辅助方法Add第 265–276 行按RelativeDateUnit枚举实现Second/Minute/Hour/Day/Week/Month/Year的加法其中Week date.AddDays(amount * 7)与In.Nine.Weeks的AddDays(63)实现完全对应。此外InTests.cs 中的InFiveDays用例第 104–109 行展示了In.Five.DaysFrom(baseDate)与baseDate.AddDays(5)等价的断言方式可作为理解In.Nine各成员行为的最小范例。与 On / InDate 等姊妹 API 的关系In.Nine只解决从现在/指定时刻起 9 个时间单位之后这一种语义FluentDate 家族还有两个平行的入口需要区分In除One~Ten嵌套类外还提供 12 个月的属性In.January等返回当前年份该月 1 日与XxxOf(int year)方法如In.SeptemberOf(2025)对应源码 In.Months.cs 及In.TheYear(int)见 In.csOn负责某月某日的绝对日期如On.January.The21st与In的相对偏移互补InDate面向DateOnly的版本InDate.SomeTimeFrom.cs在NET6_0_OR_GREATER条件下编译其DayFrom/WeekFrom/MonthFrom/YearFrom同时提供DateOnly与DateTime两种重载测试见 GeneratedFluentDateTests.cs 第 34–43 行。使用前提与注意事项目标框架In.Nine返回System.DateTime适用于所有 Humanizer 支持的目标框架若需纯日期无时间分量应改用InDate系列需 .NET 6 及以上。属性基于 UTCIn.Nine.Days等属性使用DateTime.UtcNow如需本地时间可自行将结果ToLocalTime()或直接改用接收date参数的方法。API 文档对应关系本文所依据的 API 文档为 Humanizer.In.Nine.md其中每个属性、方法的签名与语义描述均与生成源码一一对应可作为查阅完整成员清单的权威参考。赞分享开发工具【免费下载链接】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 In.Nine API 详解在 FluentDate 流畅日期体系中表达「9 个时间单位之后」Humanizer In.Nine API 详解在 FluentDate 流畅日期体系中表达「9 个时间单位之后」 In.Nine 是 Humanizer 库开发工具Humanizer In.Eight 详解用流式 API 表达8 个时间单位之后的日期Humanizer In.Eight 详解用流式 API 表达8 个时间单位之后的日期 导读 Humanizer.In.Eight 是 Humanizer开发工具Humanizer FluentDate 之 In.Ten用一行代码表达“从现在起 10 个时间单位之后”Humanizer FluentDate 之 In.Ten用一行代码表达“从现在起 10 个时间单位之后” 本篇技术指南以 Humanizer 的 API 参开发工具上一篇Swagger Codegen 生成的 Java 模型类 Name 文档深度解读同名属性、蛇形命名与保留字处理下一篇解密Cursor限制突破从限制本质到突破实践的深度探索创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考