Humanizer InDate.Nine 全面解析:用 DateOnly 表达 9 天/9 周/9 个月/9 年后的日期
开发工具【免费下载链接】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.Nine是 Humanizer 流畅日期FluentDateAPI 家族中面向数字 9 的嵌套静态类它把9 天后9 周后9 个月后9 年后这类相对日期计算封装成可读的属性与方法并统一返回 .NET 6 的System.DateOnly值类型。本文以 API 参考文档 为主体结合 InDate.SomeTimeFrom.cs 源码实现与 FluentDate 生成机制、测试用例完整覆盖该类的全部 4 个属性与 8 个方法并深入讲解其基于UtcNow、AddDays/AddMonths/AddYears的底层语义帮助你写出既可读又具备确定性边界约束的日期计算代码。一、InDate.Nine 是什么InDate.Nine是 Humanizer 中InDate类的一个嵌套静态类位于Humanizer命名空间下专门提供与数字9相关的相对日期访问入口。它的声明如下public static class InDate.Nine从继承关系看它继承自System.Object。需要强调的是InDate本身是一个public partial class见 InDate.cs其成员由多个文件共同构成月份工厂January、February……December与JanuaryOf(year)等InDate.Months.cs年份入口TheYear(int year)InDate.cs相对日期数值入口OneTen十个嵌套静态类Nine即其中之一InDate.SomeTimeFrom.cs。与返回DateTime的In.Nine见 In.SomeTimeFrom.cs不同InDate.Nine的全部成员都以DateOnly为返回值——这是 .NET 6 起引入的、不含时间部分的纯日期类型适用于只看日期不看时间的业务场景。因此整个InDate类族都用#if NET6_0_OR_GREATER条件编译保护仅在 .NET 6 及以上目标框架可用。二、成员总览4 个属性 8 个方法InDate.Nine的全部公开成员可归纳为下表成员类别名称签名含义属性Daysstatic DateOnly Days { get; }从现在起 9 天后的日期属性Weeksstatic DateOnly Weeks { get; }从现在起 9 周后的日期属性Monthsstatic DateOnly Months { get; }从现在起 9 个月后的日期属性Yearsstatic DateOnly Years { get; }从现在起 9 年后的日期方法DaysFrom(DateOnly date)static DateOnly DaysFrom(DateOnly date)指定日期起 9 天后方法DaysFrom(DateTime date)static DateOnly DaysFrom(DateTime date)指定日期时间起 9 天后方法WeeksFrom(DateOnly date)static DateOnly WeeksFrom(DateOnly date)指定日期起 9 周后方法WeeksFrom(DateTime date)static DateOnly WeeksFrom(DateTime date)指定日期时间起 9 周后方法MonthsFrom(DateOnly date)static DateOnly MonthsFrom(DateOnly date)指定日期起 9 个月后方法MonthsFrom(DateTime date)static DateOnly MonthsFrom(DateTime date)指定日期时间起 9 个月后方法YearsFrom(DateOnly date)static DateOnly YearsFrom(DateOnly date)指定日期起 9 年后方法YearsFrom(DateTime date)static DateOnly YearsFrom(DateTime date)指定日期时间起 9 年后两类成员的定位非常清晰属性无参以现在为基准回答9 个时间单位之后是哪一天方法带参以调用者提供的日期为基准回答从某一天起再过 9 个时间单位是哪一天且每种单位都提供DateOnly与DateTime两个重载。三、属性详解基于 UtcNow 的9 个时间单位之后四个属性在 InDate.SomeTimeFrom.cs 中逐一实现核心模式是先以DateTime.UtcNow计算偏移再通过DateOnly.FromDateTime截取日期部分。以Days与Months为例public static DateOnly Days DateOnly.FromDateTime(DateTime.UtcNow.AddDays(9)); public static DateOnly Months DateOnly.FromDateTime(DateTime.UtcNow.AddMonths(9));结合源码可以提炼出三条重要实现事实基准是DateTime.UtcNow而非本地时间。四个属性全部基于 UTC 时钟计算因此9 天后实际上是UTC 当前时刻 9 天。这与 fluent-dates-and-time-spans.mdx 场景指南中的提醒一致不带From/Of(year)的属性都会读取当前时钟在要求可重复结果的确定性代码中应谨慎使用。周以 7 天换算。Weeks的实现是DateTime.UtcNow.AddDays(63)9 * 7与In.Nine.Weeks的DateTime.UtcNow.AddDays(63)完全对应——周被定义为固定 7 天属于固定时长语义。月份与年份走日历算法。Months调用AddMonths(9)、Years调用AddYears(9)它们继承 .NET 日历归一化规则详见第五节是按日历计算而非按天数估算。返回类型统一为DateOnly意味着属性天然丢弃了时分秒部分——例如 2026-09-23 07:54 UTC 时刻下调用InDate.Nine.Days得到的是 2026-10-02 这一天的日期。四、方法详解从指定日期出发的确定性计算八个*From方法都以入参日期为起点不依赖系统时钟因此结果完全可预测、可测试。每个时间单位都有DateOnly与DateTime两个重载二者的实现策略略有差异。4.1 DateOnly 重载直接调用 Add 系列扩展以DaysFrom与YearsFrom为例源码 InDate.SomeTimeFrom.cspublic static DateOnly DaysFrom(DateOnly date) date.AddDays(9); public static DateOnly YearsFrom(DateOnly date) date.AddYears(9);DateOnly在 .NET 6 原生提供AddDays、AddMonths、AddYears方法因此这里直接委托给 BCL 即可无需任何转换。4.2 DateTime 重载先偏移、再转换当入参是DateTime时实现多一步DateOnly.FromDateTime转换public static DateOnly DaysFrom(DateTime date) DateOnly.FromDateTime(date.AddDays(9)); public static DateOnly YearsFrom(DateTime date) DateOnly.FromDateTime(date.AddYears(9));这保证了两个重载返回类型一致DateOnly调用方无需关心入参究竟传的是纯日期还是带时间的时刻。4.3 各方法的偏移量速查方法底层实现偏移量DaysFrom(DateOnly/DateTime)AddDays(9)9 天WeeksFrom(DateOnly/DateTime)AddDays(63)63 天9 周 × 7 天MonthsFrom(DateOnly/DateTime)AddMonths(9)日历 9 个月YearsFrom(DateOnly/DateTime)AddYears(9)日历 9 年五、源码级原理T4 模板如何生成 NineInDate.Nine并非手写代码而是由 T4 文本模板 InDate.SomeTimeFrom.tt 在构建时批量生成的。模板核心是一个从 1 到 10 的循环#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 #)); // ... 其余成员 } #}#这段模板揭示了三个设计细节类名由i.ToWords().Dehumanize()派生9.ToWords()得到英文单词 nine再经Dehumanize()规范化为 PascalCase 的Nine。这就是OneTen十个嵌套类命名的来源也解释了为何类名是英文单词而非数字。成员名由单复数规则派生i 1时生成Day、Week、Month、Year单数形式i 1时追加s得到Days、Weeks、Months、YearsFrom方法同理如DaysFrom。周统一以i * 7天表达模板中Weeks的实现是AddDays(i * 7)i 9即 63 天。同族的 DateTime 版本In.Nine由 In.SomeTimeFrom.tt 生成且额外包含Seconds、Minutes、Hours三个更细粒度单位见 In.SomeTimeFrom.cs而InDate.Nine只保留日期粒度的 Day/Week/Month/Year符合DateOnly不含时间成分的定位。六、InDate.Nine 与 In.Nine 的对照同一个数字 9Humanizer 提供了两套面向不同返回类型的入口对照如下维度InDate.NineIn.Nine返回类型DateOnly纯日期DateTime含时间可用框架.NET 6#if NET6_0_OR_GREATER全框架成员数量4 属性 8 方法7 属性 14 方法含秒/分/时时间单位Day / Week / Month / YearSecond / Minute / Hour / Day / Week / Month / Year相对属性基准DateTime.UtcNowDateTime.UtcNow选择建议只关心哪一天时用InDate.Nine例如排期、到期日、节假日计算需要保留时刻信息时用In.Nine例如9 天后的下午 3 点整。七、测试如何验证 Nine 的正确性仓库的 FluentDate 测试对生成类族做了系统性验证可作为理解InDate.Nine行为的依据GeneratedFluentDateTests.cs 中维护了一张RelativeAmounts映射表[Nine] 9并通过反射遍历InDate的全部嵌套类型InDateRelativeDatePropertiesReturnExpectedUtcOffsets对每个相对属性在调用前后分别取DateTime.UtcNow断言属性返回值落在[before amount, after amount]区间内验证属性确实以 UTC 时钟为基准InDateRelativeDateOnlyMethodsReturnExpectedOffsetsFromProvidedDate与InDateRelativeDateTimeMethodsReturnExpectedOffsetsFromProvidedDateTime对方法则直接断言date.AddDays(amount)、date.AddMonths(amount)等精确偏移结果InDateMonthPropertiesReturnExpectedDates等用例覆盖InDate的月份工厂。InDateTests.cs 还提供了手写用例例如用OnDate.January.The21st作为基准、断言InDate.Five.DaysFrom(baseDate)等于baseDate.AddDays(5)示范了注入固定起始日期以保证测试可重复的推荐用法——InDate.Nine的*From方法正是这一类确定性计算的入口。八、实战使用与注意事项8.1 基础用法示例using Humanizer; // 属性基于 UTC 当前时刻 DateOnly inNineDays InDate.Nine.Days; // 2026-10-02示例以 2026-09-23 为当前日期 DateOnly inNineWeeks InDate.Nine.Weeks; // 2026-11-25 DateOnly inNineMonths InDate.Nine.Months; // 2027-06-23 DateOnly inNineYears InDate.Nine.Years; // 2035-09-23 // 方法基于注入的起始日期结果确定可测 var start new DateOnly(2026, 2, 20); DateOnly d1 InDate.Nine.DaysFrom(start); // 2026-03-01 DateOnly d2 InDate.Nine.MonthsFrom(start); // 2026-11-20 DateOnly d3 InDate.Nine.YearsFrom(start); // 2035-02-20 // DateTime 重载时刻入参日期出参 var moment new DateTime(2026, 2, 20, 14, 30, 0); DateOnly d4 InDate.Nine.DaysFrom(moment); // 2026-03-01忽略时分秒8.2 三个必须注意的边界行为属性依赖系统时钟不适合确定性代码。Days/Weeks/Months/Years都基于DateTime.UtcNow两次调用之间跨越 UTC 午夜会导致结果不同单元测试或幂等业务中请优先使用*From方法注入固定日期。GeneratedFluentDateTests对属性采用区间断言而非精确断言正是为了容忍这一时钟特性。月/年运算遵循日历归一化。AddMonths/AddYears会把不存在的日期向月末收敛例如从 2028-02-29闰年算InDate.Nine.YearsFrom会得到 2037-02-28 而非 2037-02-29。这是 BCL 的标准行为并非 Humanizer 特有。周是固定 7 天月不是 30 天。Weeks/WeeksFrom本质是AddDays(63)而Months/MonthsFrom是日历月偏移二者不应混用需要精确天数时请用 Days 系列或 NumberToTimeSpanExtensions 的Weeks()扩展构造TimeSpan。8.3 与其他 FluentDate API 协同InDate.Nine可以很方便地与 InDate 的月份工厂如InDate.April、InDate.AprilOf(2025)、TheYear(int)以及 OnDate 的日期构造器组合使用构建出接近自然语言的日期表达式。完整的调用示例可参考场景指南 fluent-dates-and-time-spans.mdx其中特别指出InDate/OnDate是In/On在兼容框架.NET 6上的DateOnly对应实现且月份/年份运算不涉及特定文化的Calendar选择。九、相关 API 与延伸阅读本类 API 参考Humanizer.InDate.Nine.md父类总览Humanizer.InDate.md、DateTime 版同类 Humanizer.In.Nine.md实现源码InDate.SomeTimeFrom.cs、生成模板 InDate.SomeTimeFrom.tt测试用例GeneratedFluentDateTests.cs、InDateTests.cs场景指南fluent-dates-and-time-spans.mdx赞分享开发工具【免费下载链接】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 天/周/月/年后的 DateOnly 日期Humanizer InDate.Four 详解用流式 API 生成4 天/周/月/年后的 DateOnly 日期 Humanizer 的 FluentD开发工具freeCodeCamp 每日编程挑战解析JavaScript 实现 Due Date9 个月后日期计算freeCodeCamp 每日编程挑战解析JavaScript 实现 Due Date9 个月后日期计算 本篇技术指南围绕 freeCodeCamp前端后端教育Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算 本篇技术指南聚焦 Humanizer 流式日期开发工具上一篇网盘直链下载助手完整上手攻略一个油猴脚本解锁六大网盘真实直链下一篇ascend-transformer-boost 训练侧 pad_with_hidden_state 算子参数校验、Shape 推导与 Runner 执行链路解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

