ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Humanizer 流式日期 API 深度解析:以 In.Six 类为核心掌握相对日期计算

Humanizer 流式日期 API 深度解析:以 In.Six 类为核心掌握相对日期计算 开发工具【免费下载链接】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 是面向 .NET 的字符串、枚举、日期时间等类型的人性化处理库其 FluentDate 命名空间提供了一组「读起来像英语句子」的日期 API。本篇以 API 参考文档中的In.Six类为解剖样本完整讲解它的 7 个静态属性、7 个实例计算方法、UTC 基准语义、以及如何用XxxFrom(date)完成任意基准日期的相对偏移计算并顺带说明 T4 模板如何批量生成 One~Ten 系列类。In.Six 是什么FluentDate 家族中的「相对偏移」入口In.Six是定义在 src/Humanizer/FluentDate/In.SomeTimeFrom.cs 中的静态嵌套类隶属于public partial class Insrc/Humanizer/FluentDate/In.cs。它的定位与In主类提供In.January、In.TheYear(2026)这类「绝对日期」属性不同专司以当前时刻或指定日期为基准的相对时间偏移。从继承关系看In.Six直接继承System.Object是一个不持有任何状态、全部成员为static的门面类facade classpublic static class In.Six其完整 API 面分为两类属性7 个Seconds、Minutes、Hours、Days、Weeks、Months、Years表示「从现在起 6 个单位之后」全部返回System.DateTime方法7 个SecondsFrom(DateTime date)、MinutesFrom(...)、HoursFrom(...)、DaysFrom(...)、WeeksFrom(...)、MonthsFrom(...)、YearsFrom(...)表示「从传入日期起 6 个单位之后」同样返回System.DateTime。属性逐个拆解从现在起 6 个单位之后API 参考文档为每个属性给出了明确语义下面逐一给出签名与实测语义实现见 In.SomeTimeFrom.cs属性参考文档语义实际实现说明Seconds6 seconds from nowDateTime.UtcNow.AddSeconds(6)基准为UTC 当前时刻Minutes6 minutes from nowDateTime.UtcNow.AddMinutes(6)—Hours6 hours from nowDateTime.UtcNow.AddHours(6)—Days6 days from nowDateTime.UtcNow.AddDays(6)—Weeks6 weeks from nowDateTime.UtcNow.AddDays(42)周按 7 天换算即6 * 7Months6 months from nowDateTime.UtcNow.AddMonths(6)遵循 .NET 日历规则跨月边界自动进位Years6 years from nowDateTime.UtcNow.AddYears(6)会正确处理闰年如 2 月 29 日加 1 年落到 2 月 28 日所有属性的返回值类型均为System.DateTime且DateTime.Kind为Utc这是理解其语义的关键——它们不依赖调用线程的本地时区具有可移植性与可测试性。典型用法using Humanizer; // 从现在起 6 天、6 个月、6 年后UTC DateTime inSixDays In.Six.Days; DateTime inSixMonths In.Six.Months; DateTime inSixYears In.Six.Years;方法逐个拆解从任意基准日期起 6 个单位之后当需要以「某个确定的日期」而非「当前时刻」为基准时使用同名XxxFrom(DateTime date)系列方法DateTime deadline new(2026, 3, 1, 9, 0, 0, DateTimeKind.Utc); DateTime inSixHours In.Six.HoursFrom(deadline); // 2026-03-01 15:00:00 UTC DateTime inSixDays In.Six.DaysFrom(deadline); // 2026-03-07 09:00:00 UTC DateTime inSixWeeks In.Six.WeeksFrom(deadline); // 2026-04-12 09:00:00 UTC DateTime inSixMonths In.Six.MonthsFrom(deadline); // 2026-09-01 09:00:00 UTC DateTime inSixYears In.Six.YearsFrom(deadline); // 2032-03-01 09:00:00 UTC实现上每个方法都是在传入的date上调用对应的Add*扩展public static DateTime DaysFrom(DateTime date) date.AddDays(6); public static DateTime WeeksFrom(DateTime date) date.AddDays(42); // 6 周 42 天 public static DateTime MonthsFrom(DateTime date) date.AddMonths(6); public static DateTime YearsFrom(DateTime date) date.AddYears(6);需要注意AddMonths/AddYears由 .NET 的System.DateTime实现跨月末日期时会向下取整例如 8 月 31 日加 6 个月得到次年 2 月 28 日因此「6 个月后」的结果取决于基准日期的具体日期而不是简单地取同一日号。单元测试如何验证这些行为仓库中的测试文件 tests/Humanizer.Tests/FluentDate/InTests.cs 对该系列 API 给出了可复现的断言模式。例如InFiveDays测试[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)——即In.Six.DaysFrom的行为可完全类比推广偏移量由成员类名决定偏移单位由成员名决定。生成测试文件 GeneratedFluentDateTests.cs 中还维护了[Six] 6这样的数字-单词映射表用于批量校验 One~Ten 各成员类。系列成员如何生成T4 模板与源码结构In.Six不是手写的孤例而是与In.One~In.Ten一同由 T4 模板批量生成的。模板文件为 src/Humanizer/FluentDate/In.SomeTimeFrom.tt其核心是一个for (var i 1; i 10; i)循环#for (var i 1; i 10; i){ var plural i 1 ? s : ; var second Second plural; // ... minute / hour / day / week / month / year 同理 # 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.ToWords().Dehumanize()决定即先把数字 1~10 转成英文单词one、two……再由 Humanizer 的Dehumanize转成 PascalCase 类型名One、Two……Six。因此In.Six恰好对应i 6的迭代。全部成员类共享同一套 7 属性 7 方法的对称结构Seconds~Years属性基于DateTime.UtcNowXxxFrom方法基于传入的date唯一差异只是数字 6 与 426 * 7。生成产物 src/Humanizer/FluentDate/In.SomeTimeFrom.cs 共 897 行Six类位于第 454~539 行。对每个属性/方法而言其语义都可以由模板中对应的Add*调用唯一确定这也解释了 API 参考文档中「6 X from now」与「6 X from the provided date」两组文案的整齐来源。配套的 DateOnly 版本InDate.Six仓库还提供了面向 .NET 6 的DateOnly版本——src/Humanizer/FluentDate/InDate.SomeTimeFrom.cs 中的InDate.Six其成员语义与In.Six一一对应但类型为System.DateOnly且没有Seconds/Minutes/Hours三个亚日精度单位因为DateOnly不含时间分量成员签名实现要点DaysDateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddDays(6))WeeksDateOnly内部仍是AddDays(42)MonthsDateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddMonths(6))YearsDateOnlyDateOnly.FromDateTime(DateTime.UtcNow.AddYears(6))XxxFrom方法同时重载了DateOnly与DateTime两种入参后者通过DateOnly.FromDateTime(...)截断时间分量。该类同样由 src/Humanizer/FluentDate/InDate.SomeTimeFrom.tt 模板生成且整段代码被#if NET6_0_OR_GREATER条件编译包裹即只对支持DateOnly的目标框架生效。实战组合把 In.Six 嵌入真实业务场景In.Six的典型价值在于消除魔法数、让时间语义自文档化。以下场景可直接套用1. 令牌过期时间验证码、重置链接通常需要从现在起 6 分钟内有效DateTime expiresAt In.Six.Minutes; // UTC 语义便于存库与跨服务器比较2. 基于指定基线的排期计算例如在某个活动开始日之后第 6 天自动生成提醒DateTime campaignStart new(2026, 5, 1); DateTime reminderAt In.Six.DaysFrom(campaignStart);3. 与 DateHumanize 组合展示得到偏移日期后可用DateHumanizeExtensions如Humanize()将差值渲染成6 days from now这类可读文本形成计算偏移 人性化展示的完整闭环参见 src/Humanizer/DateHumanizeExtensions.cs。4. 测试友好性由于属性基准固定为DateTime.UtcNow测试中如需确定性结果优先使用XxxFrom(baseDate)形态并显式传入基线正如 InTests.cs 中InFiveDays的做法。小结关注点结论类定位In.Six是In的静态嵌套类表示 6 个时间单位后的相对日期属性Seconds~Years共 7 个基准为DateTime.UtcNow返回DateTime方法XxxFrom(DateTime)共 7 个以传入日期为基准周的处理Weeks/WeeksFrom内部按AddDays(42)即 7 天/周换算月/年的处理委托 .NETAddMonths/AddYears跨月末自动向下取整生成方式One~Ten 全部由 In.SomeTimeFrom.tt T4 模板循环生成DateOnly 变体InDate.Six 提供DateOnly版本无亚日单位测试证据InTests.cs 与 GeneratedFluentDateTests.cs至此读者应能① 熟练使用In.Six的 7 属性 7 方法完成相对日期计算② 理解其 UTC 基准与DateOnly变体的差异③ 掌握 T4 模板批量生成 One~Ten 系列类的底层机制进而轻松迁移到In.Five、In.Ten等其他成员类。赞分享开发工具【免费下载链接】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 详解InDate.Two 相对日期计算与源码实现Humanizer 流式日期 API 详解InDate.Two 相对日期计算与源码实现 InDate.Two 是 Humanizer 流式日期FluentD开发工具Humanizer FluentDate 流式日期 API 实战以 InDate.Seven 为例掌握基于 DateOnly 的日期偏移计算Humanizer FluentDate 流式日期 API 实战以 InDate.Seven 为例掌握基于 DateOnly 的日期偏移计算 本篇技术指南围绕开发工具Humanizer 流畅日期 API 深度解析In.Four 相对日期计算的完整使用指南Humanizer 流畅日期 API 深度解析In.Four 相对日期计算的完整使用指南 导读 Humanizer 的 In 类提供了一组面向自然语言思维设计开发工具上一篇Wasp Actions 实战指南用声明式代码实现全栈数据变更下一篇微信聊天记录导出到电脑免费简单十分钟用留痕WeChatMsg存档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表