开发工具【免费下载链接】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点击查看免费下载本篇指南系统讲解 .NET 库 Humanizer 中On.July类的完整用法它通过 31 个静态属性The1st–The31st与一个The(int)方法让你用一行自然语言式代码拿到当前年份任意 7 月日期的System.DateTime。读完本文你将掌握On.July的全部公开成员、其底层由 T4 模板生成的实现原理以及如何与At、AtNoon、In(year)等扩展方法组合写出可读性极高的流式日期代码。On.July 是什么On.July是 Humanizer FluentDate 子模块中按日期访问On系列的一部分。On类在命名空间Humanizer下定义July是其嵌套子类专门提供当年 7 月的流式日期访问器文档中的类定义如下public class On.July继承关系为System.Object→July是一个普通的公开类通过其内部静态成员对外暴露日期。它没有业务状态所有成员均为static因此使用时无需实例化直接以On.July.The4th的形式调用即可。完整 API 成员总览On.July共暴露 33 个公开成员1 个构造函数、31 个静态属性、1 个静态方法。文档 API 参考页 Humanizer.On.July.md 列出了全部成员此处逐一继承整理。构造函数public July();初始化July类的新实例。由于该类成员均为静态通常无需手动构造其无参构造函数的存在与On类体系保持一致参见 Humanizer.On.md。31 个日期属性The1st – The31st所有属性签名一致均为只读静态属性返回System.DateTimepublic static System.DateTime The10th { get; }完整成员清单如下每个属性代表当前年份 7 月的第 N 天时间部分为午夜00:00:00属性名含义属性名含义The1st当年 7 月 1 日The17th当年 7 月 17 日The2nd当年 7 月 2 日The18th当年 7 月 18 日The3rd当年 7 月 3 日The19th当年 7 月 19 日The4th当年 7 月 4 日The20th当年 7 月 20 日The5th当年 7 月 5 日The21st当年 7 月 21 日The6th当年 7 月 6 日The22nd当年 7 月 22 日The7th当年 7 月 7 日The23rd当年 7 月 23 日The8th当年 7 月 8 日The24th当年 7 月 24 日The9th当年 7 月 9 日The25th当年 7 月 25 日The10th当年 7 月 10 日The26th当年 7 月 26 日The11th当年 7 月 11 日The27th当年 7 月 27 日The12th当年 7 月 12 日The28th当年 7 月 28 日The13th当年 7 月 13 日The29th当年 7 月 29 日The14th当年 7 月 14 日The30th当年 7 月 30 日The15th当年 7 月 15 日The31st当年 7 月 31 日The16th当年 7 月 16 日动态方法The(int)当你想访问的不是上述固定日期或希望以参数化方式书写时使用静态方法Thepublic static System.DateTime The(int dayNumber);参数dayNumber类型System.Int32表示 7 月内的天数序号返回值System.DateTime即当年 7 月第dayNumber天。源码级实现原理一行表达式基于 DateTime.Now.Year在 src/Humanizer/FluentDate/On.Days.cs 中July类的实现极其简洁每个成员都是一行表达式。例如public static DateTime The(int dayNumber) new(DateTime.Now.Year, 7, dayNumber); public static DateTime The1st new(DateTime.Now.Year, 7, 1);两个关键实现事实年份取自DateTime.Now.Year调用发生时机器本地时间的年份。因此On.July.The4th在 2026 年返回2026-07-04 00:00:00跨年后自动变为新年份的 7 月 4 日无需任何参数。时间部分固定为午夜new(year, month, day)三参构造默认时间组件为00:00:00。要带具体时刻需配合下文的时间扩展方法。T4 模板生成12 个月类出自同一份代码July类并非手工逐月书写而是由 T4 文本模板 src/Humanizer/FluentDate/On.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); // 得到 January...December ... public static DateTime The(int dayNumber) new(DateTime.Now.Year, # month #, dayNumber); ... for (var day 1; day DateTime.DaysInMonth(leapYear, month); day) { var ordinalDay day.Ordinalize(); // 得到 1st / 2nd / 3rd / 4th ... public static DateTime The# ordinalDay # new(DateTime.Now.Year, # month #, # day #); } }从中可以推断出几点设计属性名中的序数后缀1st、2nd、3rd、21st、22nd、23rd等由 Humanizer 自己的Ordinalize()扩展方法生成保证了命名与英文习惯一致每个月类拥有当月天数上限的属性7 月是 31 天所以有The31st而 2 月只有The29th模板以闰年 2012 为基准枚举非闰年时 2 月 29 日仍可构造因为DateTime构造本身不做此校验模板以闰年基准求DaysInMonth确保所有 31 天月份1、3、5、7、8、10、12 月都生成完整的 31 个属性。边界行为The(int) 的参数校验The(int dayNumber)直接透传至System.DateTime构造函数。从实现可以推断当dayNumber超出合法范围小于 1 或大于 31时会抛出System.ArgumentOutOfRangeException与直接调用new DateTime(year, 7, 999)的行为完全一致——On.July本身不做过多的防御性包装。实战用法流式组合与链式调用On.July的价值在于和其他 FluentDate 扩展方法组合。日期、时间、年份三类扩展均定义在 PrepositionsExtensions.cs 中public static DateTime At(this DateTime date, int hour, int min 0, int second 0, int millisecond 0); 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); // 替换年份基础场景using Humanizer; // 当年 7 月 4 日午夜2026-07-04 00:00:00假设运行于 2026 年 var fourthOfJuly On.July.The4th; // 任意天数当年 7 月 15 日 var midMonth On.July.The(15);指定时刻// 7 月 4 日上午 9 点 var morning On.July.The4th.At(9); // 7 月 4 日中午 12 点两个写法等价 var noon On.July.The4th.AtNoon(); var noon2 On.July.The4th.At(12); // 7 月 4 日 14:30 var meeting On.July.The4th.At(14, 30);指定年份// 2027 年 7 月 1 日 var futureJuly On.July.The1st.In(2027);上述链式模式与项目示例 website/docs/_examples/scenarios-fluent-dates/Program.cs 中In.AprilOf(2025).AddDays(2).At(14, 30)的写法一致On/In系列访问器负责定位日期At/AtNoon/AtMidnight负责设定时刻整体阅读起来接近自然语言。测试与验证仓库测试 tests/Humanizer.Tests/FluentDate/OnTests.cs 以相同的断言模式验证了On系列的行为[Fact] public void OnJanuaryThe23rd() Assert.Equal(new(DateTime.Now.Year, 1, 23), On.January.The23rd); [Fact] public void OnFebruaryThe() Assert.Equal(new(DateTime.Now.Year, 2, 11), On.February.The(11));On.July与On.January、On.February由同一 T4 模板生成实现模式完全一致因此上述测试同样证明了On.July.The4th等价于new DateTime(DateTime.Now.Year, 7, 4)这一核心行为。由于DateTime.Now是动态值测试只能在断言结果与调用时刻年份一致这一层面验证无法固定某个具体年份。使用注意事项年份是调用时刻的动态值On.July.The4th的结果依赖程序运行机器的当前年份与本地时区。若需固定年份的日期如测试、历史数据回放请用On.July.The4th.In(2025)或直接构造new DateTime(...)。每次访问都产生新实例属性为只读求值表达式每次访问都会执行new DateTime(...)因此On.July.The4th On.July.The4th为true值相等但并非同一引用。时间组件固定为午夜需要具体时刻时必须显式调用At/AtNoon/AtMidnight这一点与OnDate系列返回带偏移量的类型不同。参数范围The(int)传入超出 1–31 的值会抛出ArgumentOutOfRangeException合法值本身不校验该月实际天数例如 7 月不存在The32nd属性但The(32)会抛异常。相关资源API 参考Humanizer.On.mdOn容器类、Humanizer.On.July.md本文主题源码实现On.Days.cs、生成模板 On.Days.tt配套扩展PrepositionsExtensions.csAt/AtNoon/AtMidnight/In(year)单元测试OnTests.cs可运行示例scenarios-fluent-dates/Program.cs关联日期系列Humanizer.OnDate.md、Humanizer.In.md赞分享开发工具【免费下载链接】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点击查看免费下载相关推荐React Spectrum (S2) 样式开发指南使用 style 宏与构建时 CSS 生成React Spectrum S2 样式开发指南使用 style 宏与构建时 CSS 生成 S2Spectrum 2是 React Spectrum 的新开发工具Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算Humanizer 流式日期 API 详解InDate.Ten 的 10 天 / 周 / 月 / 年日期计算 本篇技术指南聚焦 Humanizer 流式日期开发工具探索 V2exOS 核心功能主题浏览、评论互动与通知管理全解析探索 V2exOS 核心功能主题浏览、评论互动与通知管理全解析 V2exOS 是一款采用 SwiftUI 开发的跨平台客户端支持 macOS、iOS 和 t开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
