尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Humanizer InDate.Six 详解:用流式 API 计算 6 天/6 周/6 月/6 年后的日期
开发工具【免费下载链接】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 2.14.1 文档中的InDate.Six类展开讲解如何用一行静态属性或方法直接拿到“6 天后”“6 周后”“6 个月后”“6 年后”的DateOnly日期。读完本文你将掌握 Humanizer FluentDate 相对日期 API 的属性/方法语义、DateOnly与DateTime两种重载的取舍、其 T4 模板生成机制与测试验证方式并能在 .NET 6 项目中直接落地使用。InDate.Six 是什么FluentDate 相对日期体系中的一员Humanizer 的 FluentDate 模块把未来某个日期的表述压缩成了类名与成员名本身。它围绕四个根类型展开In返回DateTime的“未来相对时间/月份”APIOn基于DateTime的“某月某日”APIInDate返回DateOnly的“未来相对日期/月份”API即本文主角OnDate基于DateOnly的“某月某日”API。InDate是一个用partial拆分的类src/Humanizer/FluentDate/InDate.cs内部嵌入了One到Ten十个静态嵌套类分别对应数量 1 到 10。InDate.Six就是其中数量为 6 的那一个文档 website/versioned_docs/version-2.14.1/api/Humanizer.InDate.Six.md 显示它继承自System.Object是一个public static class全部成员均为public static无需实例化即可调用。注意整个InDate系列包括InDate.Six在源码中被#if NET6_0_OR_GREATER条件编译保护见 src/Humanizer/FluentDate/InDate.SomeTimeFrom.cs因为DateOnly是 .NET 6 引入的类型。低于 .NET 6 的目标框架中不存在这套 API。四个核心属性从“现在”起算的相对日期InDate.Six提供了 4 个静态属性语义都是“从现在起 N 个单位后的日期”返回值统一为System.DateOnly属性说明签名Days6 天后的日期public static System.DateOnly Days { get; }Weeks6 周后的日期public static System.DateOnly Weeks { get; }Months6 个月后的日期public static System.DateOnly Months { get; }Years6 年后的日期public static System.DateOnly Years { get; }对应源码位于 src/Humanizer/FluentDate/InDate.SomeTimeFrom.cs 的Six类中实现方式高度一致例如public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(6)); public static DateOnly Weeks DateOnly.FromDateTime(DateTime.UtcNow.AddDays(42)); // 6 * 7 public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(6)); public static DateOnly Years DateOnly.FromDateTime(DateTime.UtcNow.AddYears(6));有三个容易被忽略的实现细节值得注意基准时间永远是 UTC属性基于DateTime.UtcNow而非DateTime.Now计算然后通过DateOnly.FromDateTime截掉时间部分只保留年月日。因此“6 天后”不会受本地时区设置影响测试可复现性更好。周是天的整数倍Weeks没有独立的周类型概念直接等价于AddDays(42)6 周 × 7 天。月/年遵循 .NET 日历算法AddMonths(6)、AddYears(6)由DateOnly自身处理大小月与闰年例如 8 月 31 日加 6 个月会得到次年 2 月的月末28/29 日而不是抛异常。八个 From 方法从指定日期起算如果不想基于“现在”而是基于某个确定的基准日期InDate.Six还提供了 4 组共 8 个静态方法每个单位都有DateOnly与DateTime两种参数重载方法参数类型返回类型DaysFrom(DateOnly date)DateOnlyDateOnlyDaysFrom(DateTime date)DateTimeDateOnlyWeeksFrom(DateOnly date)DateOnlyDateOnlyWeeksFrom(DateTime date)DateTimeDateOnlyMonthsFrom(DateOnly date)DateOnlyDateOnlyMonthsFrom(DateTime date)DateTimeDateOnlyYearsFrom(DateOnly date)DateOnlyDateOnlyYearsFrom(DateTime date)DateTimeDateOnly源码实现同样直观src/Humanizer/FluentDate/InDate.SomeTimeFrom.cspublic static DateOnly DaysFrom(DateOnly date) date.AddDays(6); public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(6)); public static DateOnly MonthsFrom(DateOnly date) date.AddMonths(6); public static DateOnly MonthsFrom(DateTime date) DateOnly.FromDateTime(date.AddMonths(6));两组重载的差别在于DateOnly版本直接在纯日期上做加法天然无时间分量DateTime版本则保留输入的时间部分参与运算例如从某天 14:30 起算 6 天最终仍通过DateOnly.FromDateTime统一收敛为纯日期返回。无论入参类型如何所有 From 方法的返回值都固定是DateOnly。源码视角T4 模板生成十个兄弟类InDate.Six不是手写代码而是由 T4 文本模板批量生成的。模板位于 src/Humanizer/FluentDate/InDate.SomeTimeFrom.tt核心逻辑是一个循环#for (var i 1; i 10; i){ var plural i 1 ? s : ; // 单复数处理 var day Day plural; // Day / Days var week Week plural; // Week / Weeks var month Month plural; // Month / Months var year Year plural; // Year / Years # public static class # i.ToWords().Dehumanize() #从中可以确认三个设计约定类名由i.ToWords().Dehumanize()生成数字先转英文单词6→six再反人类化处理six→Six因此得到One、Two……Ten属性名按数量自动单复数数量 1 时是单数Day/Week/Month/Year见InDate.One数量 210 时是复数Days/Weeks/Months/Years与文档中InDate.Six.Days等成员一一对应生成器把#if NET6_0_OR_GREATER条件编译直接写进模板输出因此全部生成代码只对 .NET 6 生效。这也解释了为什么文档目录下会同时存在Humanizer.InDate.One.md到Humanizer.InDate.Ten.md十个几乎同构的 API 页面它们描述的是同一模板产出的十组平行类本文讨论的InDate.Six只是数量为 6 的那一组。测试如何保证这些 API 的正确性仓库对 FluentDate 生成 API 的验证方式是反射遍历测试不针对单个成员写死断言而是枚举所有嵌套类与成员再按类名反推数量、按成员名反推单位统一断言。相关测试在 tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.csInDateRelativeDatePropertiesReturnExpectedUtcOffsets对InDate所有相对日期属性含Six.Days/Weeks/Months/Years取值断言结果落在DateTime.UtcNow加对应数量之后的时间区间内测试第 L34-L35、L99-L115InDateRelativeDateOnlyMethodsReturnExpectedOffsetsFromProvidedDate用固定的基准日期2024-02-29闰日专门检验月/年加法边界调用所有DateOnly参数的重载逐项断言Assert.Equal测试第 L38-L39、L117-L138InDateRelativeDateTimeMethodsReturnExpectedOffsetsFromProvidedDateTime同样的逻辑覆盖所有DateTime参数重载。除此之外tests/Humanizer.Tests/FluentDate/InDateTests.cs 给出了一个非常贴近实际用法的示例用OnDate.January.The21st构造基准日再交给InDate.Five.DaysFrom(baseDate)断言结果等于baseDate.AddDays(5)。把Five换成Six即可得到“6 天后”的等效验证二者行为完全对称。在项目中的完整使用示例引入 Humanizer 命名空间后InDate.Six的用法非常直观using Humanizer; // 属性从现在起算 DateOnly inSixDays InDate.Six.Days; // 今天 6 天 DateOnly inSixWeeks InDate.Six.Weeks; // 今天 42 天 DateOnly inSixMonths InDate.Six.Months; // 今天 6 个月 DateOnly inSixYears InDate.Six.Years; // 今天 6 年 // 方法从指定基准日起算DateOnly 重载 DateOnly baseDate new(2026, 9, 26); DateOnly dueDate InDate.Six.MonthsFrom(baseDate); // 2027-03-26 // 方法从 DateTime 起算结果仍是 DateOnly DateOnly auditDate InDate.Six.YearsFrom(DateTime.UtcNow);典型应用场景包括订阅/会员“6 个月后续期提醒日”计算、合同“6 年后到期日”排期、报表“6 周滚动窗口”起点计算等。由于所有成员都是静态且无副作用可以直接嵌入业务表达式而不需要任何额外配置。与周边 API 的组合使用InDate.Six属于相对日期相对“现在”或相对给定基准日与InDate家族的绝对日期 API 互补InDate的月份属性/方法返回“当前年第 X 月 1 日”或“指定年份的第 X 月 1 日”例如InDate.January、InDate.JuneOf(2030)详见 website/versioned_docs/version-2.14.1/api/Humanizer.InDate.mdInDate.TheYear(int year)返回指定年份的 1 月 1 日实现于 src/Humanizer/FluentDate/InDate.cs兄弟类InDate.One到InDate.Ten提供数量 110 的同一套相对日期 API其中InDate.One使用单数成员名Day、Week、Month、Year需要DateTime形态时可改用In家族的相对时间 API需要“某月某日”时使用OnDate如测试中出现的OnDate.January.The21st。使用注意事项小结目标框架InDate.Six全部成员仅存在于 .NET 6 及更高版本NET6_0_OR_GREATER条件编译旧框架下不可用属性基于 UTCDays/Weeks/Months/Years以DateTime.UtcNow为基准跨时区部署时结果一致若业务要求本地日界线语义请自行基于本地时间计算返回值恒为 DateOnly即使传入DateTime重载结果也会截断时间分量周的天数换算Weeks固定按 7 天/周换算6 周 42 天不涉及“周起始日”概念月/年边界加月/加年的月末归整由 .NETDateOnly实现保证闰年场景如 2024-02-29 加 6 年行为与AddYears一致可直接依赖测试 tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs 作为行为基准。如果只需要“6 天/周/月/年后”这类常见期限InDate.Six是比手写DateTime.UtcNow.AddX()更富表达力的选择成员名即文档返回类型即约束无需注释即可自解释。赞分享开发工具【免费下载链接】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 FluentDate 指南使用 InDate.Six 编写 6 天/周/月/年后日期计算Humanizer FluentDate 指南使用 InDate.Six 编写 6 天/周/月/年后日期计算 本篇技术指南围绕 Humanizer 的 InD开发工具Humanizer InDate.Ten 详解用 DateOnly 流式 API 计算 10 天/周/月/年后的日期Humanizer InDate.Ten 详解用 DateOnly 流式 API 计算 10 天/周/月/年后的日期 InDate.Ten 是 Humaniz开发工具Humanizer InDate.Nine 详解用流式日期 API 计算 9 天/周/月/年后的 DateOnlyHumanizer InDate.Nine 详解用流式日期 API 计算 9 天/周/月/年后的 DateOnly Humanizer 的 FluentDat开发工具上一篇如何在Windows上轻松安装draw.io桌面版终极离线绘图解决方案下一篇Font Awesome 7终极指南互联网图标库的完整使用手册创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