gsd-core 配置读取修复解析:`config-get --default true` 如何消除 Nyquist 校验开关的 stderr 噪音与空变量回退

gsd-core 配置读取修复解析:`config-get --default true` 如何消除 Nyquist 校验开关的 stderr 噪音与空变量回退

gsd-core 配置读取修复解析:config-get --default true 如何消除 Nyquist 校验开关的 stderr 噪音与空变量回退 【免费下载链接】gsd-core Git. Ship. Done - Core 项目地址: https://gitcode.com/gh_mirrors/ge/gsd-core 本文以 gsd-core 仓库中归档变更集 .…

2026/9/24 16:59:10 阅读更多 →
Hermes Rust 工作区公共工具 crate:hermes_utils 设计规范与 PointerAddress 实现解析

Hermes Rust 工作区公共工具 crate:hermes_utils 设计规范与 PointerAddress 实现解析

语言运行时编译器移动开发 【免费下载链接】hermes A JavaScript engine optimized for running React Native. 项目地址: https://gitcode.com/gh_mirrors/hermes/hermes 点击查看 免费下载 hermes_utils 是 Hermes 项目 Rust 工作区中一个"兜底型"公共…

2026/9/24 16:59:10 阅读更多 →
The Concise TypeScript Book 精读:函数返回类型推断(Type from Func Return)实战指南

