
开发工具【免费下载链接】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 的 FluentDate 模块提供了一套可读性极高的声明式日期 API其中In.Five类专门用于表达从现在起或从指定时刻起5 秒/分钟/小时/天/周/月/年这类时间偏移。本文以website/versioned_docs/version-2.14.1/api/Humanizer.In.Five.md文档为主体结合 In.SomeTimeFrom.cs 源码与 InTests.cs 测试完整讲解该类的 7 个属性、7 个方法与底层生成机制读者读完后可以直接在 .NET 项目中用它写出In.Five.Minutes这样接近自然语言的时间代码。一、In.Five 类速览API 签名与定位In.Five是嵌套在Humanizer.In类内部的public static class位于Humanizer命名空间属于 FluentDate 功能族。从 API 文档看它的继承关系为System.Object → Five类型定义如下namespace Humanizer; public partial class In { public static class Five { // 7 个属性 7 个方法 } }在 In.SomeTimeFrom.cs 中可以看到In.Five共暴露 14 个成员分为两类属性7 个基于DateTime.UtcNow计算从现在起的偏移每次访问时实时取值方法7 个接收一个System.DateTime date参数返回从该日期起的偏移不依赖当前时刻具备确定性。这个类没有实例成员、没有构造函数使用方式永远是静态访问In.Five.Seconds或In.Five.DaysFrom(date)。二、属性详解从现在起 5 个时间单位文档列出的 7 个属性均返回System.DateTime语义与实现如下表属性文档语义源码实现In.SomeTimeFrom.csSeconds5 seconds from nowDateTime.UtcNow.AddSeconds(5)Minutes5 minutes from nowDateTime.UtcNow.AddMinutes(5)Hours5 hours from nowDateTime.UtcNow.AddHours(5)Days5 days from nowDateTime.UtcNow.AddDays(5)Weeks5 weeks from nowDateTime.UtcNow.AddDays(35)Months5 months from nowDateTime.UtcNow.AddMonths(5)Years5 years from nowDateTime.UtcNow.AddYears(5)使用示例using Humanizer; // 从现在起 5 分钟后的时刻 DateTime deadline In.Five.Minutes; // 从现在起 5 天后的时刻常用于缓存过期时间 DateTime cacheExpiry In.Five.Days;三个值得注意的实现细节基准是 UTC所有属性都基于DateTime.UtcNow而非DateTime.Now返回的是 UTC 时刻。如果需要本地时间展示应自行调用.ToLocalTime()。Weeks本质是天数加法In.Five.Weeks实现为DateTime.UtcNow.AddDays(35)即固定按 7 天/周换算不存在跨月/跨年周数的歧义。属性是实时计算的表达式体属性每次访问都会重新读取UtcNow因此多次连续访问In.Five.Seconds会得到略有差异的结果。若要求一次计算内保持一致应把结果赋给局部变量。三、方法详解从指定日期起 5 个时间单位7 个方法均接收System.DateTime date参数并返回System.DateTime语义是从提供的日期偏移 5 个单位实现全部基于DateTime.AddXxxpublic static DateTime SecondsFrom(DateTime date) date.AddSeconds(5); public static DateTime MinutesFrom(DateTime date) date.AddMinutes(5); public static DateTime HoursFrom(DateTime date) date.AddHours(5); public static DateTime DaysFrom(DateTime date) date.AddDays(5); public static DateTime WeeksFrom(DateTime date) date.AddDays(35); // 5 周 35 天 public static DateTime MonthsFrom(DateTime date) date.AddMonths(5); public static DateTime YearsFrom(DateTime date) date.AddYears(5);典型用法——把5 天宽限期叠加到任意基准日期上using Humanizer; DateTime dueDate new(2026, 10, 1); DateTime graceDeadline In.Five.DaysFrom(dueDate); // 2026-10-06与属性版本相比XxxFrom方法具备纯函数特性相同输入永远得到相同输出不依赖系统时钟因此更适合在单元测试、批处理和需要可复现结果的场景中使用。测试代码 InTests.cs 正是这样验证的[Fact] public void InFiveDays() { var baseDate On.January.The21st; var date In.Five.DaysFrom(baseDate); Assert.Equal(baseDate.AddDays(5), date); }该测试同时展示了 FluentDate 的组合用法先用On.January.The21st声明一个基准日期再用In.Five.DaysFrom在其上叠加偏移最终断言结果等价于baseDate.AddDays(5)。四、DateOnly 变体InDate.Five 与 .NET 6 场景针对仅需要日期、不需要时刻的场景Humanizer 在#if NET6_0_OR_GREATER条件下提供了InDate平行类型。文档对应的 InDate.SomeTimeFrom.cs 中同样存在InDate.Five但它返回的是System.DateOnlyInDate.Five.Day→DateOnly.FromDateTime(DateTime.UtcNow.AddDays(5))InDate.Five.DayFrom(DateOnly date)→date.AddDays(5)InDate.Five.DayFrom(DateTime date)→DateOnly.FromDateTime(date.AddDays(5))从源码结构看InDate.Five为DayFrom提供了两个重载DateOnly与DateTime入参方便从两种类型的基准日期出发计算Week、Month等成员同样遵循DateOnly语义。对应测试见 InDateTests.cs。选择建议只关心哪一天时用InDate需要精确时刻时用In。五、源码级原理T4 模板批量生成 One 到 TenIn.Five并非手工编写而是由 T4 文本模板生成。模板文件 In.SomeTimeFrom.tt 的核心循环如下#for (var i 1; i 10; i){ var plural i 1 ? s : ; ... public static class # i.ToWords().Dehumanize() # { public static DateTime # second # DateTime.UtcNow.AddSeconds(# i #); ... } #}#关键机制可以推断为循环变量i从 1 迭代到 10一次生成One到Ten共 10 个嵌套静态类类名通过i.ToWords().Dehumanize()生成——先调用 Humanizer 自身的数字转单词能力得到five再反人化得到Five类名与文档 API 完全对应单复数规则由i 1 ? s : 控制所以In.One中是Second/Minute/Hour/Day/Week/Month/Year单数In.Five及以后是Seconds/Minutes/Hours/Days/Weeks/Months/Years复数这也解释了为什么In.Five.Days使用复数命名Weeks统一展开为AddDays(i * 7)而秒/分/时/天/月/年直接使用对应的AddXxx(i)。In本身是一个partial class月份相关成员由 In.Months.tt 生成In.January、In.JanuaryOf(year)等TheYear方法定义在 In.cs 中而One到Ten由 In.SomeTimeFrom.tt 生成三者共同拼成完整的 FluentDate 入口。六、实战场景与注意事项推荐使用场景超时与过期时间var timeout In.Five.Minutes;比DateTime.UtcNow.AddMinutes(5)语义更直观缓存 TTLcache.Set(key, value, In.Five.Days - DateTime.UtcNow)这类相对当前时刻的偏移计算调度与宽限期In.Five.WeeksFrom(billingDate)表达账单日后 5 周可读性优先的领域代码在领域事件、提醒规则中In.Five.HoursFrom(createdAt)比裸的AddHours(5)更贴近业务语言。注意事项UTC 语义In.Five.Xxx基于UtcNow需要本地时间时显式转换跨时区系统请勿混用。属性实时求值连续访问属性会得到不同时刻需要一致基准时先缓存到变量或用XxxFrom(DateTime.UtcNow)等价形式。闰月与月末AddMonths(5)/AddYears(5)遵循 .NET 的月份/年份推进规则如 8 月 31 日加 1 个月得到 9 月 30 日Weeks则固定 7 天/周。版本与目标框架InDate.FiveDateOnly变体仅在NET6_0_OR_GREATER下编译旧框架项目应使用In.Five的DateTime版本。综上In.Five是 Humanizer FluentDate 中数字 → 时间偏移的典型代表API 文档负责定义契约T4 模板保证 One 到 Ten 的一致性生成测试用例则锁定了DaysFrom的确定性行为。掌握它的属性/方法二元结构后你可以无障碍地迁移到In.One、In.Three、In.Ten等其他数字类并用同样的思路使用InDate.Five处理纯日期场景。赞分享开发工具【免费下载链接】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.Five 类与从现在起 5 个时间单位的 DateTime 计算Humanizer 流式日期 API 全解析In.Five 类与从现在起 5 个时间单位的 DateTime 计算 本文以 Humanizer 2.10.开发工具Humanizer 的 In.Nine 类用 Fluent API 表达从现在起 9 个时间单位之后的日期Humanizer 的 In.Nine 类用 Fluent API 表达从现在起 9 个时间单位之后的日期 In.Nine 是 Humanizer Flu开发工具Humanizer In.One 类详解用 FluentDate 相对时间 API 精确表达从现在起 1 个时间单位Humanizer In.One 类详解用 FluentDate 相对时间 API 精确表达从现在起 1 个时间单位 在 .NET 的日期计算场景中直接开发工具上一篇SQL Lineage元数据集成连接数据库获取完整血缘信息下一篇iptvnator 精准原生播放诊断设计如何让HTTP 404不再被误报成不支持的编码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考