不用再交 Wand 专业版年费:用 Wand-Enhancer 一次本地补丁解锁 Pro 功能

不用再交 Wand 专业版年费:用 Wand-Enhancer 一次本地补丁解锁 Pro 功能

不用再交 Wand 专业版年费:用 Wand-Enhancer 一次本地补丁解锁 Pro 功能 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 如果 Wand 专业…

📅 2026/9/27 9:14:32
正则如何驱动索引查询?深入剖析tgrep的QueryPlan分解与Bloom过滤技巧

正则如何驱动索引查询?深入剖析tgrep的QueryPlan分解与Bloom过滤技巧

正则如何驱动索引查询?深入剖析tgrep的QueryPlan分解与Bloom过滤技巧 【免费下载链接】tgrep Trigram-indexed grep with a client/server architecture for fast regex search in large codebases locally 项目地址: https://gitcode.com/gh_mirrors/tg/tgrep …

📅 2026/9/27 9:09:32
制作网站难不难?被黑挂马后看这份建站报价避坑指南

制作网站难不难?被黑挂马后看这份建站报价避坑指南

制作网站难不难?被黑挂马后看这份建站报价避坑指南 昨天凌晨三点,我被一个客户的电话吵醒,声音都在抖:“网站打不开了,浏览器弹出黄色警告,说被植入了非法链接,客户投诉都打爆了!” 那一刻,我看着他屏幕上密密麻麻的报错日志,心里只有两个字:…