The Concise TypeScript Book 精读:函数返回类型推断(Type from Func Return)实战指南

文档教程 【免费下载链接】typescript-book The Concise TypeScript Book: A Concise Guide to Effective Development in TypeScript. Free and Open Source. 项目地址: https://gitcode.com/gh_mirrors/typ/typescript-book 点击查看 免费下载 本指南聚焦《The C…

2026/9/24 16:59:10 阅读更多 →

最新新闻

Linux与Windows系统运维:参数查询与配置命令对照实战

Linux与Windows系统运维:参数查询与配置命令对照实战

很多时候,我们干的活儿并不是什么高深莫测的架构设计,反而是那些每天都在重复的“查一下参数、改一个配置”。尤其是当你的手头同时管着 Windows 服务器和 Linux 服务器时,这种“精神分裂”的感觉会特别明显:明明在 Windows 上用图…

2026/9/24 18:28:13 阅读更多 →
RabbitMQ安装详解:Windows与Docker高频坑与权限排查

RabbitMQ安装详解:Windows与Docker高频坑与权限排查

先聊点实际的。你点进这篇文章,多半是因为项目里突然要用消息队列,或者面试题刷到“RabbitMQ和Kafka怎么选”,又或者已经在Windows上装了RabbitMQ,结果服务死活起不来,管理界面也打不开。不管你是哪种情况,…

