Humanizer On.February 流式日期 API 详解:用自然语言构造 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.On.February是 .NET 库 Humanizer FluentDate 体系中的一个静态嵌套类专门用于以近乎自然语言的方式构造“当前年份 2 月某一天”的DateTime值。本篇以 API 参考文档 为主体结合 On.Days.cs 源码 与 测试用例讲解该类 29 个日期属性、The(int)工厂方法、闰年边界行为以及At/AtMidnight/AtNoon等配套扩展的组合用法帮助你写出可读性更强、无需手工拼new DateTime(...)的日期代码。On 类与 On.February 的定位On是一个公开的静态入口类定义在 src/Humanizer/FluentDate/On.Days.cs 中。它为一年十二个月各提供一个同名的嵌套静态类On.January、On.February、On.March……每个嵌套类的职责完全一致——用自然语言式的静态属性或方法返回当前年份该月某一天的DateTime。API 文档对该类的定义如下public class On.February其继承链为System.Object→February嵌套在On之内实际类型名是On.February。从源码结构看February类只包含一个无参构造函数C# 默认提供、29 个静态只读属性The1st到The29th和一个静态方法The(int dayNumber)没有任何实例状态——因此它本质上是一组2 月日期工厂。每个属性的实现都非常简单例如 源码第 218-219 行public static DateTime The1st new(DateTime.Now.Year, 2, 1);即取DateTime.Now的年份固定月份为 2再拼上目标日号。这正是当前年份 2 月的第 N 天这一语义的直接落地。成员清单29 个静态属性 1 个工厂方法On.February暴露的成员与 API 文档一致可以归为两类命名属性The1st ~ The29th成员签名语义The1st~The9thpublic static System.DateTime The1st { get; }当前年份 2 月 1 日 ~ 9 日The10th~The19thpublic static System.DateTime The10th { get; }当前年份 2 月 10 日 ~ 19 日The20th~The29thpublic static System.DateTime The20th { get; }当前年份 2 月 20 日 ~ 29 日所有属性返回值类型均为System.DateTime。命名规则直接沿用英文序数词的后缀1st、2nd、3rd、4th…与 2 月的最大天数 28/29 天一一对应——这 29 个属性恰好覆盖 2 月的全部合法日期。动态方法The(int)public static System.DateTime The(int dayNumber);参数dayNumberSystem.Int32表示想要的日号返回System.DateTime即当前年份 2 月第 dayNumber 天实现new(DateTime.Now.Year, 2, dayNumber)见 源码第 211-212 行。测试 OnTests.cs 第 12-13 行 验证了该方法的行为[Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), On.February.The(11));当dayNumber超出 2 月的合法范围如The(30)时DateTime构造函数会直接抛出ArgumentOutOfRangeException这一行为是System.DateTime构造语义的一部分并非 Humanizer 单独做的校验。闰年语义The29th 只在闰年有效2 月在 FluentDate 体系中是个特殊月份——它最多只有 29 天。The29th属性源码 中实现为new(DateTime.Now.Year, 2, 29)在平年会抛出异常只有闰年能被 4 整除且不被 100 整除或能被 400 整除的年份才返回合法日期。关于这一点官方场景指南 Compose dates and time spans fluently 给出了一个重要提示这些当前年份属性读取的是DateTime.Now不适合在确定性代码或测试中使用。需要固定日期时应当注入起始日期或使用In(int year)之类的扩展见下文组合用法。此外Humanizer 还提供了配套的OnDate.February返回DateOnly见 OnDate.Days.cs 源码同样包含The1st~The29th和The(int)但仅在支持DateOnly的框架.NET 6上可用。两者语义完全一致区别只在返回类型。组合用法At / AtNoon / AtMidnight / InOn.February.The10th返回的DateTime时间部分恒为午夜 00:00:00。要指定具体时刻可以链式调用 PrepositionsExtensions 提供的扩展方法using Humanizer; // 当前年份 2 月 14 日 14:30:00情人节下午两点半 var valentineAppointment On.February.The14th.At(14, 30); // 当前年份 2 月 1 日 00:00午夜 var startOfFeb On.February.The1st.AtMidnight(); // 当前年份 2 月 1 日 12:00正午 var noonOfFeb1 On.February.The1st.AtNoon(); // 把 2 月 14 日固定到指定年份例如 2030 年 var fixedValentine On.February.The14th.In(2030);这些扩展的实现PrepositionsExtensions.cs 第 12-31 行如下public static DateTime At(this DateTime date, int hour, int min 0, int second 0, int millisecond 0) new(date.Year, date.Month, date.Day, hour, min, second, millisecond); public static DateTime AtMidnight(this DateTime date) date.At(0); public static DateTime AtNoon(this DateTime date) date.At(12); public static DateTime In(this DateTime date, int year) new(year, date.Month, date.Day, date.Hour, date.Minute, date.Second, date.Millisecond);注意In(year)与DateTime.AddYears的区别同样记录在 场景指南 中In(year)是在目标年份原样重建相同的月/日如果该日期在目标年份不存在例如把 2 月 29 日搬到平年会抛出异常而AddMonths/AddYears是进位归一化语义闰年 2 月 29 日加一年会得到 2 月 28 日。测试如何保障 29 个属性与 The 方法FluentDate 的完整生成代码由 T4 模板如 On.Days.tt驱动On.Days.cs是模板产物。仓库通过反射式的生成测试统一校验所有月份嵌套类见 GeneratedFluentDateTests.csOnDayPropertiesCoverAllGeneratedDayAccessors遍历On的所有嵌套类型断言每个TheNth属性都返回DateTime且值正确第 17-18 行OnTheMethodsCoverAllGeneratedMonthFactories断言每个月份的The(int)工厂方法行为一致第 21-22 行。这意味着On.February的 29 个属性不是手写维护的而是与其它 11 个月份共用同一套生成与校验机制保证了 API 的一致性。典型使用场景与注意事项适合使用On.February的场景领域可读的常量日期如报表固定结算日On.February.The1st、活动截止日On.February.The28th比new DateTime(year, 2, 28)意图更清晰结合At/AtNoon构造日程会议、提醒、预约等带时刻的业务日期配合In(year)固定年份从今年 2 月推广到任意年份的同一日期。需要注意的限制基于DateTime.Now所有属性与The(int)都读取当前时刻的年份代码在跨年瞬间12 月 31 日 23:59:59 附近执行时年份可能漂移官方场景文档明确建议在可重复的代码或测试中注入起始日期而不是依赖现在闰年约束The29th平年抛异常使用前应先判断DateTime.IsLeapYear或捕获异常非法日号The(30)等越界参数由DateTime构造函数抛出ArgumentOutOfRangeException框架要求OnDate.FebruaryDateOnly版本仅在 .NET 6 及以上可用。参考链接On.February API 参考文档On API 参考文档On.Days.cs 源码含 February 类OnDate.Days.cs 源码DateOnly 版本PrepositionsExtensions 源码At / AtNoon / AtMidnight / InOnTests.cs 测试GeneratedFluentDateTests.cs 生成代码校验测试Compose dates and time spans fluently 场景指南赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐探索 V2exOS 核心功能主题浏览、评论互动与通知管理全解析探索 V2exOS 核心功能主题浏览、评论互动与通知管理全解析 V2exOS 是一款采用 SwiftUI 开发的跨平台客户端支持 macOS、iOS 和 t开发工具Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算 本篇技术指南聚焦 Humanizer 流式日期开发工具Humanizer InDate.Ten 详解用 DateOnly 流式 API 计算 10 天/周/月/年后的日期Humanizer InDate.Ten 详解用 DateOnly 流式 API 计算 10 天/周/月/年后的日期 InDate.Ten 是 Humaniz开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考