开发工具【免费下载链接】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系列是面向System.DateOnly的流式Fluent日期构造 API其中InDate.Ten静态嵌套类专门封装从现在起 10 天、10 周、10 个月、10 年之后的日期取值以及基于任意基准日期的相对计算。本文以 2.14.1 版本的 Humanizer.InDate.Ten API 文档 为主体结合仓库源码与测试用例完整讲解该类 4 个属性、8 个方法的签名、行为、实现原理与实战用法读完即可在 .NET 6 项目中安全使用InDate.Ten进行日期推算。InDate.Ten 在 Humanizer 流式日期体系中的位置Humanizer 的 FluentDate 模块位于 src/Humanizer/FluentDate 目录提供两组平行的流式日期 APIIn类基于System.DateTime的流式日期秒、分、时、天、周、月、年实现于 In.SomeTimeFrom.csInDate类基于System.DateOnly的流式日期天、周、月、年实现于 InDate.SomeTimeFrom.cs与之配套的还有月份构造InDate.January/JanuaryOf(year)等见 InDate.Months.cs以及InDate.TheYear(year)见 InDate.cs。InDate.Ten就是InDate中数量为 10 的嵌套静态类与InDate.One到InDate.Nine组成完整的 110 数字序列。需要说明的是DateOnly自 .NET 6 起才引入因此整个InDate系列源码都以#if NET6_0_OR_GREATER条件编译保护仅在兼容的目标框架.NET 6.0 及以上上可用按官方版本说明DateOnly流式辅助 API 自 2.11.10 版本起提供见 fluent-dates-and-time-spans 场景指南。类型声明与继承关系InDate.Ten的完整声明如下public static class InDate.Ten它是一个静态类所有成员均为静态成员可直接通过InDate.Ten.Days等方式调用无需实例化它继承自System.Object没有额外基类它嵌套在public partial class InDate内部partial使多个源文件可以共同构成该类。属性成员从现在起 10 个单位之后的日期InDate.Ten提供 4 个只读静态属性语义统一为从现在起 N 个单位之后全部返回System.DateOnly属性说明返回类型Days从现在起 10 天之后System.DateOnlyWeeks从现在起 10 周之后System.DateOnlyMonths从现在起 10 个月之后System.DateOnlyYears从现在起 10 年之后System.DateOnly对应声明节选自 Humanizer.InDate.Ten.mdpublic static System.DateOnly Days { get; } public static System.DateOnly Weeks { get; } public static System.DateOnly Months { get; } public static System.DateOnly Years { get; }属性成员的底层实现从 InDate.SomeTimeFrom.cs 的Ten类源码可以看到这些属性并非简单的今天 10public static class Ten { // 10 days from now public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(10)); // 10 weeks from now public static DateOnly Weeks DateOnly.FromDateTime(DateTime.UtcNow.AddDays(70)); // 10 months from now public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(10)); // 10 years from now public static DateOnly Years DateOnly.FromDateTime(DateTime.UtcNow.AddYears(10)); }可以总结出三个关键实现事实基准时间是 UTC属性基于DateTime.UtcNow计算再通过DateOnly.FromDateTime转换为只含年、月、日的DateOnly周是天数的倍数Weeks实现为AddDays(70)10 × 7而不是单独的周单位周的定义严格等于 7 天月/年走日历运算Months与Years分别委托给AddMonths(10)与AddYears(10)属于日历粒度的日期运算见场景指南对 InDate API 中 Calendar arithmetic 的说明而不是按固定天数估算。注意属性取值依赖现在不适合确定性代码由于Days/Weeks/Months/Years内部读取DateTime.UtcNow每次调用结果都会随当前时间漂移。场景指南的 Pitfall 小节明确提醒不带From或Of(year)后缀的属性在代码或测试中可能破坏可重复性需要确定性结果时应改用下面介绍的XxxFrom(date)方法注入基准日期。方法成员基于指定基准日期的相对计算InDate.Ten提供 8 个静态方法覆盖 4 个时间单位 × 2 种基准日期类型DateOnly与DateTime全部返回DateOnly方法说明参数返回类型DaysFrom(DateOnly date)从指定日期起 10 天之后System.DateOnlySystem.DateOnlyDaysFrom(DateTime date)从指定日期起 10 天之后System.DateTimeSystem.DateOnlyWeeksFrom(DateOnly date)从指定日期起 10 周之后System.DateOnlySystem.DateOnlyWeeksFrom(DateTime date)从指定日期起 10 周之后System.DateTimeSystem.DateOnlyMonthsFrom(DateOnly date)从指定日期起 10 个月之后System.DateOnlySystem.DateOnlyMonthsFrom(DateTime date)从指定日期起 10 个月之后System.DateTimeSystem.DateOnlyYearsFrom(DateOnly date)从指定日期起 10 年之后System.DateOnlySystem.DateOnlyYearsFrom(DateTime date)从指定日期起 10 年之后System.DateTimeSystem.DateOnly对应声明public static System.DateOnly DaysFrom(System.DateOnly date); public static System.DateOnly DaysFrom(System.DateTime date); public static System.DateOnly WeeksFrom(System.DateOnly date); public static System.DateOnly WeeksFrom(System.DateTime date); public static System.DateOnly MonthsFrom(System.DateOnly date); public static System.DateOnly MonthsFrom(System.DateTime date); public static System.DateOnly YearsFrom(System.DateOnly date); public static System.DateOnly YearsFrom(System.DateTime date);方法成员的底层实现源码中每个单位的方法都成对出现——DateOnly重载直接调用DateOnly的加法扩展DateTime重载则先对DateTime做加法、再DateOnly.FromDateTime裁剪掉时间部分// 10 days from the provided date public static DateOnly DaysFrom(DateOnly date) date.AddDays(10); public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(10)); // 10 weeks from the provided date public static DateOnly WeeksFrom(DateOnly date) date.AddDays(70); public static DateOnly WeeksFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(70)); // 10 months from the provided date public static DateOnly MonthsFrom(DateOnly date) date.AddMonths(10); public static DateOnly MonthsFrom(DateTime date) DateOnly.FromDateTime(date.AddMonths(10)); // 10 years from the provided date public static DateOnly YearsFrom(DateOnly date) date.AddYears(10); public static DateOnly YearsFrom(DateTime date) DateOnly.FromDateTime(date.AddYears(10));两点值得注意DateTime重载会丢弃时间分量例如InDate.Ten.DaysFrom(new DateTime(2025, 1, 1, 23, 59, 59))返回2025-01-11的DateOnly时间部分被FromDateTime舍去月/年的月末归一化行为MonthsFrom与YearsFrom继承AddMonths/AddYears的归一化规则例如从 2 月 29 日闰年起加 10 个月目标是非闰年的 12 月时结果会被归一化为 12 月 28 日。场景指南的 Pitfall 对此有明确说明如果业务需要保持同月同日、不存在则抛异常的严格语义则应使用date.In(year)之类的重构构造方式属于PrepositionsExtensions的范畴见 PrepositionsExtensions API。这些成员是如何生成出来的T4 模板InDate.Ten及OneNine并非手工逐个编写而是由一个 T4 模板 InDate.SomeTimeFrom.tt 生成的。模板的核心逻辑为for (var i 1; i 10; i) { var plural i 1 ? s : ; // 类名i.ToWords().Dehumanize() // Day/Week/Month/Year 按单复数命名如 One.Day 与 Ten.Days }也就是说循环从 1 到 10为每个数字生成一个静态嵌套类One、Two…Ten数量为 1 时成员名使用单数如InDate.One.Day数量大于 1 时使用复数如InDate.Ten.Days类名通过i.ToWords().Dehumanize()生成把数字转换成英文单词后再反人化dehumanize为 PascalCase 标识符每个类都包含从现在起属性与From方法两套成员与InDate.Ten完全同构。因此本文介绍的全部 12 个成员4 属性 8 方法在InDate.OneInDate.Nine中均有对应形态理解Ten就等于理解了整个数字序列InDateTime版本由 In.SomeTimeFrom.tt 以同样的方式生成且In序列还额外包含秒、分、时三个单位见 In.SomeTimeFrom.cs。实战用法与测试佐证完整可运行的示例using Humanizer; // 属性以当前 UTC 时间为基准 DateOnly in10Days InDate.Ten.Days; // UtcNow 10 天 DateOnly in10Weeks InDate.Ten.Weeks; // UtcNow 70 天 DateOnly in10Months InDate.Ten.Months; // UtcNow 10 个月 DateOnly in10Years InDate.Ten.Years; // UtcNow 10 年 // 方法以固定日期为基准适合确定性代码与测试 DateOnly baseDate new(2025, 1, 1); DateOnly fromDateOnly InDate.Ten.DaysFrom(baseDate); // 2025-01-11 DateOnly fromDateTime InDate.Ten.WeeksFrom(new DateTime(2025, 1, 1)); // 2025-03-12 DateOnly months InDate.Ten.MonthsFrom(baseDate); // 2025-11-01 DateOnly years InDate.Ten.YearsFrom(baseDate); // 2035-01-01与月份构造类组合使用InDate.Ten的方法重载接受DateOnly因此可以很方便地与InDate的月份构造器链式组合。例如结合 InDate.Months.cs 中的InDate.JanuaryOf(2025)DateOnly anniversaryPlus10Months InDate.Ten.MonthsFrom(InDate.JanuaryOf(2025)); // 2025-11-01仓库测试验证仓库中的 InDateTests.cs 对InDate系列做了单元验证其中InFiveDays用例展示了方法重载的预期语义[Fact] public void InFiveDays() { var baseDate OnDate.January.The21st; var date InDate.Five.DaysFrom(baseDate); Assert.Equal(baseDate.AddDays(5), date); }同一测试文件还验证了InDate.January、InDate.JanuaryOf(2009)、InDate.TheYear(2009)等属性/方法的行为。InDate.Ten与InDate.Five由同一 T4 模板生成、实现同构因此上述断言模式可直接套用于InDate.Ten.DaysFrom(...)。使用注意事项小结关注点说明目标框架InDate及InDate.Ten仅存在于#if NET6_0_OR_GREATER编译分支需 .NET 6.0版本要求DateOnly流式辅助自 2.11.10 起提供本文基于 2.14.1 文档版本属性基准时间Days/Weeks/Months/Years基于DateTime.UtcNow随时间漂移不宜用于确定性代码方法基准时间XxxFrom(date)接受调用方注入的基准日期可重复、可测试推荐优先使用周的定义Weeks/WeeksFrom实现为 7 天倍数并非独立单位月/年语义委托AddMonths/AddYears存在月末归一化如 2 月 29 日 → 2 月 28 日时间裁剪所有成员最终都返回DateOnlyDateTime重载会丢弃时分秒进一步阅读类总览InDate API2.14.1 与 In API2.14.1同级数字类InDate.One至InDate.NineAPI 目录website/versioned_docs/version-2.14.1/api实战场景Compose dates and time spans fluently2.14.1源码与测试InDate.SomeTimeFrom.cs、InDate.SomeTimeFrom.tt、InDateTests.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.Ten 详解用 DateOnly 流式 API 计算 10 天/周/月/年后的日期Humanizer InDate.Ten 详解用 DateOnly 流式 API 计算 10 天/周/月/年后的日期 InDate.Ten 是 Humaniz开发工具Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算 本篇技术指南聚焦 Humanizer 流式日期开发工具Tesla Dashcam3 步快速完整合并行车记录视频Tesla Dashcam3 步快速完整合并行车记录视频 特斯拉行车记录仪每次记录事件后会在 U 盘 TeslaCam 文件夹里留下数十个按摄像头、按分钟切开发工具上一篇15分钟搞定黑苹果EFI配置OpCore Simplify终极指南下一篇如何在5分钟内搭建专属视频门户MediaCMS开源视频管理系统完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考