
开发工具【免费下载链接】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点击查看免费下载In.Ten是 Humanizer 流式日期FluentDate体系中按数值分组的静态类之一它把从现在起 / 从某个给定时刻起10 秒、10 分钟、10 小时、10 天、10 周、10 月、10 年之后这 7 种常见相对时间计算收敛为 7 个属性与 7 个方法的直白调用。读完本文你将掌握In.Ten的完整成员清单、与底层DateTime.UtcNow/DateTime.Add*的对应关系以及它在 T4 模板生成机制中的位置和测试验证方式。一、In.Ten在 Humanizer FluentDate 中的定位Humanizer 的 FluentDate 子模块以自然语言风格的 API 封装日期运算核心入口是In类源码位于 src/Humanizer/FluentDate/In.cs 与 src/Humanizer/FluentDate/In.Months.cs负责两类表达月份锚点In.January、In.AprilOf(2009)等返回指定月份 1 号的DateTime相对偏移In.One.Second、In.Ten.Days等按数值分组的嵌套静态类返回未来时刻。In.Ten正是相对偏移分组中的一员其官方 API 参考文档位于 website/versioned_docs/version-3.0.1/api/Humanizer.In.Ten.md签名如下public static class In.Ten它没有公开构造函数与实例成员所有成员均为static因此可以直接以In.Ten.Days、In.Ten.DaysFrom(date)的形式使用无需任何实例化开销。二、七个从现在起属性以当前 UTC 时间为基准In.Ten提供 7 个只读静态属性语义统一为10 个时间单位之后原文描述为10 days from now、10 hours from now等。它们全部返回System.DateTime属性文档语义实际实现对应 In.SomeTimeFrom.cs 中Ten类In.Ten.Seconds10 seconds from nowDateTime.UtcNow.AddSeconds(10)In.Ten.Minutes10 minutes from nowDateTime.UtcNow.AddMinutes(10)In.Ten.Hours10 hours from nowDateTime.UtcNow.AddHours(10)In.Ten.Days10 days from nowDateTime.UtcNow.AddDays(10)In.Ten.Weeks10 weeks from nowDateTime.UtcNow.AddDays(70)周按 7 天折算In.Ten.Months10 months from nowDateTime.UtcNow.AddMonths(10)In.Ten.Years10 years from nowDateTime.UtcNow.AddYears(10)这里有一个容易被忽略的关键实现事实now 指的是 UTC 时间而非本地时间。源码中所有属性都基于DateTime.UtcNow计算这意味着返回值的Kind为Utc在跨时区业务如调度、缓存过期、国际化应用中结果稳定可复现如果你需要本地时间语义应改用From系列方法传入本地DateTime或在拿到结果后自行ToLocalTime()。以文档给出的签名为例属性声明的标准形式为public static System.DateTime Days { get; }快速上手示例using Humanizer; // 从现在起 10 天后UTC 时刻 DateTime deadline In.Ten.Days; // 从现在起 10 小时后的到期时间 DateTime tokenExpiry In.Ten.Hours; // 按月 / 年推进适合订阅周期计算 DateTime nextRenewal In.Ten.Months; DateTime anniversary In.Ten.Years;三、七个基于给定日期方法锚定任意起点与属性对应In.Ten还提供 7 个静态方法语义为从传入的日期起推进 10 个时间单位文档描述为10 days from the provided date等。每个方法接受一个System.DateTime参数date并返回一个新的System.DateTime方法参数返回实际实现In.Ten.SecondsFrom(DateTime date)dateSystem.DateTimedate.AddSeconds(10)In.Ten.MinutesFrom(DateTime date)dateSystem.DateTimedate.AddMinutes(10)In.Ten.HoursFrom(DateTime date)dateSystem.DateTimedate.AddHours(10)In.Ten.DaysFrom(DateTime date)dateSystem.DateTimedate.AddDays(10)In.Ten.WeeksFrom(DateTime date)dateSystem.DateTimedate.AddDays(70)In.Ten.MonthsFrom(DateTime date)dateSystem.DateTimedate.AddMonths(10)In.Ten.YearsFrom(DateTime date)dateSystem.DateTimedate.AddYears(10)与属性版本的关键区别是属性以DateTime.UtcNow为基准而From方法完全尊重你传入的日期值包括它的Kind与具体时刻。因此当业务要求相对某个确定的业务日期而非调用时刻计算时应使用From方法例如using Humanizer; // 相对某个固定的业务日期推进 10 天 DateTime orderDate new(2026, 9, 27, 10, 20, 30, DateTimeKind.Utc); DateTime payDeadline In.Ten.DaysFrom(orderDate); // 2026-10-07 10:20:30 UTC // 相对本地时间推进 10 个月 DateTime localStart new(2026, 9, 27); DateTime localEnd In.Ten.MonthsFrom(localStart); // 2027-07-27 // 链式组合多个时间单位 DateTime combined In.Ten.HoursFrom(In.Ten.DaysFrom(orderDate)); // 10 天又 10 小时边界行为说明From系列方法直接委托给 BCL 的DateTime.Add*AddMonths/AddYears遵循 .NET 标准规则如月末钳制等——这些是DateTime本身的行为In.Ten只是薄封装AddDays对月、年边界没有特殊处理按 24 小时逐日推进Weeks固定按 7 天换算AddDays(70)不随历法或月份长度变化。四、源码级剖析T4 模板驱动的代码生成In.Ten的 14 个成员并非手工逐条编写而是由 T4 文本模板批量生成的。模板位于 src/Humanizer/FluentDate/In.SomeTimeFrom.tt其核心是一个for循环for (var i 1; i 10; i) { var plural i 1 ? s : ; var second Second plural; // ... 依次生成 Minute/Minutes、Hour/Hours、Day/Days、Week/Weeks、Month/Months、Year/Years每次迭代生成一个嵌套静态类类名由i.ToWords().Dehumanize()产生1 → One、10 → Ten类内固定输出 7 个属性与 7 个方法。这一机制解释了两个可以从生成代码中观察到的细节命名规律In.One内是单数命名Second、Minute、Hour、Day、Week、Month、Year而In.Two到In.Ten全部是复数命名Seconds、Minutes…这正是模板中plural i 1 ? s : 的产物整体结构一致In.One~In.Nine与In.Ten拥有完全相同的 7×2 成员布局仅数值不同参见生成的 src/Humanizer/FluentDate/In.SomeTimeFrom.cs。In类本身被声明为public partial classIn.cs月份 API、相对时间 API 与TheYear辅助方法分别在不同 partial 文件中实现最终编译为同一个类型。对于In.Ten来说成员全部是静态的因而可以像工具类一样直接使用。五、测试验证偏移语义的两种断言方式Humanizer 对 FluentDate 相对时间 API 有专门的自动化测试覆盖可作为行为契约参考tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs 通过反射遍历In的所有数值分组类RelativeAmounts字典中Ten 10分两种方式断言属性在调用前后各取一次DateTime.UtcNow断言返回值落在[调用前 10 单位, 调用后 10 单位]区间内验证从现在起的语义方法以固定的基准日期测试中使用2024-02-29这种闰日能覆盖月份推进的边界调用XxxFrom(date)断言结果严格等于date.AddX(10)验证从给定日期起的语义tests/Humanizer.Tests/FluentDate/InTests.cs 中InFiveDays用例展示了In.Five.DaysFrom(baseDate)与baseDate.AddDays(5)的等价性可作为同类方法包括In.Ten.DaysFrom的行为范本。这意味着In.Ten.DaysFrom(date) date.AddDays(10)是经过测试保证的契约你完全可以放心地把In.Ten当作可读性更好的Add*别名来使用。六、与相邻 API 的协作与选型建议In.Ten不是孤立的它与 FluentDate 家族的其他入口共同构成完整的日期表达体系In.One~In.Nine与In.Ten结构完全一致的同族类覆盖 19 各数值In.SomeTimeFrom.cs适合任意整数偏移需求In.January、In.AprilOf(2009)、In.TheYear(2009)月份与年份锚点返回当月 1 号源码见 In.Months.csAPI 参考见 Humanizer.In.mdInDateDateOnly变体需要不含时刻的日期时使用参考 Humanizer.InDate.mdOn/OnDate用于表达某月某日如On.January.The21st常与In配合做从某天起 N 单位后的链式计算。选型小结场景推荐写法取当前时刻 10 单位UTC 基准In.Ten.Days/In.Ten.Hours等属性取给定时刻 10 单位In.Ten.DaysFrom(date)等方法需要本地时间语义用From方法传入本地时间或对属性结果做ToLocalTime()需要任意数值如 11、100直接用date.AddDays(11)或自行组合In.Ten.DaysFrom(In.One.DayFrom(date))式链式调用七、注意事项总结UTC 语义In.Ten.*属性基于DateTime.UtcNow与直觉上的本地时间不同跨时区场景务必注意返回值不可变所有成员返回新的DateTime值不影响传入参数或任何共享状态薄封装定位In.Ten不引入自定义日期算法全部委托 BCL 的Add*方法行为可预测版本范围本文以仓库当前源码与 3.0.1 版 API 文档为准Humanizer.In.Ten.md更早版本如 2.x的 FluentDate API 形态可查阅 website/versioned_docs 下对应版本目录。In.Ten用 14 个静态成员把10 个时间单位后的时刻这个高频需求固化成了自然语言般的 API配合 T4 生成保证的一致性、测试锁定的偏移契约是 FluentDate 体系中数值型相对日期表达的标准范式之一。赞分享开发工具【免费下载链接】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.Ten 流式日期 API 详解用自然语言表达“从现在起 10 天/月/年”Humanizer 的 In.Ten 流式日期 API 详解用自然语言表达“从现在起 10 天/月/年” 本篇技术指南围绕 Humanizer 的 In.Te开发工具Humanizer FluentDate 之 In.Ten用一行代码表达“从现在起 10 个时间单位之后”Humanizer FluentDate 之 In.Ten用一行代码表达“从现在起 10 个时间单位之后” 本篇技术指南以 Humanizer 的 API 参开发工具Humanizer 流畅日期 API 实战In.Five 类与从现在起 5 个时间单位的声明式时间表达Humanizer 流畅日期 API 实战In.Five 类与从现在起 5 个时间单位的声明式时间表达 Humanizer 的 FluentDate 模块开发工具上一篇终极解决方案Windows桌面切换器10大痛点一站式解决下一篇STOMP协议在Android上的实现创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考