首页/新闻资讯/正文详情

Humanizer FluentDate 之 In.Two:用「2」做自然流畅的日期偏移计算

发布时间:2026/9/25 6:09:25 来源:云帆数科 栏目:资讯中心
Humanizer FluentDate 之 In.Two:用「2」做自然流畅的日期偏移计算
开发工具【免费下载链接】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 API 中In.Two静态类展开它提供「从现在起 2 秒/分钟/小时/天/周/月/年」以及「从指定日期起偏移 2 个时间单位」两类共 14 个成员。读者读完本文将掌握In系列数字类的完整成员清单、底层 T4 模板生成原理、DateTime.UtcNow与AddDays/AddMonths/AddYears的实际调用链以及如何借助仓库测试用例验证行为从而在自己的 .NET 项目中写出可读性更高、且可预测的日期偏移代码。一、FluentDate让日期偏移像说英语一样自然Humanizer 的核心目标是让字符串、枚举、日期、时间、数字与数量的处理更贴近人类语言习惯。FluentDate 是其中的一个子模块它把「两个小时后」「三天后」「两年后」这类自然语言表达直接映射成强类型、可编译、带智能感知的 C# 代码。In是一个public partial class定义于 In.cs它通过多个 partial 声明聚合了一组嵌套静态类In.One到In.Ten十个数字类外加月份类In.January、In.February……以及TheYear(int year)等方法。十个数字类并非手写而是由 T4 文本模板 In.SomeTimeFrom.tt 自动生成源码文件 In.SomeTimeFrom.cs这也解释了为什么One到Ten的结构高度一致——它们本质上是同一套模板循环 10 次的产物。In.Two正是这套模板在i 2时的输出对应「二」这个数量词。其类型定义为public static class Two它直接嵌套在In内部因此完整引用路径是Humanizer.In.TwoIn本身继承自System.ObjectTwo作为嵌套静态类同样如此。由于成员均为public static调用时无需任何实例化或依赖注入在项目里引用Humanizer程序集后即可直接使用。二、In.Two 的七个属性从当前时刻起偏移 2 个单位In.Two提供 7 个只读属性全部返回System.DateTime语义均为「从现在起 2 个时间单位之后」。下表汇总了文档 Humanizer.In.Two.md 中声明的完整属性清单属性文档语义返回类型底层实现见 In.SomeTimeFrom.csSeconds2 seconds from now2 秒后System.DateTimeDateTime.UtcNow.AddSeconds(2)Minutes2 minutes from now2 分钟后System.DateTimeDateTime.UtcNow.AddMinutes(2)Hours2 hours from now2 小时后System.DateTimeDateTime.UtcNow.AddHours(2)Days2 days from now2 天后System.DateTimeDateTime.UtcNow.AddDays(2)Weeks2 weeks from now2 周后System.DateTimeDateTime.UtcNow.AddDays(14)Months2 months from now2 个月后System.DateTimeDateTime.UtcNow.AddMonths(2)Years2 years from now2 年后System.DateTimeDateTime.UtcNow.AddYears(2)一个值得注意的实现细节是Weeks模板没有调用AddWeeks.NET 也不存在该方法而是直接等价为AddDays(2 * 7)即AddDays(14)。这与文档中「2 weeks from now」的语义完全一致也意味着周是一个固定的 7 天时长概念不受月份长短或夏令时影响。示例用法using Humanizer; // 从现在起 2 小时后 DateTime reminderTime In.Two.Hours; // 从现在起 2 周后即 UtcNow 14 天 DateTime reviewDue In.Two.Weeks;三、In.Two 的七个方法从指定日期起偏移 2 个单位除属性外In.Two还提供 7 个同名加From后缀的方法每个方法接收一个System.DateTime date参数返回该日期偏移 2 个时间单位后的System.DateTime语义为「从给定日期起 2 个时间单位之后」。完整方法清单同样来自 Humanizer.In.Two.md方法签名文档语义底层实现见 In.SomeTimeFrom.csSecondsFrom(System.DateTime date)2 seconds from the provided datedate.AddSeconds(2)MinutesFrom(System.DateTime date)2 minutes from the provided datedate.AddMinutes(2)HoursFrom(System.DateTime date)2 hours from the provided datedate.AddHours(2)DaysFrom(System.DateTime date)2 days from the provided datedate.AddDays(2)WeeksFrom(System.DateTime date)2 weeks from the provided datedate.AddDays(14)MonthsFrom(System.DateTime date)2 months from the provided datedate.AddMonths(2)YearsFrom(System.DateTime date)2 years from the provided datedate.AddYears(2)与属性版本最大的区别在于基准点属性以DateTime.UtcNow为起点而From方法以调用方传入的date为起点且不会读写任何全局时钟。这意味着From系列天然具有确定性——同样的输入日期必然得到同样的输出非常适合在测试和需要可复现计算的场景中使用。using Humanizer; var startDate new DateTime(2024, 1, 30); // 从指定日期起 2 个月后2024 年 3 月 30 日 DateTime dueDate In.Two.MonthsFrom(startDate); // 从指定日期起 2 年后2026 年 1 月 30 日 DateTime anniversary In.Two.YearsFrom(startDate);四、源码级原理T4 模板如何批量产出 In.One ~ In.TenIn.Two的代码不是手工维护的理解其生成机制有助于你把握整个In数字系列的边界。查看 In.SomeTimeFrom.tt 的核心循环#for (var i 1; i 10; i){ var plural i 1 ? s : ; ... # public static class # i.ToWords().Dehumanize() # { public static DateTime # second # DateTime.UtcNow.AddSeconds(# i #); ... } #}#其中三个关键机制值得展开类名由i.ToWords().Dehumanize()计算模板先是调用 Humanizer 自己的ToWords()扩展把数字i转成英文单词2→two再用Dehumanize()把单词转成 PascalCase 标识符two→Two。这正是 Humanizer「用自身能力生成自身代码」的体现也保证了One到Ten的类名与数量词严格对应。单复数由i 1决定模板为每个数字类统一生成Second(s)、Minute(s)、Hour(s)、Day(s)、Week(s)、Month(s)、Year(s)七组属性与方法名。由于Two大于 1所有成员名均采用复数形式于是我们看到的是Seconds而非Second是DaysFrom而非DayFrom后者是In.One的命名风格。周统一换算为天数模板中对周的实现是AddDays(# i * 7 #)所以In.Two.Weeks生成的是AddDays(14)与前文表格一致月、年则直接委托AddMonths(i)、AddYears(i)。另外In类还通过 In.cs 补充了TheYear(int year)方法返回指定年份的 1 月 1 日以及由其他 T4 模板生成的月份类In.January、In.February等与Of(year)系列方法。整个 FluentDate 目录还包含InDate返回DateOnly的对应版本和On/OnDate构造特定日期的版本共同构成一套完整的自然语言日期构造体系。五、实践验证测试如何确认 In 系列行为仓库测试为In.Two的行为提供了直接证据。在 InTests.cs 中InFiveDays测试展示了From系列的实际调用模式[Fact] public void InFiveDays() { var baseDate On.January.The21st; var date In.Five.DaysFrom(baseDate); Assert.Equal(baseDate.AddDays(5), date); }把数字换成Two即可得到In.Two.DaysFrom(baseDate) baseDate.AddDays(2)的等价断言——From方法就是对DateTime.AddXxx的直通封装没有任何额外逻辑。更系统的验证来自 GeneratedFluentDateTests.cs。该测试文件内置了一张数量映射表RelativeAmounts[One] 1, [Two] 2, [Three] 3, ... [Ten] 10并通过反射遍历生成的成员用Add辅助方法第 265-287 行按RelativeDateUnit枚举Second/Minute/Hour/Day/Week/Month/Year逐一断言每个属性与方法的结果其中周同样按AddDays(amount * 7)校验。这意味着In.Two的全部 14 个成员都在生成式测试的覆盖范围内任何模板改动导致行为偏离都会使测试失败。六、使用注意事项UtcNow、日历运算与确定性的取舍在实战中使用In.Two乃至整个In数字系列时有三点需要留意这些建议同样来自仓库场景文档 fluent-dates-and-time-spans.mdx属性基于DateTime.UtcNowIn.Two.Days等属性在求值瞬间读取协调世界时因此它们是「相对当前时刻」的动态值。若代码或测试需要可重复结果应优先使用From方法注入起始日期或改用它处提供的固定基准。文档明确建议Properties withoutFromorOf(year)readDateTime.NoworUtcNow. Avoid them in deterministic code.月、年偏移是日历运算而非时长估算MonthsFrom/YearsFrom直接继承DateTime.AddMonths/AddYears的规范化语义。例如把 2 月 29 日偏移 2 个月到非闰年月份会规范化为 4 月末附近的有效日期AddMonths会做月末截断处理不会抛异常这类行为与固定 24 小时一天的TimeSpan运算有本质区别。周始终是 7 天In.Two.Weeks等价于AddDays(14)不受当月天数影响若你的业务周期依赖自然月如「下下月的今天」应使用MonthsFrom而非多次DaysFrom。结合这些约束推荐的可预测写法是业务计算全部使用In.Two.XxxFrom(startDate)这类带基准的方法只有「从现在起 N 个单位」且可接受动态结果的通知、提醒类场景才使用In.Two.Xxx属性。七、小结In.Two是 Humanizer FluentDate 中数量词In.One~In.Ten家族的标准一员通过 7 个属性基于UtcNow与 7 个From方法基于入参日期覆盖秒、分、时、天、周、月、年七种时间单位。它的全部成员由 In.SomeTimeFrom.tt 模板生成语义透明、零依赖配合 InTests.cs 与 GeneratedFluentDateTests.cs 的测试保障是写出「人话级」日期代码的可靠基础。若需要DateOnly版本可继续查阅同一目录下的 InDate.SomeTimeFrom.cs若要构造「某个具体的 2 号」而非「2 个时间单位之后」请转向On/OnDate系列。赞分享开发工具【免费下载链接】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.Eight 日期偏移 API 的用法与源码实现Humanizer FluentDate 详解InDate.Eight 日期偏移 API 的用法与源码实现 本文以 Humanizer 开源仓库中的 API开发工具ChatGPT for Google浏览器扩展的插件系统设计终极指南如何构建模块化AI搜索助手ChatGPT for Google浏览器扩展的插件系统设计终极指南如何构建模块化AI搜索助手 ChatGPT for Google是一款创新的浏览器扩展插件开发工具Humanizer FluentDate API 解析In.Three——用一句3 个时间单位之后完成日期计算Humanizer FluentDate API 解析 In.Three ——用一句3 个时间单位之后完成日期计算 In.Three 是 Humanize开发工具上一篇解决方案AI编程助手功能解锁 - 突破Cursor试用限制的技术实现下一篇Audacity AI音频增强全攻略零基础掌握效率工具新玩法创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

