ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Humanizer `In.Seven` 静态类完全指南:用流式日期 API 表达“从现在起 7 天后“的日期

Humanizer `In.Seven` 静态类完全指南:用流式日期 API 表达“从现在起 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点击查看免费下载In.Seven是 Humanizer FluentDate 系列 API 中负责7 个时间单位语义的静态嵌套类提供In.Seven.Days、In.Seven.Months这类属性以及In.Seven.DaysFrom(date)这类方法让开发者用近乎自然语言的语法表达相对日期计算。阅读本文后你将掌握该类的全部属性与方法签名、其基于 UTC 的实现细节、T4 模板生成机制以及如何结合测试用例验证结果从而在业务代码中安全地使用这类流式日期 API。In.Seven在 FluentDate API 中的定位Humanizer 的 FluentDate 命名空间围绕In、On两个静态类组织了一批可朗读的日期构造 API。其中In类承担两类职责详见 In.cs 与 In.SomeTimeFrom.cs月份工厂In.January、In.MarchOf(2025)等返回指定月份 1 号由 In.Months.tt 生成相对时间工厂In.OneIn.Ten十个嵌套静态类每个类都提供秒、分钟、小时、天、周、月、年七种单位的相对日期计算In.Seven即其中量词为 7的那一个。从 API 文档 Humanizer.In.Seven.md 的定义看In.Seven是一个public static class继承关系为System.Object → Seven。它没有构造函数与实例成员全部成员均为静态属性或静态方法因此可以直接以In.Seven.xxx形式调用无需实例化。属性成员从现在起 N 个时间单位In.Seven提供七个只读属性每个属性表示从当前时刻UTC起向后推移 7 个对应单位的DateTime。完整清单如下属性类型语义实现表达式SecondsDateTime7 秒后DateTime.UtcNow.AddSeconds(7)MinutesDateTime7 分钟后DateTime.UtcNow.AddMinutes(7)HoursDateTime7 小时后DateTime.UtcNow.AddHours(7)DaysDateTime7 天后DateTime.UtcNow.AddDays(7)WeeksDateTime7 周后49 天DateTime.UtcNow.AddDays(49)MonthsDateTime7 个月后DateTime.UtcNow.AddMonths(7)YearsDateTime7 年后DateTime.UtcNow.AddYears(7)这一结构与 In.SomeTimeFrom.cs 中Seven类的实现完全一致属性通过表达式主体expression-bodied直接返回DateTime.UtcNow的加法结果。值得注意的实现细节有两点基准是 UTC 而非本地时间。所有属性都基于DateTime.UtcNow计算这意味着在同一时刻、不同时区的机器上调用In.Seven.Days得到的是同一个 UTC 时间点而不是各机器本地时间各自加 7 天。如果你的业务需要本地时区的 7 天后需要自行转换In.Seven.Days.ToLocalTime()。每次访问都重新求值。由于属性是方法表达式In.Seven.Days在每次读取时都会重新计算DateTime.UtcNow。如果你先取一次、再取一次两次结果会相差若干毫秒而不是相差 7 天。需要固定基准时应先缓存一次调用结果例如var deadline In.Seven.Days; // 只读一次并缓存 Console.WriteLine($7 天后UTC{deadline:yyyy-MM-dd HH:mm:ss});方法成员从指定日期起 N 个时间单位In.Seven还提供七个同名 From后缀的静态方法用于以传入日期为基准的相对计算。它们全部接收一个System.DateTime参数date返回System.DateTime方法签名实现表达式SecondsFromstatic DateTime SecondsFrom(DateTime date)date.AddSeconds(7)MinutesFromstatic DateTime MinutesFrom(DateTime date)date.AddMinutes(7)HoursFromstatic DateTime HoursFrom(DateTime date)date.AddHours(7)DaysFromstatic DateTime DaysFrom(DateTime date)date.AddDays(7)WeeksFromstatic DateTime WeeksFrom(DateTime date)date.AddDays(49)MonthsFromstatic DateTime MonthsFrom(DateTime date)date.AddMonths(7)YearsFromstatic DateTime YearsFrom(DateTime date)date.AddYears(7)这些方法不依赖当前时刻结果完全由入参决定因此具有可预测性与可测试性。典型用法var start new DateTime(2025, 6, 1, 12, 0, 0, DateTimeKind.Utc); var inSevenMonths In.Seven.MonthsFrom(start); // 2026-01-01 12:00:00 UTC var inSevenWeeks In.Seven.WeeksFrom(start); // 2025-07-20 12:00:00 UTC测试代码 InTests.cs 也展示了这一模式先通过On.January.The21st构造基准日期再调用In.Five.DaysFrom(baseDate)并断言结果等于baseDate.AddDays(5)——同样的断言逻辑对In.Seven的七个From方法完全适用。源码级原理T4 模板如何生成 110 的全部量词In.Seven并非手写代码而是由 T4 文本模板 In.SomeTimeFrom.tt 批量生成。模板核心是一个for (var i 1; i 10; i)循环循环变量i即时间单位数量范围 110通过i.ToWords().Dehumanize()把数字转为单词再反人类化从而得到One、Two、…、Ten的嵌套类名属性/方法名的复数化规则为i 1 ? s : 因此One类里是单数形式Second、Minute见 In.SomeTimeFrom.cs而Seven等 210 的类里统一是复数形式Seconds、Minutes周的换算统一为AddDays(i * 7)所以Seven.Weeks实际是AddDays(49)生成代码后经编译得到最终的In.OneIn.Ten十个公开嵌套类。这意味着文档 Humanizer.In.Seven.md 中列出的 7 个属性与 7 个方法只是这套生成体系在量词 7上的实例如果你理解了Seven那么In.Five、In.Ten等其余九个类的成员形态完全同构。面向 .NET 6 的DateOnly变体InDate.Seven从源码结构看InDate.SomeTimeFrom.cs 提供了仅针对DateOnly的同构 API文件以#if NET6_0_OR_GREATER编译即只在 .NET 6 及以上目标框架生效。InDate.Seven与In.Seven的区别在于属性返回DateOnly且只覆盖天、周、月、年四种单位DateOnly没有秒、分钟、小时粒度实现上通过DateOnly.FromDateTime(DateTime.UtcNow.AddDays(49))等表达式完成From方法存在两个重载From(DateOnly date)与From(DateTime date)后者先对DateTime做加法再转成DateOnly方便同时兼容两种调用方式。因此如果你的项目面向 .NET 6 且只需要日期而无需时刻可以优先考虑InDate系列例如InDate.Seven.Days表示7 天后的日期。测试验证反射式全量校验保证生成代码正确Humanizer 对这套生成式 API 提供了系统性的测试保障集中在 GeneratedFluentDateTests.csInRelativeDatePropertiesReturnExpectedUtcOffsets通过反射遍历In的所有嵌套量词类型OneTen对每个属性在调用前后分别取DateTime.UtcNow作上下界断言属性返回值落在基准 对应单位数量的合理区间内InRelativeDateMethodsReturnExpectedOffsetsFromProvidedDate以固定日期2024-02-29 10:20:30 UTC为入参逐一断言每个From方法的返回与Add(date, amount, unit)精确相等测试中的RelativeAmounts字典显式登记[Seven] 7GeneratedFluentDateTests.csRelativeDateUnit枚举覆盖Second/Minute/Hour/Day/Week/Month/Year与In.Seven的七个成员一一对应。这套反射测试的意义在于由于In.OneIn.Ten全部由模板生成只要模板改动测试就能自动覆盖全部量词与全部单位In.Seven的正确性也随之得到持续保障。若你想亲手验证可运行dotnet test tests/Humanizer.Tests/Humanizer.Tests.csproj --filter FullyQualifiedName~GeneratedFluentDateTests。实战要点与注意事项语义即文档In.Seven.Days比DateTime.UtcNow.AddDays(7)更接近业务语言的表达适合用在到期时间、任务调度、订阅周期等场景例如var reminderAt In.Seven.DaysFrom(createdAt);。时区约定属性基于 UTC需要本地时间时显式转换避免隐式依赖运行环境时区。一次性求值属性是动态求值表达式多次读取结果不同务必先赋值给局部变量。基准可预测From方法不依赖时钟适合单元测试与可复现计算测试套件也以固定日期做精确断言。范围有限FluentDate 的In系列只覆盖 110 的量词超过 10 时仍使用DateTime.AddDays/AddMonths等原生方法或In.TheYear等工厂见 In.cs。总而言之In.Seven是 Humanizer FluentDate 生成体系中量词 7的标准实现其 7 属性 7 方法的成员形态、UTC 基准与 T4 生成机制构成了理解整套In.OneIn.TenAPI 的钥匙。结合 Humanizer.In.Seven.md 的签名文档与 GeneratedFluentDateTests.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 流式日期 API 详解In.Seven「从现在起 7 天/小时」全接口参考与生成机制Humanizer 流式日期 API 详解In.Seven「从现在起 7 天/小时」全接口参考与生成机制 本篇技术指南以 Humanizer 2.13.14开发工具Humanizer InDate.Three 指南用流式日期 API 计算从现在起 3 天 / 周 / 月 / 年的日期Humanizer InDate.Three 指南用流式日期 API 计算从现在起 3 天 / 周 / 月 / 年的日期 Humanizer 的 InDa开发工具Humanizer OnDate.July以静态属性表达「今年 7 月某一天」的流式日期 API 全解Humanizer OnDate.July以静态属性表达「今年 7 月某一天」的流式日期 API 全解 Humanizer.OnDate.July 是 Hum开发工具上一篇Nuke自定义任务调度实现复杂的图片加载依赖关系下一篇终极指南Amazon Bedrock Workshop开发工具链——SDK与CLI命令行高效使用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表