
开发工具【免费下载链接】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系列是专门面向DateOnly的流畅日期构造 API而InDate.Three则集中提供了以3 个时间单位为步长的日期计算能力3 天、3 周、3 个月、3 年后或从任意给定日期起算的日期。读完本文你将掌握InDate.Three全部 4 个属性与 8 个方法的签名、返回值与语义差异理解其基于UtcNow与AddDays/AddMonths/AddYears的实现原理并能在 .NET 6 项目中写出可读、可复现的日期偏移代码。一、定位InDate是面向DateOnly的流畅日期构造器InDate是 Humanizer FluentDate 模块中的一个public partial class与面向DateTime的In类形成对应关系。从源码结构看InDate.cs 提供了TheYear(int year)与各月份属性January、April等返回当年该月 1 日的DateOnly而 InDate.SomeTimeFrom.cs 中则定义了从One到Ten共 10 个嵌套静态类InDate.Three就是其中的第 3 个。public partial class InDate { public static class Three { // 3 天 / 3 周 / 3 个月 / 3 年后相对当前时刻 public static DateOnly Days { get; } public static DateOnly Weeks { get; } public static DateOnly Months { get; } public static DateOnly Years { get; } // 从指定日期起算 public static DateOnly DaysFrom(DateOnly date); public static DateOnly DaysFrom(DateTime date); public static DateOnly WeeksFrom(DateOnly date); public static DateOnly WeeksFrom(DateTime date); public static DateOnly MonthsFrom(DateOnly date); public static DateOnly MonthsFrom(DateTime date); public static DateOnly YearsFrom(DateOnly date); public static DateOnly YearsFrom(DateTime date); } }对应 API 文档位于 website/versioned_docs/version-3.0.1/api/Humanizer.InDate.Three.md整个InDate.Three类的返回类型一律是System.DateOnly这意味着该 API 仅在 .NET 6 及以上框架可用源码中整体包裹在#if NET6_0_OR_GREATER预处理器指令内。二、属性速览四个“从现在起算”的只读属性InDate.Three提供 4 个静态只读属性语义均为“从现在起 N 个时间单位之后”内部统一基于DateTime.UtcNow计算属性文档说明返回类型内部实现源码Days3 days from now3 天后System.DateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddDays(3))Weeks3 weeks from now3 周后System.DateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddDays(21))Months3 months from now3 个月后System.DateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddMonths(3))Years3 years from now3 年后System.DateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddYears(3))实现细节对应 InDate.SomeTimeFrom.cs 中Three类的第 169–236 行例如public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(3)); public static DateOnly Weeks DateOnly.FromDateTime(DateTime.UtcNow.AddDays(21));需要特别注意的三点周是“7 天制”Weeks在源码中等价于AddDays(21)3 × 7 天而不是调用AddWeeks因为DateOnly本身只提供AddDays/AddMonths/AddYears。基准时刻是 UTC这四个属性读的是DateTime.UtcNow而非本地DateTime.Now因此取值随“当前 UTC 时刻”漂移属于非确定性表达式详见后文“可复现性”一节。只取日期部分无论当前 UTC 时刻几点几分结果都通过DateOnly.FromDateTime截断为纯日期不含时间分量。三、方法速览八个“从指定日期起算”的重载与属性相对InDate.Three的方法族允许传入一个基准日期从而得到确定性的偏移结果。每个时间单位都有两个重载方法参数类型返回类型源码实现DaysFromSystem.DateOnlySystem.DateOnlydate.AddDays(3)DaysFromSystem.DateTimeSystem.DateOnlyDateOnly.FromDateTime(date.AddDays(3))WeeksFromSystem.DateOnlySystem.DateOnlydate.AddDays(21)WeeksFromSystem.DateTimeSystem.DateOnlyDateOnly.FromDateTime(date.AddDays(21))MonthsFromSystem.DateOnlySystem.DateOnlydate.AddMonths(3)MonthsFromSystem.DateTimeSystem.DateOnlyDateOnly.FromDateTime(date.AddMonths(3))YearsFromSystem.DateOnlySystem.DateOnlydate.AddYears(3)YearsFromSystem.DateTimeSystem.DateOnlyDateOnly.FromDateTime(date.AddYears(3))两组重载的差异在于输入传DateOnly时直接调用DateOnly.AddXxx传DateTime时先对DateTime做加法、再用DateOnly.FromDateTime转换。两种重载的返回值都是DateOnly因此无论业务层拿到的是DateTime还是DateOnly都能统一得到纯日期结果便于与DateOnly字段、参数、ToString(yyyy-MM-dd)格式化等场景对接。四、源码级原理T4 模板批量生成与命名约定InDate.Three并非手写代码而是由 T4 文本模板 InDate.SomeTimeFrom.tt 批量生成。模板核心循环如下节选#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()将3转为three再经Dehumanize()得到帕斯卡命名Three因此OneTen十个类的类名完全一致对称。成员名的单复数约定i 1时成员名为复数Days/Weeks/Months/Yearsi 1时为单数Day/Week/Month/Year。也就是说InDate.One.Day与InDate.Three.Days的命名不对称这是刻意设计使用时不要写错。周统一用天数展开模板中week成员的实现是AddDays(i * 7)与属性部分的UtcNow.AddDays(i * 7)一致。同样的模式也存在于面向DateTime的In类见 In.SomeTimeFrom.tt二者共同构成了 Humanizer FluentDate 的“数字 时间单位”命名空间。五、实战用法可复现的日期偏移InDate.Three最典型的用法是传入确定基准、获得确定结果适合定时任务排期、订阅周期计算、报表截止日期等场景。using Humanizer; // 从固定基准日偏移确定性可单测 var baseDate new DateOnly(2026, 9, 27); var in3Days InDate.Three.DaysFrom(baseDate); // 2026-09-30 var in3Weeks InDate.Three.WeeksFrom(baseDate); // 2026-10-18 var in3Months InDate.Three.MonthsFrom(baseDate); // 2026-12-27 var in3Years InDate.Three.YearsFrom(baseDate); // 2029-09-27 // DateTime 重载同样返回 DateOnly var fromDateTime InDate.Three.MonthsFrom(new DateTime(2026, 9, 27, 14, 30, 0)); // 结果仍是 DateOnly: 2026-12-27如果只是想表达“相对现在的 3 个月后”也可以直接用属性var reminderDate InDate.Three.Months; // ≈ UtcNow 加 3 个月后的日期Humanizer 官方场景示例 fluent-dates-and-time-spans.mdx 与可运行示例 Program.cs 也演示了这类日历型日期运算与时长型运算如1.5.Days()返回TimeSpan的区分思路。测试验证仓库测试 InDateTests.cs 对同族 API 的验证方式可以直接套用到InDate.Three[Fact] public void InFiveDays() { var baseDate OnDate.January.The21st; var date InDate.Five.DaysFrom(baseDate); Assert.Equal(baseDate.AddDays(5), date); }即给定基准日期调用From方法应与基准日期直接调用AddDays/AddMonths/AddYears的结果完全相等。这也反向印证了InDate.Three.DaysFrom(date)就是date.AddDays(3)的薄封装。六、实践要点与注意事项框架前提DateOnly自 .NET 6 引入InDate全家包括InDate.Three仅在NET6_0_OR_GREATER条件下编译。面向 .NET Framework / .NET 5 及以下时应改用面向DateTime的In类。确定性优先Days/Months/Weeks/Years四个属性依赖UtcNow每次调用结果随时间变化需要可重复执行的代码定时任务、测试、幂等计算应改为InDate.Three.MonthsFrom(fixedDate)形式。日历算术而非时长算术MonthsFrom/YearsFrom委托给AddMonths/AddYears遵循日历归一化规则——例如从 2 月 29 日加 3 个月到非闰年结果为 2 月 28 日5 月 29 日→实际取 5 月末归一这与TimeSpan的固定 24 小时天数语义有本质区别。命名坑位提醒InDate.One使用单数Day/Week/Month/YearInDate.Three至InDate.Ten使用复数复制粘贴代码时留意区分。七、延伸阅读InDate全部成员月份属性与Of(int year)方法Humanizer.InDate API面向DateTime的对应实现In类In.SomeTimeFrom.tt与InAPI 文档FluentDate 场景指南fluent-dates-and-time-spans.mdx生成InDate.OneTen的 T4 模板InDate.SomeTimeFrom.tt生成结果见 InDate.SomeTimeFrom.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 的 InDate.Three 类完全指南用 DateOnly 简洁表达三天/三周/三个月/三年后Humanizer 的 InDate.Three 类完全指南用 DateOnly 简洁表达三天/三周/三个月/三年后 Humanizer 是 .NET 生开发工具Humanizer InDate.Two 指南用流式 API 计算 2 天/周/月/年后的 DateOnly 日期Humanizer InDate.Two 指南用流式 API 计算 2 天/周/月/年后的 DateOnly 日期 Humanizer 的 InDate.Tw开发工具Humanizer InDate.Eight 完全指南用流式 API 计算 8 天、8 周、8 月、8 年后的 DateOnly 日期Humanizer InDate.Eight 完全指南用流式 API 计算 8 天、8 周、8 月、8 年后的 DateOnly 日期 本篇技术指南聚焦 Hu开发工具上一篇如何快速上手IDR从2D图像重建高质量3D模型的完整指南下一篇【亲测免费】 Juicebox解锁基因组的三维密码创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考