拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Humanizer In.Eight API 详解:计算“8 个时间单位之后”的 Fluent Date 接口

开发工具【免费下载链接】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.Eight静态类展开完整梳理其 7 个“从当前时刻起 8 个时间单位”的属性与 7 个“从指定日期起 8 个时间单位”的方法并结合src/Humanizer/FluentDate下的源码实现与 T4 生成模板说明各成员的底层计算方式、与In.One至In.Ten系列的关系以及使用时需要注意的时间基线与月末边界行为。读完后你应能正确调用In.Eight.Days、In.Eight.MonthsFrom(date)等成员并理解其返回值的时间基UTC与日历运算细节。In.Eight 类概览In.Eight是Humanizer.In偏类型类partial class内部的一个公共静态嵌套类声明为public static class In.Eight其继承关系为System.Object→Eight。它属于 Humanizer 的 FluentDate流式日期构造API 家族In类下按数字组织了One到Ten共 10 个嵌套类每个类回答同一类问题——“从现在或某个基准日期起N 个时间单位之后是什么时刻”。In.Eight即固定数字 8 的那一组。该类的全部源码位于 In.SomeTimeFrom.csEight类定义在第 632 行起它与外层的月份/年份 API 共同组成Humanizer.In的完整 API 面父类的概览可参考版本化文档 Humanizer.In 参考。In.Eight提供的成员分两类类别成员语义属性Days、Hours、Minutes、Months、Seconds、Weeks、Years从“现在”起 8 个对应时间单位之后的DateTime方法DaysFrom(DateTime)、HoursFrom(DateTime)、MinutesFrom(DateTime)、MonthsFrom(DateTime)、SecondsFrom(DateTime)、WeeksFrom(DateTime)、YearsFrom(DateTime)从传入的date起 8 个对应时间单位之后的DateTime所有成员均返回System.DateTime。属性从当前时刻起 8 个时间单位以下 7 个属性均为只读的静态属性语义与 API 参考中的注释一一对应属性文档注释语义签名Days8 days from now当前时刻起 8 天后public static System.DateTime Days { get; }Hours8 hours from now当前时刻起 8 小时后public static System.DateTime Hours { get; }Minutes8 minutes from now当前时刻起 8 分钟后public static System.DateTime Minutes { get; }Months8 months from now当前时刻起 8 个月后public static System.DateTime Months { get; }Seconds8 seconds from now当前时刻起 8 秒后public static System.DateTime Seconds { get; }Weeks8 weeks from now当前时刻起 8 周后public static System.DateTime Weeks { get; }Years8 years from now当前时刻起 8 年后public static System.DateTime Years { get; }从 In.SomeTimeFrom.cs 的实现看这些属性并非简单的DateTime.Now偏移而是全部以UTC 时间为基线计算public static DateTime Seconds DateTime.UtcNow.AddSeconds(8); public static DateTime Weeks DateTime.UtcNow.AddDays(56); // 8 * 7 天 public static DateTime Months DateTime.UtcNow.AddMonths(8);这带来两点实践含义返回值的Kind为Utc。属性在读取的瞬间采样DateTime.UtcNow再做加法因此In.Eight.Days的结果是一个 UTC 时刻若后续要展示为本地时间需自行转换例如经.ToLocalTime()或 Humanizer 的日期人性化 API。“现在”是调用时求值。属性是表达式体每次访问都会重新读取当前时刻而非类加载时的固定值。方法从指定日期起 8 个时间单位*From方法与对应属性的差异仅在于基准点不再使用“当前时刻”而是以参数date为起点。完整签名为public static System.DateTime DaysFrom(System.DateTime date); // 8 days from the provided date public static System.DateTime HoursFrom(System.DateTime date); // 8 hours from the provided date public static System.DateTime MinutesFrom(System.DateTime date); // 8 minutes from the provided date public static System.DateTime MonthsFrom(System.DateTime date); // 8 months from the provided date public static System.DateTime SecondsFrom(System.DateTime date); // 8 seconds from the provided date public static System.DateTime WeeksFrom(System.DateTime date); // 8 weeks from the provided date public static System.DateTime YearsFrom(System.DateTime date); // 8 years from the provided date每个方法都只有一个参数dateSystem.DateTime返回System.DateTime。其实现是对date直接调用 .NET 的DateTime增量方法见 In.SomeTimeFrom.cspublic static DateTime SecondsFrom(DateTime date) date.AddSeconds(8); public static DateTime MinutesFrom(DateTime date) date.AddMinutes(8); public static DateTime HoursFrom(DateTime date) date.AddHours(8); public static DateTime DaysFrom(DateTime date) date.AddDays(8); public static DateTime WeeksFrom(DateTime date) date.AddDays(56); // 8 周固定换算为 56 天 public static DateTime MonthsFrom(DateTime date) date.AddMonths(8); public static DateTime YearsFrom(DateTime date) date.AddYears(8);由于*From方法只是对基准值做纯算术运算结果的Kind属性与传入的date保持一致传入Local得到Local传入Unspecified得到Unspecified这一点与“从 now”属性基于UtcNow的行为形成对比。典型用法示例结合Humanizer.In的其他成员月份属性、TheYear等可以组合出可读性很强的日期计算链例如using Humanizer; // 以固定基准日计算某基准日之后的第 8 周 var baseline new DateTime(2025, 3, 10); var dueDate In.Eight.WeeksFrom(baseline); // 2025-05-0556 天后 // 以“现在”为基准 var meetingUtc In.Eight.Days; // 当前 UTC 时刻 8 天 // 与 On 家族的组合On.January.The21st 之类成员提供基准日 var baseDate On.January.The21st; var target In.Eight.DaysFrom(baseDate);仓库测试 InTests.cs 中有一个同系列的断言模式可直接作为*From方法的验证范式[Fact] public void InFiveDays() { var baseDate On.January.The21st; var date In.Five.DaysFrom(baseDate); Assert.Equal(baseDate.AddDays(5), date); }把其中的In.Five换成In.Eight即可得到对DaysFrom的等价验证断言In.Eight.DaysFrom(baseDate)应等于baseDate.AddDays(8)。实现机制由 T4 模板生成的 One 到 Ten 系列从源码结构看In.Eight并非手写代码而是由 T4 模板批量生成的产物。模板 In.SomeTimeFrom.tt 以for (var i 1; i 10; i)循环为每个数字生成一个嵌套静态类关键生成逻辑为#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 #); ... public static DateTime # week # DateTime.UtcNow.AddDays(# i * 7 #); ...由此可以确认三个事实数字到类名的映射由i.ToWords().Dehumanize()完成即1 → One、8 → Eight、10 → Ten因此In.Eight在Humanizer.In偏类型类中占据数字 8 的位置与其相邻的In.Seven、In.Nine结构完全一致。周的换算统一为i * 7天所以In.Eight.Weeks等价于DateTime.UtcNow.AddDays(56)不经过TimeSpan估算结果是精确的 56 天。数字 1 的成员名使用单数形式。模板中i 1 ? s : 使得In.One的成员是Second、Minute、Hour、Day、Week、Month、Year及其…From方法而In.Eight在内的其余类使用复数成员名。从 In.SomeTimeFrom.cs 可见In.One.Second等定义。如果你在补全或检索 API 时搜In.One.Day而无果原因正在于此。月份与年份成员委托给DateTime.AddMonths/DateTime.AddYears属于日历运算而非固定天数的时间跨度In.Eight.MonthsFrom会按日历月份前进例如 2025-03-31 加 8 个月会被钳制到 2025-11-30这与Weeks固定的 56 天形成语义差异。场景文档 fluent-dates-and-time-spans.mdx 对这一点有概括In.One到In.Ten提供DaysFrom、WeeksFrom、MonthsFrom与YearsFrom月/年形式是“calendar-sized operations rather than estimatedTimeSpanvalues”。与 In 类其余成员的关系In.Eight只是Humanizer.In的一角与之同层的成员还包括月份属性January至December返回当前年份该月 1 日与…Of(year)方法以及In.TheYear(int)定义于 In.csInDate偏类型类DateOnly版本如 InDate.SomeTimeFrom.cs在兼容框架上提供与In对称的DateOnly语义On/OnDate家族用于构造“某月某日”的基准日期常作为*From方法的参数来源测试中的On.January.The21st即此类用法见 OnTests.cs。测试侧除 InTests.cs 外生成代码还有专门的覆盖测试 GeneratedFluentDateTests.cs用于验证 T4 生成结果与手写声明的一致性。使用注意事项与边界行为综合源码实现使用In.Eight时建议关注以下几点时区基线Days、Hours、Minutes、Months、Seconds、Weeks、Years七个属性基于DateTime.UtcNow返回Kind Utc的时刻*From方法则保持入参的Kind。跨时区展示前应显式转换。月末钳制MonthsFrom/YearsFrom依赖DateTime.AddMonths/AddYears的语义当目标月份没有对应日期如 1 月 31 日加 8 个月时.NET 会将日期钳制到目标月末。这是 BCL 行为而非 Humanizer 附加逻辑。周恒等于 7 的倍数WeeksFrom(date)严格等于date.AddDays(56)不受夏令时或日历影响。成员名单复数In.Eight的成员均为复数Seconds、Minutes…唯一的例外是In.One使用单数这是模板生成规则的直接结果见 In.SomeTimeFrom.tt。版本适用性本文所述 API 面与当前仓库源码一致且与版本化 API 文档 Humanizer.In.Eight 参考 完全对应InDate等DateOnly姊妹 API 仅在与DateOnly兼容的框架上可用。小结In.Eight是 Humanizer FluentDate API 中数字 8 的固定偏移量载体7 个属性以当前 UTC 时刻为基线7 个*From方法以任意基准日期为起点覆盖秒、分、时、日、周、月、年七种时间单位。其实现由 T4 模板为One至Ten统一生成周偏移固定为 7 的倍数月/年偏移为日历运算。理解这些实现细节后你可以放心地将In.Eight.Days、In.Eight.MonthsFrom(date)等成员用于测试基准构造、到期日计算等场景并与On/InDate家族组合使用。赞分享开发工具【免费下载链接】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.Eight 详解用流式 API 表达8 个时间单位之后的日期Humanizer In.Eight 详解用流式 API 表达8 个时间单位之后的日期 导读 Humanizer.In.Eight 是 Humanizer开发工具Humanizer FluentDate API 解析In.Three——用一句3 个时间单位之后完成日期计算Humanizer FluentDate API 解析 In.Three ——用一句3 个时间单位之后完成日期计算 In.Three 是 Humanize开发工具Humanizer 流式日期 API 详解In.Seven 的 7 个时间单位属性与方法Humanizer 流式日期 API 详解In.Seven 的 7 个时间单位属性与方法 本篇技术指南围绕 Humanizer 流式日期FluentDate开发工具上一篇如何彻底清理Mac磁盘空间终极macOS应用卸载工具指南下一篇终极指南用MouseTracks可视化你的操作习惯提升数字生活效率创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门