2026/9/24 18:28:13 阅读更多 →
Linux与Windows参数查询与配置:双系统实战速查手册

Linux与Windows参数查询与配置:双系统实战速查手册

1. 项目背景:为什么我要维护一份“Linux与Windows参数查询与配置”手册自从开始同时接触Linux服务器和Windows桌面环境,我就一直被同一个问题反复折磨:某个参数上次明明调通了,下次换台机器又得从头翻文档。更让人崩溃的是&#x…

2026/9/24 18:28:13 阅读更多 →
Flutter状态边界:UI树才是决定setState刷新范围的关键

Flutter状态边界:UI树才是决定setState刷新范围的关键

有人问我一个很经典的问题:setState明明调了,数据也变了,界面就是不动,到底哪里出了问题?我听完他的代码描述,第一反应不是去看状态管理库配没配好,而是反问他一句:你这段状态&#…

2026/9/24 18:28:13 阅读更多 →
基于OpenCV模板匹配的车牌识别毕业设计实战指南

基于OpenCV模板匹配的车牌识别毕业设计实战指南

简介:这是一套基于OpenCV模板匹配的车牌识别毕业设计源码,使用Python 3.8与OpenCV 4.2开发,并配有简单的GUI界面。项目面向计算机相关专业的学生或课程设计用户,主要解决从车辆图像中定位车牌、校正倾斜、判别牌照颜色、分割字符并…

2026/9/24 18:28:13 阅读更多 →
【Coze】【视频】治愈系老爷爷工作流

【Coze】【视频】治愈系老爷爷工作流

今天给大家演示一个 老爷爷语录视频自动生成工作流。该工作流通过大语言模型和图像生成模型的协作,自动完成从文本语录生成、格式化处理、配图生成,再到视频合成和音频配乐的完整流程。结合效果展示,用户只需提供简单的输入,就能得到带有温馨画面和背景音乐的成品视频,大幅…

2026/9/24 18:27:12 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →