ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Humanizer 流式日期 API 详解:`In.Seven` 与“7 天后“相对时间计算

Humanizer 流式日期 API 详解:`In.Seven` 与“7 天后“相对时间计算 开发工具【免费下载链接】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 3.0.1 版本 API 参考文档Humanizer.In.Seven.md为骨架完整讲解Humanizer.In.Seven这一流式日期FluentDateAPI7 个从现在起属性、7 个从指定日期起方法并结合仓库源码、T4 生成模板与单元测试剖析其底层实现。读完本文你将掌握用一行可读性极强的代码表达7 秒/分钟/小时/天/周/月/年后的写法并理解其在 UTC 语义、日历单位月/年与周换算7 周 49 天上的具体行为可直接在业务代码中落地使用。In.Seven是什么FluentDate 家族中的数量 7In.Seven是 Humanizer 流式日期 APIFluentDate的一部分。它是一个嵌套在静态类In内部的public static class位于命名空间Humanizer下完整声明为public static class In.Seven在 3.0.1 的 API 参考中它继承自System.Object即普通静态类的默认基类。从源码结构看In本身是一个public partial class见 In.cs 与 In.SomeTimeFrom.cs 的声明因此日历日期In.January、In.JanuaryOf(year)、In.TheYear(year)与相对时间In.Seven.Days等被合并进同一个类型日历日期部分由 In.Months.cs 提供例如In.January返回new(DateTime.UtcNow.Year, 1, 1)相对时间部分由 In.SomeTimeFrom.cs 提供其中就包含本文主角Seven类。In家族一共提供了One到Ten十个数量类Seven是其中代表数量 7 的一个。这类 API 的命名刻意让代码读起来像自然语言In.Seven.Days读作in seven days7 天后In.Seven.YearsFrom(date)读作7 years from the provided date距给定日期 7 年后无需任何注释就能自解释。七个从现在起属性7 秒/分钟/小时/天/周/月/年In.Seven提供 7 个静态只读属性全部返回System.DateTime语义均为从现在起 X 个时间单位之后。下表完整列出文档中的签名、语义与源码实现属性签名文档语义源码实现In.SomeTimeFrom.csSecondspublic static System.DateTime Seconds { get; }7 seconds from nowDateTime.UtcNow.AddSeconds(7)Minutespublic static System.DateTime Minutes { get; }7 minutes from nowDateTime.UtcNow.AddMinutes(7)Hourspublic static System.DateTime Hours { get; }7 hours from nowDateTime.UtcNow.AddHours(7)Dayspublic static System.DateTime Days { get; }7 days from nowDateTime.UtcNow.AddDays(7)Weekspublic static System.DateTime Weeks { get; }7 weeks from nowDateTime.UtcNow.AddDays(49)Monthspublic static System.DateTime Months { get; }7 months from nowDateTime.UtcNow.AddMonths(7)Yearspublic static System.DateTime Years { get; }7 years from nowDateTime.UtcNow.AddYears(7)使用示例using Humanizer; DateTime sevenSecondsLater In.Seven.Seconds; // ≈ UtcNow 7 秒 DateTime sevenDaysLater In.Seven.Days; // ≈ UtcNow 7 天 DateTime sevenMonthsLater In.Seven.Months; // ≈ UtcNow 7 个日历月 DateTime sevenYearsLater In.Seven.Years; // ≈ UtcNow 7 个日历年理解这些属性需要注意三点基准时刻是DateTime.UtcNow属性在每次访问时基于当前的 UTC 时间重新求值返回值的DateTimeKind为Utc。如果你在同一逻辑中多次访问同一属性可能得到略有差异的结果——需要稳定基准时请改用下文的XxxFrom方法或先缓存一次访问结果。周的单位是7 天从源码可见Weeks实现为AddDays(49)7 周 × 7 天而不是单独的周单位运算这与周没有独立的日历语义有关。月与年是日历单位AddMonths(7)/AddYears(7)按公历日历推进。例如在 2026 年 9 月 27 日访问In.Seven.Months结果约为 2027 年 4 月 27 日若跨月末边界.NET 会按AddMonths的既定规则处理如 1 月 31 日加 1 个月得到 2 月末。七个从指定日期起方法XxxFrom(DateTime)In.Seven还提供 7 个静态方法均接收一个System.DateTime date参数、返回System.DateTime语义为距给定日期 X 个时间单位之后。完整签名与实现如下方法签名文档语义源码实现SecondsFrompublic static System.DateTime SecondsFrom(System.DateTime date)7 seconds from the provided datedate.AddSeconds(7)MinutesFrompublic static System.DateTime MinutesFrom(System.DateTime date)7 minutes from the provided datedate.AddMinutes(7)HoursFrompublic static System.DateTime HoursFrom(System.DateTime date)7 hours from the provided datedate.AddHours(7)DaysFrompublic static System.DateTime DaysFrom(System.DateTime date)7 days from the provided datedate.AddDays(7)WeeksFrompublic static System.DateTime WeeksFrom(System.DateTime date)7 weeks from the provided datedate.AddDays(49)MonthsFrompublic static System.DateTime MonthsFrom(System.DateTime date)7 months from the provided datedate.AddMonths(7)YearsFrompublic static System.DateTime YearsFrom(System.DateTime date)7 years from the provided datedate.AddYears(7)这些方法适合以固定基准计算相对时间结果确定、可复现不依赖访问时刻var start new DateTime(2025, 1, 20, 9, 0, 0, DateTimeKind.Local); DateTime dueDate In.Seven.DaysFrom(start); // 2025-01-27 09:00:00 DateTime reviewDate In.Seven.MonthsFrom(start); // 2025-08-20 09:00:00 DateTime renewalDate In.Seven.YearsFrom(start); // 2032-01-20 09:00:00 DateTime afterSevenWks In.Seven.WeeksFrom(start); // start.AddDays(49)从实现可以推断XxxFrom基于传入的date做AddXxx运算而DateTime.AddXxx系列方法会保留原值的DateTimeKind因此返回值的 Kind 与输入一致传入Utc得到Utc传入Local得到Local这使其在需要与本地时间配合的场景下比从现在起属性更可控。源码与 T4 生成机制In.SomeTimeFrom.ttIn.Seven并非手写代码而是由 T4 文本模板 In.SomeTimeFrom.tt 生成的。模板的核心逻辑如下for (var i 1; i 10; i) { var plural i 1 ? s : ; // 依此类推生成 Second(s)/Minute(s)/Hour(s)/Day(s)/Week(s)/Month(s)/Year(s) public static class # i.ToWords().Dehumanize() # { public static DateTime # second # DateTime.UtcNow.AddSeconds(# i #); public static DateTime # second #From(DateTime date) date.AddSeconds(# i #); // ……其余 6 个单位同理 } }几个值得注意的生成细节循环范围i从 1 到 10正好生成One到Ten十个类类名生成i.ToWords().Dehumanize()把数字转成英文单词再反人文化得到One、Two、……、Ten其中7.ToWords()得到Seven单复数命名i 1 ? s : 决定属性/方法名的复数后缀——所以One类内是单数形式Second、Day、Month见 In.SomeTimeFrom.cs而Seven及Two~Ten类内全部是复数形式Seconds、Days、Months周与月的换算week属性的实现是AddDays(i * 7)month/year则是AddMonths(i)/AddYears(i)。这一设计让 Humanizer 用一份模板批量产出 10 个数量 × 7 个时间单位 × 2 种形式属性/方法的完整 API 面源码与文档保持一致也便于跨版本维护。测试如何验证相对时间语义仓库中的测试对In.Seven乃至整个In家族做了系统性验证GeneratedFluentDateTests.cs 通过反射遍历typeof(In)的所有嵌套类型对从现在起属性在访问前后各取一次DateTime.UtcNow断言返回值落在[Add(before, amount, unit), Add(after, amount, unit)]区间内InRelativeDatePropertiesReturnExpectedUtcOffsets对XxxFrom方法以固定基准new DateTime(2024, 2, 29, 10, 20, 30, DateTimeKind.Utc)调用断言返回值严格等于Add(date, amount, unit)InRelativeDateMethodsReturnExpectedOffsetsFromProvidedDate在 .NET 6 目标下还有InDate系列的DateOnly变体测试InDateRelativeDateOnlyPropertiesReturnExpectedUtcOffsets等对应的DateOnly相对时间类位于 InDate.SomeTimeFrom.cs。InTests.cs 则展示了与日历 API 的组合用法var baseDate On.January.The21st; // 今年 1 月 21 日 var date In.Five.DaysFrom(baseDate); // 1 月 26 日 Assert.Equal(baseDate.AddDays(5), date);把In.Seven换成任意数量类上述测试逻辑同样成立说明这套 API 的语义是被单元测试锁定的实现事实而非文档的随意描述。使用示例与注意事项官方示例场景 Program.cs 展示了相对时间 API 的典型用法其中使用了In.Two.MonthsFrom(startingPoint)。结合In.Seven一个完整的可运行示例using Humanizer; var startingPoint new DateTime(2025, 1, 20, 9, 0, 0); // 从现在起基于 UtcNow访问时求值 Console.WriteLine(In.Seven.Days.ToString(yyyy-MM-dd HH:mm)); // 7 天后 Console.WriteLine(In.Seven.Years.ToString(yyyy-MM-dd HH:mm)); // 7 年后 // 从指定日期起确定性计算 Console.WriteLine(In.Seven.MonthsFrom(startingPoint).ToString(yyyy-MM-dd HH:mm)); // 2025-08-20 09:00 Console.WriteLine(In.Seven.WeeksFrom(startingPoint).ToString(yyyy-MM-dd HH:mm)); // 2025-03-10 09:00实战中建议记住以下边界行为属性依赖访问时刻In.Seven.Days每次求值都以当次UtcNow为基准适合调用即计算的临时场景若需要多个值基于同一时刻优先用XxxFrom(fixedDate)。默认返回 UTC 时刻属性直接来自DateTime.UtcNow展示给用户前可按需ToLocalTime()方法则保留输入值的DateTimeKind。周按7 天换算In.Seven.Weeks/WeeksFrom的实际实现是加 49 天不要预期有独立的周日历逻辑。月/年跨月边界AddMonths/AddYears遵循 .NET 日历规则做定时任务或账单周期计算时应考虑月末日如 31 日的漂移。超出 10 的范围In家族只覆盖 110更大的数量请使用date.AddXxx(n)或 Humanizer 的DateTime扩展如n.Days()、n.Months()或结合In.TheYear(year)、In.JanuaryOf(year)等日历 API 组合表达。延伸阅读API 参考原文Humanizer.In.Seven.md3.0.1 文档快照当前版本对应文档见 Humanizer.In.Seven.md源码实现In.SomeTimeFrom.csSeven类定义、In.SomeTimeFrom.ttT4 生成模板同类 APIIn.Months.cs日历日期、In.csTheYear、InDate.SomeTimeFrom.csDateOnly变体、On.Days.cs指定日测试证据GeneratedFluentDateTests.cs、InTests.cs可运行示例Program.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 In.Seven 类详解以 Fluent API 计算“7 天后/前”的相对日期Humanizer In.Seven 类详解以 Fluent API 计算“7 天后/前”的相对日期 本篇技术指南聚焦 Humanizer 的 FluentD开发工具Humanizer 流式日期 API 详解In.Seven 的 7 个时间单位属性与方法Humanizer 流式日期 API 详解In.Seven 的 7 个时间单位属性与方法 本篇技术指南围绕 Humanizer 流式日期FluentDate开发工具Humanizer 流式日期 API 详解InDate.Two 相对日期计算与源码实现Humanizer 流式日期 API 详解InDate.Two 相对日期计算与源码实现 InDate.Two 是 Humanizer 流式日期FluentD开发工具上一篇Windows 7 SP2终极改造指南5个步骤让经典系统重获新生下一篇Audacity项目在ArchLinux上的构建问题分析与解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表