Humanizer InDate.Ten 详解:用 DateOnly 流式 API 计算 10 天/周/月/年后的日期

发布时间:2026/9/25 2:42:41

Humanizer InDate.Ten 详解:用 DateOnly 流式 API 计算 10 天/周/月/年后的日期 开发工具【免费下载链接】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.Ten是 Humanizer FluentDate流式日期API 中专门封装“以 10 为时间增量”的静态嵌套类它围绕 .NET 6 的System.DateOnly类型提供了一组零配置、强类型、可读性极高的日期偏移工具既支持以当前时刻UTC为基准取“从现在起 10 天后”等属性也支持基于任意基准日期计算偏移的方法。读完本文你将掌握InDate.Ten全部 4 个属性与 8 个方法的签名、语义与返回值理解其底层实现与 T4 代码生成机制并能在真实业务代码中把它与InDate的月份属性、InDate.Five等其他嵌套类组合使用。一、InDate.Ten 是什么FluentDate API 中的“十”号单元Humanizer 的 FluentDate 目录提供了两类日期表达方式一类是“绝对日期”例如InDate.January当年 1 月 1 日、OnDate.April.The21st4 月 21 日另一类是“相对日期偏移”即In、InDate下按 One 到 Ten 组织的嵌套静态类。InDate.Ten属于后者它的定位非常单一把“10 天 / 10 周 / 10 个月 / 10 年”这四种偏移量以可读的静态属性和方法形式暴露出来。public static class InDate.Ten从源码结构看InDate.Ten是public partial class InDateInDate.cs内部的一个public static class嵌套类型整个类只包含静态成员无需实例化不依赖任何外部配置即可直接调用。它继承链上只有System.Object即普通静态类但它真正的价值不在于继承体系而在于把最容易写错、最需要注释的“魔法数字日期偏移”变成了自文档化的 API 调用。需要特别说明的适用前提InDate这一 DateOnly 版本的 FluentDate API 整体以#if NET6_0_OR_GREATER编译指令包裹见 InDate.SomeTimeFrom.cs因为System.DateOnly是 .NET 6 才引入的类型因此只有面向 .NET 6 及以上目标框架的项目才能使用InDate.Ten。如果你的项目运行在 .NET 5 或更早版本上则应改用基于DateTime的In.Ten系列。二、属性成员基于当前 UTC 时刻的“从现在起”偏移InDate.Ten提供 4 个只读静态属性全部以DateTime.UtcNow为基准计算返回System.DateOnly。它们的语义是“从现在起 10 个时间单位后是哪一天”属性说明签名返回值Days10 days from now从现在起 10 天后public static System.DateOnly Days { get; }System.DateOnlyWeeks10 weeks from now从现在起 10 周后public static System.DateOnly Weeks { get; }System.DateOnlyMonths10 months from now从现在起 10 个月后public static System.DateOnly Months { get; }System.DateOnlyYears10 years from now从现在起 10 年后public static System.DateOnly Years { get; }System.DateOnly底层实现与“UTC 基准”语义这四个属性并非黑盒其实现直接写在 InDate.SomeTimeFrom.cs 的Ten类中模式高度统一public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(10)); public static DateOnly Weeks DateOnly.FromDateTime(DateTime.UtcNow.AddDays(70)); public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(10)); public static DateOnly Years DateOnly.FromDateTime(DateTime.UtcNow.AddYears(10));值得注意的实现细节基准统一为 UTC属性基于DateTime.UtcNow而非DateTime.Now从源码看这是有意设计——Days/Weeks/Months/Years全部以DateTime.UtcNow为起点避免因服务器时区不同导致“今天”的判定漂移。测试 GeneratedFluentDateTests.cs 也专门以DateTime.UtcNow为基准做区间断言Assert.InRange(actual, Add(before, amount, unit), Add(after, amount, unit))验证属性返回值落在期望偏移区间内。周的单位换算Weeks不是调用AddWeeksDateOnly/DateTime也没有该方法而是直接换算成天数——10 * 7 70天。这与Days的实现同源。月/年的日历语义AddMonths(10)与AddYears(10)是日历运算会自动处理大小月与闰年。例如在 1 月 31 日调用MonthsFrom得到的是 11 月的月末日期由 .NET 的日历算法决定如 1 月 31 日 10 个月 11 月 30 日。时间分量被丢弃偏移计算完成后通过DateOnly.FromDateTime(...)只保留日期部分时分秒及偏移时刻UTC均不保留所以属性返回的是纯粹“哪一天”的概念。典型用法示例using Humanizer; // 从现在起 10 天后的日期只含日期无时间分量 DateOnly inTenDays InDate.Ten.Days; // 从现在起 10 个月后的日期例如用于订阅续期提醒 DateOnly renewalDate InDate.Ten.Months; // 直接从控制台输出 Console.WriteLine(InDate.Ten.Years); // 例如 2036-09-24依调用时刻而定注意属性是“即时计算”的每次访问都会重新读取DateTime.UtcNow并重新计算因此同一次运行中两次读取属性若恰逢午夜切换返回值可能差一天若你需要在同一基准下取多个偏移建议先固定一个基准日期再使用方法成员见下一节。三、方法成员基于指定基准日期的偏移计算InDate.Ten的 8 个方法分为两组对System.DateOnly基准的 4 个重载、对System.DateTime基准的 4 个重载。它们的语义统一为“距离给定日期 10 个时间单位后的日期”且返回值一律是System.DateOnly即使入参是DateTime也是如此。方法说明签名DaysFrom(DateOnly)10 days from the provided datepublic static System.DateOnly DaysFrom(System.DateOnly date)DaysFrom(DateTime)10 days from the provided datepublic static System.DateOnly DaysFrom(System.DateTime date)WeeksFrom(DateOnly)10 weeks from the provided datepublic static System.DateOnly WeeksFrom(System.DateOnly date)WeeksFrom(DateTime)10 weeks from the provided datepublic static System.DateOnly WeeksFrom(System.DateTime date)MonthsFrom(DateOnly)10 months from the provided datepublic static System.DateOnly MonthsFrom(System.DateOnly date)MonthsFrom(DateTime)10 months from the provided datepublic static System.DateOnly MonthsFrom(System.DateTime date)YearsFrom(DateOnly)10 years from the provided datepublic static System.DateOnly YearsFrom(System.DateOnly date)YearsFrom(DateTime)10 years from the provided datepublic static System.DateOnly YearsFrom(System.DateTime date)两种重载的源码实现差异以DaysFrom为例InDate.SomeTimeFrom.cspublic static DateOnly DaysFrom(DateOnly date) date.AddDays(10); public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(10));DateOnly 重载直接在DateOnly上调用AddDays(10)实现最轻量没有任何类型转换。DateTime 重载先在DateTime上做AddDays(10)偏移此时保留原时间分量再经DateOnly.FromDateTime(...)截断为纯日期。也就是说当你传入带时间的DateTime时返回结果不会保留传入的时分秒只保留日期。WeeksFrom同样换算为天数AddDays(70)MonthsFrom使用AddMonths(10)YearsFrom使用AddYears(10)规律与属性一致。参数注意事项参数date接收System.DateOnly或System.DateTime两种重载可无缝混用——例如从数据库读出的DateTime和业务层新建的DateOnly都能直接传入。日历运算的边界行为由 .NET 运行时决定月末日期 10 个月时返回值会由AddMonths的钳制规则调整到目标月份的有效日期闰年 2 月 29 日 10 年时AddYears会按 .NET 的规则钳制如返回 3 月 1 日或 2 月 28 日取决于具体目标年份。测试 GeneratedFluentDateTests.cs 甚至专门用闰日2024-02-29作为基准来断言From系列方法的偏移结果说明这类边界是 API 语义的一部分。典型用法示例using Humanizer; // 以固定基准计算保证多次取值的基准一致 var baseDate new DateOnly(2026, 9, 24); DateOnly d InDate.Ten.DaysFrom(baseDate); // 2026-10-04 DateOnly w InDate.Ten.WeeksFrom(baseDate); // 2026-12-03 DateOnly m InDate.Ten.MonthsFrom(baseDate); // 2027-07-24 DateOnly y InDate.Ten.YearsFrom(baseDate); // 2036-09-24 // DateTime 入参同样可用返回值仍是 DateOnly var baseDateTime new DateTime(2026, 9, 24, 15, 30, 0, DateTimeKind.Utc); DateOnly result InDate.Ten.DaysFrom(baseDateTime); // 2026-10-04时间分量被丢弃四、从 T4 模板到成品代码InDate.Ten 的生成机制InDate.Ten并不是手工逐个编写的而是由 T4 文本模板驱动生成。模板 InDate.SomeTimeFrom.tt 中的核心循环如下#for (var i 1; i 10; i){ var plural i 1 ? s : ; var day Day plural; var week Week plural; var month Month plural; var year Year plural; # public static class # i.ToWords().Dehumanize() # { public static DateOnly # day # DateOnly.FromDateTime(DateTime.UtcNow.AddDays(# i #)); // ……Weeks/Months/Years 与各类 From 方法同理 } #}#这段模板揭示了三个关键事实One 到 Ten 的十个嵌套类是同一模板的产物循环变量i从 1 遍历到 10每个迭代生成一个以英文单词命名的静态类One、Two……Ten。InDate.Ten对应i 10的迭代。类名来自 Humanizer 自身的能力i.ToWords().Dehumanize()把整数转成英文单词如10 → Ten这恰好演示了 Humanizer 的“吃自己的狗粮”——用库内的数字转单词与反人性化 API 生成自己的代码。单复数命名规则plural i 1 ? s : 决定了成员命名——i 10时生成复数形式的Days、Weeks、Months、Years和DaysFrom、WeeksFrom、MonthsFrom、YearsFrom这与InDate.One的Day、Month等单数命名形成对照见 InDate.SomeTimeFrom.cs。因此本文档中看到的InDate.Ten全部成员其命名、签名和实现模式都严格受控于模板后续若要新增更大的数值如 Eleven、Twenty改模板并重新生成即可这保证了 FluentDate API 全家族的结构一致性。五、测试佐证GeneratedFluentDateTests 如何验证 Ten仓库用反射式测试对生成的 FluentDate API 做全覆盖验证InDate.Ten的成员同样被纳入其中GeneratedFluentDateTests.cs属性测试InDateRelativeDatePropertiesReturnExpectedUtcOffsetsL34-L35遍历InDate下的所有相对日期嵌套类型对每个静态属性在调用前后分别取DateTime.UtcNow断言返回值落在[Add(before), Add(after)]区间内从而验证InDate.Ten.Days等属性确实是“当前 UTC 时刻 对应偏移”。DateOnly/DateTime 方法测试InDateRelativeDateOnlyMethodsReturnExpectedOffsetsFromProvidedDate与InDateRelativeDateTimeMethodsReturnExpectedOffsetsFromProvidedDateTimeL38-L43以固定基准含 2024-02-29 闰日调用From方法并用Assert.Equal精确断言偏移结果覆盖InDate.Ten.DaysFrom、WeeksFrom、MonthsFrom、YearsFrom的全部 8 个重载。数量映射L329-L341RelativeAmounts字典把Ten映射为10测试据此计算期望偏移量与模板中的i 10一致。另外手写的 InDateTests.cs 展示了该类家族的直接使用方式如InDate.Five.DaysFrom(baseDate)InDate.Ten的调用形态与之完全相同可互为参考。六、实战组合把 InDate.Ten 融入日期业务逻辑InDate.Ten单独使用价值有限它的设计意图是与InDate家族的其他成员组合写出可读性极强的日期逻辑using Humanizer; // 场景 1订阅到期提醒 —— 固定基准 多种偏移组合 var signupDate new DateOnly(2026, 9, 24); var trialEnd InDate.Ten.DaysFrom(signupDate); // 试用期10 天后 var planReview InDate.Ten.MonthsFrom(signupDate); // 复查节点10 个月后 // 场景 2与绝对日期 API 组合 —— 从“今年 1 月 1 日”起算 var yearStart InDate.January; // 当年 1 月 1 日 var reportDue InDate.Ten.MonthsFrom(yearStart); // 当年 11 月 1 日 // 场景 3与 OnDate 组合 —— 从“4 月 21 日”起算 10 周 var anchor OnDate.April.The21st; // 当年 4 月 21 日 var milestone InDate.Ten.WeeksFrom(anchor); // 其后第 10 周 // 场景 4与 InDate.Five 等其他增量类对照 var fiveYearsLater InDate.Five.Years; // 从现在起 5 年后 var tenYearsLater InDate.Ten.Years; // 从现在起 10 年后使用时的几条建议固定基准优先需要同一基准下的多个偏移时先取基准如var base InDate.January;再连续调用From方法避免多次访问“now 属性”导致基准漂移。注意返回值类型所有属性与方法都返回DateOnly如果你的下游 API 需要DateTime请自行转换如InDate.Ten.Days.ToDateTime(TimeOnly.MinValue)。框架版本限制InDate.Ten仅在NET6_0_OR_GREATER编译条件下可用.NET 5 及以下请使用基于DateTime的 In.Ten。七、快速参考InDate.Ten成员一览public static命名空间Humanizer属性Days、Weeks、Months、Years基于DateTime.UtcNow返回DateOnly方法DaysFrom、WeeksFrom、MonthsFrom、YearsFrom每种均有DateOnly与DateTime两个重载统一返回DateOnly关联源码与测试实现src/Humanizer/FluentDate/InDate.SomeTimeFrom.cs生成模板src/Humanizer/FluentDate/InDate.SomeTimeFrom.tt容器类src/Humanizer/FluentDate/InDate.cs反射测试tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs直接使用示例tests/Humanizer.Tests/FluentDate/InDateTests.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 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算 本篇技术指南聚焦 Humanizer 流式日期开发工具Humanizer InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期Humanizer InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期 Humanizer 的 FluentD开发工具Humanizer InDate.Six 详解用 DateOnly 流畅表达「六天后 / 六周后 / 六月后 / 六年后」的日期计算Humanizer InDate.Six 详解用 DateOnly 流畅表达「六天后 / 六周后 / 六月后 / 六年后」的日期计算 导读 InDate.Si开发工具上一篇3大痛点突破JeecgBoot模型配置测试效率优化指南下一篇1Panel项目中Nginx反向代理配置解析的优化实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/25 2:37:41

【Dify】数据统计分析可视化应用

数据统计分析是理解与利用数据的基础能力,无论是商业、科研还是日常运营,数据洞察已成为必备技能。通过自动化节点协作和可视化技术,数据分析工作流不仅大大简化了操作流程,还提升了分析效率。 本文介绍一种基于自动化节点的统计分析方法,涵盖数据导入、清洗、特征工程、…

2026/9/25 2:37:41

【Dify】诗句封面生成与语音播报应用

以AI为核心的自动化创作工具已经进入内容生产的各个领域。古诗自动生成、配套视觉封面设计、诗句语音合成等多模态创新,正成为数字内容表达的新方式。 本文介绍一种利用大模型与多种AI工具自动生成古诗、诗句封面与语音播报的完整流程,覆盖主要技术节点及实际操作方法,适合…

2026/9/25 3:42:43

GaN高功率链路中90°H面弯波导损耗优化与工程复盘

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 3:42:43

从建表到避坑:游泳馆管理系统核心设计与实现指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 3:42:43

本地优先与数据可控:高效文档处理与文件管理工具推荐

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/25 3:37:43

嵌入式量产烧录良率排查指南:从接触到电源的全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/25 0:02:35

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:02:35

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:02:35

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