ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Humanizer OnDate.September 流式日期 API 完全指南:用 DateOnly 表达“九月第 N 天“

Humanizer OnDate.September 流式日期 API 完全指南:用 DateOnly 表达“九月第 N 天“ 开发工具【免费下载链接】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 流式日期Fluent DateAPI 的实战指南聚焦OnDate.September这一为.NET 6 的DateOnly类型设计的九月日期访问器它用 30 个静态属性The1stThe30th和 1 个参数化方法The(int)把当前年份的 9 月某天变成自然语言般的强类型代码。读完本文你将掌握该 API 的完整成员清单、底层实现原理含 T4 模板生成机制、边界行为、测试验证方式以及如何与InDate、In、On等其他流式 API 配合写出可读性极高的日期代码。一、OnDate.September 是什么OnDate.September是 Humanizer 中OnDate静态类位于 src/Humanizer/FluentDate/OnDate.Days.cs的嵌套类专门用于构造当前年份九月的任意一天返回类型为System.DateOnly。其 API 文档website/versioned_docs/version-2.11.10/api/Humanizer.OnDate.September.md给出的类声明为public class OnDate.September继承关系为System.Object→September所有成员均为public static。与OnDate.January、OnDate.December等其余 11 个月份嵌套类一样它把某年某月某日这一最常见的日期构造场景简化成一句近乎口语的表达式例如using Humanizer; // 当前年份 9 月 23 日 DateOnly nationalDay OnDate.September.The23rd;这段代码等价于手写new DateOnly(DateTime.Now.Year, 9, 23)但语义一目了然无需关注年份、月份与日期构造参数的顺序读到代码即知九月二十三号。二、成员全览30 个静态属性 1 个参数化方法OnDate.September的公开 API 分为两部分全部为静态成员无需实例化即可调用。2.1 静态属性 The1st ~ The30th九月共 30 天因此该类提供The1st到The30th共 30 个静态只读属性每个属性返回当前年份对应日期的DateOnly。下表按日期顺序完整列出属性名均遵循英语序数词后缀规则1 用st、2 用nd、3 用rd、其余用th属性含义属性含义The1st9 月 1 日The16th9 月 16 日The2nd9 月 2 日The17th9 月 17 日The3rd9 月 3 日The18th9 月 18 日The4th9 月 4 日The19th9 月 19 日The5th9 月 5 日The20th9 月 20 日The6th9 月 6 日The21st9 月 21 日The7th9 月 7 日The22nd9 月 22 日The8th9 月 8 日The23rd9 月 23 日The9th9 月 9 日The24th9 月 24 日The10th9 月 10 日The25th9 月 25 日The11th9 月 11 日The26th9 月 26 日The12th9 月 12 日The27th9 月 27 日The13th9 月 13 日The28th9 月 28 日The14th9 月 14 日The29th9 月 29 日The15th9 月 15 日The30th9 月 30 日每个属性的签名统一为public static System.DateOnly The30th { get; }2.2 参数化方法 The(int dayNumber)当目标日期不是常用固定日、或希望以变量方式传入时使用The(int)方法public static System.DateOnly The(int dayNumber);参数dayNumberSystem.Int32表示九月的第几天130。返回值System.DateOnly。int day 5; DateOnly date OnDate.September.The(day); // 等价于 OnDate.September.The5th注意传入超出 130 范围的数值如0、31、-1时DateOnly构造函数会抛出ArgumentOutOfRangeException这一点由 tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs 中的反射测试显式捕获验证见下文测试验证一节。三、底层实现一行表达式 T4 模板生成3.1 属性与方法的真实实现OnDate.September的源码位于 src/Humanizer/FluentDate/OnDate.Days.cs 第 1561 行起。每个成员都只是当前年份 固定月份 9 目标日的DateOnly构造表达式public class September { /// summary /// The nth day of September of the current year /// /summary public static DateOnly The(int dayNumber) new(DateTime.Now.Year, 9, dayNumber); /// summary /// The 1st day of September of the current year /// /summary public static DateOnly The1st new(DateTime.Now.Year, 9, 1); // The2nd ... The30th 依此类推仅日期不同 }关键点有三年份取自DateTime.Now.Year返回值始终是当前年份的九月日期。跨年如 12 月 31 日调用后同一表达式会返回新一年的日期。从源码结构可以推断若需要特定年份应改用InDate.SeptemberOf(2025)这类带年份参数的 API见下文。返回DateOnly与On类返回DateTime形成互补。OnDate系整套类被#if NET6_0_OR_GREATER条件编译指令包裹见 src/Humanizer/FluentDate/OnDate.Days.cs 第 1 行仅在 .NET 6 及以上目标框架可用因为DateOnly类型自 .NET 6 才引入。零分配、无缓存每个属性调用即构造逻辑上是纯计算没有状态与共享可变数据。3.2 T4 模板12 个月份类的来源OnDate.Days.cs并非手写而是由 T4 文本模板 src/Humanizer/FluentDate/OnDate.Days.tt 生成。模板核心逻辑如下节选const int leapYear 2012; for (var month 1; month 12; month) { var firstDayOfMonth new DateTime(leapYear, month, 1); var monthName firstDayOfMonth.ToString(MMMM); // 生成 public class monthName public static DateOnly The(int dayNumber) new(DateTime.Now.Year, month, dayNumber); // 用 Ordinalize() 生成 The1st/The2nd/... 属性名 for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); public static DateOnly TheordinalDay new(DateTime.Now.Year, month, day); } }模板以闰年 2012 为基准计算各月天数2 月 29 天因此生成的每个月份类都恰好拥有The1st至The当月天数的属性九月的 30 天对应 30 个属性。属性名中的序数词st/nd/rd/th由 Humanizer 自身的Ordinalize()扩展生成——这正是Humanizer 用 Humanizer 来生成自己的一个有趣体现。四、为什么用 OnDate.September使用场景与对比4.1 典型业务场景OnDate.September最适用于**代码中固定引用某些日期敏感日**的场景例如开学日、教师节9 月 10 日OnDate.September.The10th每月账单日、发布日、巡检日等固定日期的 9 月版本与DateOnly相关的领域模型字段赋值、测试夹具中的固定日期示例using Humanizer; // 教师节当前年份 9 月 10 日 DateOnly teachersDay OnDate.September.The10th; // 用变量构造第 15 个工作日标记 int businessDay 15; DateOnly target OnDate.September.The(businessDay);4.2 与其他流式 API 的对比Humanizer 的 FluentDate 体系目录 src/Humanizer/FluentDate/提供四套风格互补的入口入口类返回类型表达语义代表性示例OnDate.SeptemberDateOnly当前年份 9 月某天OnDate.September.The1stOn.SeptemberDateTime当前年份 9 月某天带时间分量On.September.The1stInDate.September/InDate.SeptemberOf(year)DateOnly当前年份 / 指定年份 9 月 1 日InDate.SeptemberOf(2025)In.September/In.SeptemberOf(year)DateTime当前年份 / 指定年份 9 月 1 日In.SeptemberOf(2009)对应源码与测试On类位于 src/Humanizer/FluentDate/On.Days.cs其September嵌套类第 1568 行起实现与OnDate.September完全同构仅返回DateTime。In.September的语义由 tests/Humanizer.Tests/FluentDate/InTests.cs 验证In.September等于new(DateTime.Now.Year, 9, 1)In.SeptemberOf(2009)等于new(2009, 9, 1)。官方文档示例website/docs/_examples/scenarios-fluent-dates/Program.cs展示了流式日期的完整用法In.Two.MonthsFrom(startingPoint)、In.AprilOf(2025).AddDays(2).At(14, 30)等说明In/InDate侧重相对时间与指定年份而On/OnDate侧重当前年份的绝对日期。选型建议需要纯日期无时间部分且年份取当前年用OnDate.September需要DateTime或后续要叠加时间用On.September需要指定特定年份改用InDate.SeptemberOf(year)或In.SeptemberOf(year)。五、测试验证生成式 API 如何被保证正确Humanizer 对该类 API 的正确性验证非常系统。两个测试文件覆盖了成员存在性与返回值正确性两个层面tests/Humanizer.Tests/FluentDate/OnDateTests.cs手写断言验证OnDate.January.The23rd、OnDate.December.The4th、OnDate.February.The(11)均返回当前年份 对应月 对应日的DateOnly。tests/Humanizer.Tests/FluentDate/GeneratedFluentDateTests.cs通过反射自动遍历所有生成成员OnDateDayPropertiesCoverAllGeneratedDayAccessors遍历OnDate下所有月份嵌套类的全部静态属性用TryParseDayProperty解析TheNNth形式的属性名并断言其值等于new DateOnly(当前年, 月, 日)OnDateTheMethodsCoverAllGeneratedMonthFactories遍历每个月份类的The(int)方法并断言The(1)等于当月 1 日当属性构造抛异常时如传入非法日期测试会捕获TargetInvocationException并断言其内部异常为ArgumentOutOfRangeException月份表Months数组中 September 对应数字 9作为反射断言的依据。这两个测试共同保证了只要 T4 模板生成逻辑不变OnDate.September的 30 个属性与The(int)方法就始终与当前年份 9 月 N 日的语义保持一致。六、使用注意事项与限制目标框架限制OnDate整套 API 需要 .NET 6DateOnly类型的前提。在 .NET Framework 或 .NET 5 及以下项目中不可用此时请使用返回DateTime的On.September。年份是运行时当前年返回值随调用时刻变化不能用于表示固定年份的日期跨年进程或午夜边界调用时结果可能变化。参数范围The(int dayNumber)只接受 130越界会抛ArgumentOutOfRangeException。官方文档与源码均未提供超出后自动钳制或滚入下月的行为。无时间分量返回的是DateOnly午夜零点语义若业务需要具体时刻如9 月 10 日 8:30 开课可组合ToDateTime(TimeOnly)或改用On.September系列。区域性无关类名与属性名是固定的英文序数词命名不受当前线程CultureInfo影响任何区域下调用结果一致。七、小结OnDate.September是 Humanizer 流式日期体系在DateOnly时代的典型代表30 个语义直白的静态属性加一个参数化方法把当前年份九月第 N 天这一高频构造场景封装成近乎自然语言的代码。它的实现极简一行DateOnly构造、来源可溯T4 模板生成、测试反射全量校验与On/In/InDate系列共同构成一套完整的日期表达工具链。需要进一步了解整体设计可阅读仓库根目录的 ARCHITECTURE.md 与 DESIGN.md完整的流式日期使用示例参见 website/docs/_examples/scenarios-fluent-dates/Program.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点击查看免费下载相关推荐SurfSense 前端性能规则详解用 Promise.all() 并行化独立异步操作消除请求瀑布流SurfSense 前端性能规则详解用 Promise.all 并行化独立异步操作消除请求瀑布流 本文以 SurfSense 仓库内置的 Vercel Re开发工具PostHog Desktop 深链接体系URL Scheme 注册、Handler 路由与 OAuth 回调全解PostHog Desktop 深链接体系URL Scheme 注册、Handler 路由与 OAuth 回调全解 本文基于 PostHog 仓库中桌面端d开发工具Humanizer InDate.Two 流畅日期 API 指南用 DateOnly 优雅表达从现在起两天/两周/两月/两年Humanizer InDate.Two 流畅日期 API 指南用 DateOnly 优雅表达从现在起两天/两周/两月/两年 本篇技术指南聚焦于 .NET开发工具上一篇3步开启你的Switch游戏之旅yuzu模拟器完全使用手册下一篇class-transformer与电子商务产品数据处理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表