尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Humanizer InDate.Four 详解:用 DateOnly 流式表达“4 天后 / 4 周后 / 4 月后 / 4 年后”

发布时间:2026/9/29 5:58:16

资讯中心
01
ARTICLE

Humanizer InDate.Four 详解:用 DateOnly 流式表达“4 天后 / 4 周后 / 4 月后 / 4 年后”

Humanizer InDate.Four 详解:用 DateOnly 流式表达“4 天后 / 4 周后 / 4 月后 / 4 年后”
开发工具【免费下载链接】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点击查看免费下载导读InDate.Four是 Humanizer FluentDate 流式日期 API 中的一个静态嵌套类专门面向 .NET 6 引入的System.DateOnly类型提供“从现在起 4 天/4 周/4 个月/4 年”以及“从任意给定日期起 4 天/4 周/4 个月/4 年”的计算能力。阅读本文后你将掌握InDate.Four全部 4 个属性与 8 个方法重载的签名与语义、其背后由 T4 模板生成的源码实现、基于UtcNow与AddMonths/AddYears的日历运算原理以及如何在可重复执行的测试与业务代码中正确使用这类流式日期成员。InDate.Four 是什么API 全景在 Humanizer 3.0.10 的 API 文档中InDate.Four被定义为public static class InDate.Four继承自System.Object是InDate这个静态 partial 类内部按数字分组的嵌套静态类之一。它的职责非常单一把所有与“4”相关的相对日期计算集中在一个命名空间中通过英文数字单词Four直接暴露给调用者。InDate.Four由两类成员组成属性4 个Days、Weeks、Months、Years语义是“从当前时刻算起的相对日期”均返回System.DateOnly方法8 个DaysFrom、WeeksFrom、MonthsFrom、YearsFrom每个都提供DateOnly与DateTime两个输入重载语义是“从指定日期算起的相对日期”返回值统一为System.DateOnly。完整成员签名如下与 Humanizer.InDate.Four.md 文档一致成员签名语义属性public static System.DateOnly Days { get; }从现在起 4 天属性public static System.DateOnly Weeks { get; }从现在起 4 周属性public static System.DateOnly Months { get; }从现在起 4 个月属性public static System.DateOnly Years { get; }从现在起 4 年方法public static System.DateOnly DaysFrom(System.DateOnly date)从给定日期起 4 天方法public static System.DateOnly DaysFrom(System.DateTime date)从给定日期起 4 天方法public static System.DateOnly WeeksFrom(System.DateOnly date)从给定日期起 4 周方法public static System.DateOnly WeeksFrom(System.DateTime date)从给定日期起 4 周方法public static System.DateOnly MonthsFrom(System.DateOnly date)从给定日期起 4 个月方法public static System.DateOnly MonthsFrom(System.DateTime date)从给定日期起 4 个月方法public static System.DateOnly YearsFrom(System.DateOnly date)从给定日期起 4 年方法public static System.DateOnly YearsFrom(System.DateTime date)从给定日期起 4 年属性成员基于 UtcNow 的“从当下算起”四个属性在 InDate.SomeTimeFrom.cs 中的Four类里均有直接对应的实现全部以DateTime.UtcNow为时间基准public static class Four { public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(4)); public static DateOnly Weeks DateOnly.FromDateTime(DateTime.UtcNow.AddDays(28)); public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(4)); public static DateOnly Years DateOnly.FromDateTime(DateTime.UtcNow.AddYears(4)); }几个值得注意的实现细节周按 7 天折算Weeks不是调用AddWeeksDateOnly本身也不提供该方法而是直接AddDays(28)即 4 × 7 天这与人类直觉中的“一周七天”完全一致。UTC 时间基准属性读取的是DateTime.UtcNow而不是DateTime.Now随后通过DateOnly.FromDateTime截断为纯日期不含时间分量。这意味着结果不依赖部署机器的本地时区行为是可预测的。动态求值属性是表达式体expression-bodied的只读属性每次访问都会重新取UtcNow计算而不是在类加载时缓存。因此同一次程序运行中先后两次读取InDate.Four.Days在跨 UTC 午夜边界时可能得到不同的日期。官方场景指南 fluent-dates-and-time-spans.mdx 也明确指出不带From或Of(year)的属性会读取DateTime.Now或UtcNow应避免在确定性代码如测试断言中直接使用——这正是下面要重点介绍*From方法的原因。方法成员从任意基准日期计算四个*From方法提供双重重载分别接收DateOnly与DateTime并把任意输入统一归一化为DateOnly输出// DateOnly 输入直接复用 AddDays/AddMonths/AddYears public static DateOnly DaysFrom(DateOnly date) date.AddDays(4); public static DateOnly WeeksFrom(DateOnly date) date.AddDays(28); public static DateOnly MonthsFrom(DateOnly date) date.AddMonths(4); public static DateOnly YearsFrom(DateOnly date) date.AddYears(4); // DateTime 输入先做日历运算再转 DateOnly public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(4)); public static DateOnly WeeksFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(28)); public static DateOnly MonthsFrom(DateTime date) DateOnly.FromDateTime(date.AddMonths(4)); public static DateOnly YearsFrom(DateTime date) DateOnly.FromDateTime(date.AddYears(4));两个重载的差异在于运算发生的层级传入DateOnly时直接在DateOnly上进行AddDays/AddMonths/AddYears结果天然是DateOnly传入DateTime时先调用DateTime的AddDays/AddMonths/AddYears保留时间分量做进位处理再通过DateOnly.FromDateTime丢弃时间、取出日期部分。这种设计让调用方无论持有哪种日期类型都能以一致的DateOnly结果收尾非常适合需要“只关心日期、不关心时间”的业务场景例如预约、排期、账单周期计算。日历运算的归一化语义MonthsFrom与YearsFrom直接委托给AddMonths/AddYears因此继承 .NET 标准的月末归一化normalization规则当月不存在同一天时结果自动折叠到该月的最后一天。例如从 2 月 29 日闰年加上 4 个月落在 6 月 29 日而如果从某年 1 月 31 日加 1 个月会得到 2 月 28 日平年而非抛异常。官方场景文档 fluent-dates-and-time-spans.mdx 对这一点有明确说明并强调这类运算是日历粒度的操作与把TimeSpan直接累加到日期上的“固定时长估算”有本质区别。源码视角partial class 与 T4 模板生成InDate.Four只是整个 FluentDate 家族的一个切片。从源码结构看InDate是一个跨越多个文件的public partial classInDate.cs提供TheYear(int year)返回指定年份的 1 月 1 日InDate.Months.cs提供January、JanuaryOf(int year)等十二个月份成员由 InDate.Months.tt 生成InDate.SomeTimeFrom.cs包含One到Ten十个嵌套静态类Four是其中之一。One~Ten并非手写而是由 T4 文本模板 InDate.SomeTimeFrom.tt 循环生成的。模板核心逻辑如下摘录#for (var i 1; i 10; i){ var plural i 1 ? s : ; var day Day plural; ... # public static class # i.ToWords().Dehumanize() # { public static DateOnly # day # DateOnly.FromDateTime(DateTime.UtcNow.AddDays(# i #)); ...可以看到三个关键设计命名来自单词转换类名用i.ToWords().Dehumanize()生成——即先经 Humanizer 的数字转单词能力得到four再经 Dehumanize 规范化为 PascalCase 的Four。这正是One~Ten类名统一风格的来源也展示了 Humanizer 自身的扩展方法在项目内部的复用。成员命名遵循单复数i 1时属性名是单数Day/Week/Month/Yeari 1时带复数后缀Days/Weeks/Months/Years见InDate.SomeTimeFrom.cs中One类与Two~Ten类的命名差异。生成的 .cs 与 .tt 一一对应Humanizer.csproj 中配置了TextTemplatingFileGenerator将InDate.SomeTimeFrom.tt与生成的InDate.SomeTimeFrom.cs关联确保仓库中提交的代码与模板保持同步。版本与条件编译为什么只有 .NET 6 可用DateOnly是 .NET 6 新增的类型因此 Humanizer 对整套InDate数字级成员都加了条件编译保护。在 InDate.SomeTimeFrom.cs 与 InDate.Months.cs 的顶部都可以看到#if NET6_0_OR_GREATER namespace Humanizer; ... #endif也就是说只有目标框架满足NET6_0_OR_GREATER时例如net8.0、net10.0、net11.0InDate.Four才会被编译进程序集而在net48、netstandard2.0等旧框架目标下该成员不存在。这一点与 Humanizer.csproj 中声明的多目标框架net11.0;net10.0;net8.0;net48;netstandard2.0是一致的。如果你的项目仍基于旧框架应改用面向DateTime的 In.SomeTimeFrom.csIn.Four.Days、In.Four.MonthsFrom(...)等其成员返回System.DateTime且额外提供了Second、Minute、Hour等更细粒度的单位。实战在可重复测试与业务代码中使用确定性优先总是注入基准日期由于不带From的属性依赖UtcNow在单元测试中直接断言InDate.Four.Days会导致测试结果随时间漂移。正确的做法是用*From方法传入固定基准。仓库自带的测试 InDateTests.cs 展示了这一模式针对Five但Four同理[Fact] public void InFiveDays() { var baseDate OnDate.January.The21st; var date InDate.Five.DaysFrom(baseDate); Assert.Equal(baseDate.AddDays(5), date); }测试先构造固定的DateOnly基准再用被测 API 计算结果并断言保证结果与运行时刻无关。与 In.Two.MonthsFrom 组合的完整示例官方示例 scenarios-fluent-dates/Program.cs 演示了同族 APIIn系列返回DateTime的用法以固定起点2025-01-20 09:00调用In.Two.MonthsFrom(startingPoint)得到2025-03-20 09:00输出见 expected-output.txt。把In换成InDate即可获得同样语义的DateOnly版本using Humanizer; // 业务场景计算 4 个月后的日期纯日期无时间分量 var renewalDate InDate.Four.MonthsFrom(DateOnly.FromDateTime(DateTime.Now)); // 混合输入DateTime 输入也会被归一化为 DateOnly var dueDate InDate.Four.WeeksFrom(new DateTime(2026, 9, 28, 9, 30, 0)); // dueDate 的类型是 DateOnly值为 2026-10-26语义选择建议需要固定时间长度如“恰好 4 个 7 天”时Weeks/Days是确定性的AddDays(28)永远是 28 天需要日历语义如“下个月的同一天”时Months/Years会按AddMonths/AddYears的月末归一化规则折叠极端日期需注意结果可能不是“同一天”需要确定可复现时避免无参属性优先*From(date)注入基准需要纯日期、无时区干扰时优先DateOnly版本的InDate而非DateTime版本的In。延伸阅读InDate 类 API 参考十二个月份、TheYear与One~Ten全量成员In.Four 类 API 参考面向DateTime的同名数字级成员InDate 源码 与 T4 生成模板流式日期与时间跨度场景指南 与 可运行示例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 InDate.Four 详解用流式 API 计算 4 天、4 周、4 月、4 年后的 DateOnly 日期Humanizer InDate.Four 详解用流式 API 计算 4 天、4 周、4 月、4 年后的 DateOnly 日期 InDate.Four 是开发工具Humanizer InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期Humanizer InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期 Humanizer 的 FluentD开发工具Humanizer InDate.Four 使用指南用 DateOnly 快速计算 4 天、4 周、4 个月与 4 年后的日期Humanizer InDate.Four 使用指南用 DateOnly 快速计算 4 天、4 周、4 个月与 4 年后的日期 Humanizer 的 Flu开发工具上一篇VisualCppRedist AIOWindows系统依赖修复的终极魔法棒下一篇如何快速将B站缓存m4s视频转换为通用MP4格式新手完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。