📅 2026/9/27 9:09:32
MORE NEWS

更多资讯

📰

Sphinx 扩展开发 How-to 指南:依赖其他扩展与通过入口点注册 Builder

文档开发工具 【免费下载链接】sphinx The Sphinx documentation generator 项目地址: https://gitcode.com/gh_mirrors/sp/sphinx 点击查看 免费下载 本文是 Sphinx 官方开发者文档 doc/development/howtos/index.rst 的深度解读,聚焦于扩展开发者最常…

📰

佛山营销型网站搭建:0代码新手用免费工具搞定

佛山营销型网站搭建:0代码新手用免费工具搞定 想做个网站,打开浏览器搜“佛山营销型网站搭建”,结果全是报价单和“专业团队”?别急,很多老板或运营负责人其实心里没底: 自己不会代码想做网站 ,但找外包又怕被坑,自己搞又不知从何下手。…

📰

2026最新佛山品牌网站建设避坑指南,告别无流量

2026最新佛山品牌网站建设避坑指南,告别无流量 网站做好了没人访问,这大概是佛山无数企业主最崩溃的时刻。花了十几万甚至几十万,请了看似专业的团队,上线后打开率惨淡,后台数据像死水一样平静。别急,问题往往不出在代码多华丽,而出在最底层的“地…

📰

防止网站扫描完整流程:告别拖沓,3步搞定

防止网站扫描完整流程:告别拖沓,3步搞定 改个需求建站公司拖一周,这种经历是不是让你血压飙升?更可怕的是,网站刚上线没两天,后台日志里全是密密麻麻的报错和异常请求。这时候你才意识到,光把页面搭起来是远远不够的, 防止网站扫描…

📰

企业信息门户网站建设避坑指南:5步拆解对比评测逻辑

企业信息门户网站建设避坑指南:5步拆解对比评测逻辑 改个需求建站公司拖一周,这行话是不是戳中了你的肺管子?很多老板觉得企业信息门户网站建设就是找个页面好看点,结果上线后改个栏目名、换个Logo都要排期,急得想砸键盘。别慌,今天咱们不聊虚的,…

📰

从结构体到对象:正式学习C++类的骨架、封装与this指针

文章目录1. C在C后的延伸2. 类的基本骨架:成员、类域和定义位置2. 类定义中放什么2.2 类内定义与类外定义2.3 class 和 struct 的差别3. 访问限定符:封装不是仅仅把数据藏起来3.1 public 和 private3.2 protected 先知晓边界即可4. 对象大小:…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