RVC-WebUI训练完全指南:如何用10分钟音频克隆出高相似度AI声线
RVC-WebUI训练完全指南:如何用10分钟音频克隆出高相似度AI声线

RVC-WebUI训练完全指南:如何用10分钟音频克隆出高相似度AI声线 【免费下载链接】rvc-webui liujing04/Retrieval-based-Voice-Conversion-WebUI reconstruction project 项目地址: https://gitcode.com/gh_mirrors/rv/rvc-webui RVC-WebUI(Retrie… · 2026/9/25 6:09:19

Apereo CAS 配置安全实战:用 Docker Secrets 安全交付敏感配置
Apereo CAS 配置安全实战:用 Docker Secrets 安全交付敏感配置

后端认证鉴权单点登录 【免费下载链接】cas Apereo CAS - Identity & Single Sign On for all earthlings and beyond. 项目地址: https://gitcode.com/gh_mirrors/ca/cas 点击查看 免费下载 导读 在生产环境中,CAS 的配置往往包含数据库口令、加密… · 2026/9/25 6:09:13

国科大胡伟武计算机体系结构课后题解析:核心题型与解题思路
国科大胡伟武计算机体系结构课后题解析:核心题型与解题思路

/* 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 6:09:13

Apache Beam Agent Skills 体系:面向 AI 代理的代码库专业化技能框架
Apache Beam Agent Skills 体系:面向 AI 代理的代码库专业化技能框架

大数据批处理流处理数据工程 【免费下载链接】beam Apache Beam is a unified programming model for Batch and Streaming data processing. 项目地址: https://gitcode.com/gh_mirrors/beam4/beam 点击查看 免费下载 本文档解读 Apache Beam 仓库中 .agent/skill… · 2026/9/25 7:23:20

用 treeprint 在 Go 中渲染 ASCII 树:从目录结构到进程树的完整实践指南
用 treeprint 在 Go 中渲染 ASCII 树:从目录结构到进程树的完整实践指南

网络安全 【免费下载链接】sliver Adversary Emulation Framework 项目地址: https://gitcode.com/gh_mirrors/sl/sliver 点击查看 免费下载 treeprint 是一个用于在 Go 程序中组合并渲染 ASCII 树的轻量级工具库(当前仓库中以 vendored 依赖形式位于 v… · 2026/9/25 7:23:20

Kubernetes 上的 Agentic 运行时:ax 编排与调度实践
Kubernetes 上的 Agentic 运行时:ax 编排与调度实践

1. 从"ax"这个标题说起:一个被低估的运行时抽象层第一次看到"ax"这个标题,很多人会以为是某个命令行工具的缩写,或者某个键盘快捷键的代号。但把ax、agentic、orchestration、runtime、Kubernetes这几个词摆在一起&#… · 2026/9/25 7:23:20

昇腾Atlas 300V 24G推理卡上部署YOLOv5全流程指南
昇腾Atlas 300V 24G推理卡上部署YOLOv5全流程指南

前几天一个做系统集成的朋友发来截图,问了我一句:Atlas 300V 24G 是运算加速卡吗。这问题乍一看很简单,但很多刚接触昇腾的人都会在这里卡住。他不是算法出身,看着报价单上写着“AI 推理卡”,就以为跟 GPU 一样&#x… · 2026/9/25 7:23:20

RocketRide Helm Chart 部署指南:Kubernetes 安装配置、Secret 管理与共享存储校验下的高可用扩缩实践
RocketRide Helm Chart 部署指南:Kubernetes 安装配置、Secret 管理与共享存储校验下的高可用扩缩实践

【免费下载链接】rocketride-server High-performance AI pipeline engine with a C core and 50 Python-extensible nodes. Build, debug, and scale LLM workflows with 13 model providers, 8 vector databases, and agent orchestration, all from your IDE. Includes VS C… · 2026/9/25 7:23:20

ax编排工具解析:从CLI到Kubernetes的agentic调度实践
ax编排工具解析:从CLI到Kubernetes的agentic调度实践

1. 从"ax"这个标题说起:一个被低估的编排入口第一次看到"ax"这个标题,很多人会以为是某个命令的缩写,或者某个库的名字。但结合热搜词里的 agentic、orchestrator、Kubernetes、CLI 这几个关键词,方向其实很明… · 2026/9/25 7:23:14

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* 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 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* 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 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* 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 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码