开发工具【免费下载链接】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 的 API 参考页 DefaultDateTimeHumanizeStrategy 展开完整覆盖该类的职责、接口契约与Humanize方法语义并结合仓库源码深入剖析其背后的时间距离换算算法、策略注册机制以及与PrecisionDateTimeHumanizeStrategy的差异帮助读者掌握在 .NET 应用中将DateTime转换为 2 days ago、a minute from now 这类可读文本的完整技术方案与定制入口。类定义与继承结构API 文档对该类的定义如下public class DefaultDateTimeHumanizeStrategy : Humanizer.DateTimeHumanizeStrategy.IDateTimeHumanizeStrategy继承链System.Object → DefaultDateTimeHumanizeStrategy实现接口IDateTimeHumanizeStrategy类注释The default distance of time - words calculator.默认的时间距离 → 自然语言计算器。在源码中这个类只有一行有效实现位于 DefaultDateTimeHumanizeStrategy.cspublic class DefaultDateTimeHumanizeStrategy : IDateTimeHumanizeStrategy { public string Humanize(DateTime input, DateTime comparisonBase, CultureInfo? culture) DateTimeHumanizeAlgorithms.DefaultHumanize(input, comparisonBase, culture); }从源码结构看它本身是一个薄壳thin wrapper真正的计算逻辑全部委托给内部静态类 DateTimeHumanizeAlgorithms。这种策略类只负责路由、算法集中管理的设计使得 Humanizer 可以复用同一套算法支撑多种策略类型默认策略、精度策略以及DateOnly/TimeOnly的对应算法。Humanize 方法参数与语义API 文档中唯一公开的方法签名为public string Humanize(System.DateTime input, System.DateTime comparisonBase, System.Globalization.CultureInfo culture);文档描述其用途为Calculates the distance of time in words between two provided dates计算两个给定日期之间以自然语言表达的时间距离。三个参数的语义可以结合接口注释 IDateTimeHumanizeStrategy.cs 与测试代码进一步确认参数类型语义inputDateTime要被人性化表达的日期例如某条消息的发布时间comparisonBaseDateTime比较基准日期。input comparisonBase时产生将来时from now否则产生过去时agocultureCultureInfo可空决定输出语言为null时使用当前线程文化最终通过Configurator.GetFormatter(culture)解析本地化格式器接口注释还说明了该策略的定位Implement this interface to create a new strategy forDateTime.Humanizeand hook it inConfigurator.DateTimeHumanizeStrategy.也就是说IDateTimeHumanizeStrategy是用户自定义DateTime.Humanize()行为的官方扩展点而DefaultDateTimeHumanizeStrategy是框架内置的默认实现。调用链从扩展方法到策略实例用户通常不会直接实例化DefaultDateTimeHumanizeStrategy而是通过扩展方法 DateHumanizeExtensions.cs 间接使用它public static string Humanize(this DateTime input, bool? utcDate null, DateTime? dateToCompareAgainst null, CultureInfo? culture null) { var comparisonBase dateToCompareAgainst ?? DateTime.UtcNow; utcDate ?? input.Kind ! DateTimeKind.Local; comparisonBase utcDate.Value ? comparisonBase.ToUniversalTime() : comparisonBase.ToLocalTime(); return Configurator.DateTimeHumanizeStrategy.Humanize(input, comparisonBase, culture); }关键点扩展方法先做 UTC/Local 归一化再调用Configurator.DateTimeHumanizeStrategy.Humanize(...)Configurator上的策略属性默认值正是该类型见 Configurator.cspublic static IDateTimeHumanizeStrategy DateTimeHumanizeStrategy { get; set; } new DefaultDateTimeHumanizeStrategy();属性注释明确提醒该属性应在应用启动时一次性设置避免在开始处理请求后再修改多线程场景下应使用 volatile 读或适当同步。可空DateTime?的重载在值为null时不经过策略而是直接返回本地化的neverformatter.DateHumanize_Never()。默认算法时间距离的阶梯式取整DefaultDateTimeHumanizeStrategy.Humanize最终执行的DateTimeHumanizeAlgorithms.DefaultHumanize分为两步外层DateTimeHumanizeAlgorithms.cs计算时差ts与Tenseinput comparisonBase ? Future : Past并额外计算sameMonth比较基准的前/后一个月是否恰好等于input的日期部分和日历天数days内层L192-L264按固定阈值阶梯选择输出单位条件输出ts.TotalMilliseconds 500now毫秒单位数量 0 60秒秒ts.Seconds 120秒a minute 60分钟分钟ts.Minutes 90分钟an hour 24小时小时ts.Hours 48小时天用日历差days即 24h 内显示 yesterday/tomorrow 7天天ts.Days 28天周ts.Days / 7向下取整28–30天若sameMonth则 a month否则按天 345天月Floor(ts.TotalDays / 29.5)近似月长≥ 345天年Floor(ts.TotalDays / 365)最小取 1每一级最终都通过formatter.DateHumanize(TimeUnit, Tense, count)输出本地化文本。这套阈值的实际输出在测试 DateHumanizeDefaultStrategyTests.cs 中被逐条固化例如[InlineData(1, one second ago)] [InlineData(60, a minute ago)] [InlineData(120, 2 hours ago)] [InlineData(24, yesterday)] [InlineData(7, one week ago)] [InlineData(27, 3 weeks ago)] [InlineData(32, one month ago)] [InlineData(12, one year ago)] // 按月参数注入 12*31 天值得注意的是TwentyEightDaysUsesCalendarMonth用例L95-L100当基准日为每月 1 日、相差 28 天时输出 one month这正是sameMonth日历判断生效的证据。与 PrecisionDateTimeHumanizeStrategy 的区别同一个IDateTimeHumanizeStrategy接口下还存在另一种实现 PrecisionDateTimeHumanizeStrategy.cspublic class PrecisionDateTimeHumanizeStrategy(double precision .75) : IDateTimeHumanizeStrategy { public string Humanize(DateTime input, DateTime comparisonBase, CultureInfo? culture) DateTimeHumanizeAlgorithms.PrecisionHumanize(input, comparisonBase, precision, culture); }两者的核心差异在算法侧默认策略使用上文那套固定阈值阶梯500ms → 秒 → 分钟 → 小时 → 天 → 周 → 月 → 年单位切换点固定输出稳定、可预期精度策略则引入一个precision系数默认 0.75从最小单位逐级向上取整进位毫秒 ≥999*precision进秒、秒 ≥59*precision进分钟……月/年按30/365天近似折算见 L48-L131。其行为由 DateTimeHumanizePrecisionStrategyTests.cs 验证例如在默认精度 0.75 下749ms 输出 now750ms 输出 one second ago45 秒输出 a minute ago。可以推断默认策略面向稳定展示场景精度策略面向更平滑逼近真实时长的场景两者可互换挂载到同一个配置点。配置与替换策略Humanizer 提供了全局配置入口 Configurator在文档站配置示例 Program.cs 中可以看到典型的策略替换写法Configurator.DateTimeHumanizeStrategy new PrecisionDateTimeHumanizeStrategy();自定义策略的步骤与接口注释一致实现IDateTimeHumanizeStrategy的Humanize(DateTime input, DateTime comparisonBase, CultureInfo? culture)在应用启动时任何Humanize调用之前赋值Configurator.DateTimeHumanizeStrategy输出本地化文本时优先复用Configurator.GetFormatter(culture)解析的IFormatter.DateHumanize(...)以保持与框架其余部分一致的本地化资源。需要说明的适用前提Configurator的注释明确建议仅启动时设置一次避免运行期变更因此切换策略应放在组合根/启动代码中而不是每次请求内切换。小结DefaultDateTimeHumanizeStrategy是DateTime.Humanize()的默认实现它通过IDateTimeHumanizeStrategy接口暴露单一Humanize(input, comparisonBase, culture)方法内部将计算委托给DateTimeHumanizeAlgorithms.DefaultHumanize的固定阈值阶梯并结合Tense与本地化IFormatter产出 a minute ago、3 weeks from now 这类结果。理解了它的调用链扩展方法 →Configurator.DateTimeHumanizeStrategy→ 算法类 → Formatter和阈值表读者既能准确预测各时间跨度下的输出也能基于同一接口实现并注册自己的时间距离策略。API 参考DefaultDateTimeHumanizeStrategy、IDateTimeHumanizeStrategy、Configurator核心实现DefaultDateTimeHumanizeStrategy.cs、DateTimeHumanizeAlgorithms.cs、DateHumanizeExtensions.cs、Configurator.cs行为验证DateHumanizeDefaultStrategyTests.cs、DateTimeHumanizePrecisionStrategyTests.cs、DateHumanize.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点击查看免费下载相关推荐Humanizer 默认日期人性化策略解析DefaultDateTimeHumanizeStrategy 的算法、调用链与本地化原理Humanizer 默认日期人性化策略解析DefaultDateTimeHumanizeStrategy 的算法、调用链与本地化原理 导读 DefaultDa开发工具Humanizer 小数秒时间跨度人性化策略IFractionalTimeSpanHumanizeStrategy 接口深度解析与自定义实现指南Humanizer 小数秒时间跨度人性化策略IFractionalTimeSpanHumanizeStrategy 接口深度解析与自定义实现指南 导读 当 T开发工具Humanizer 的 ITimeOnlyHumanizeStrategy为 TimeOnly.Humanize 定制时间人化策略Humanizer 的 ITimeOnlyHumanizeStrategy为 TimeOnly.Humanize 定制时间人化策略 导读 本文围绕 Human开发工具上一篇tracking.js国际化支持多语言视觉应用开发下一篇Area51存档格式扩展示例新游戏模式数据创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Bindu Gateway Planner 深度指南:多智能体协作的规划中枢与其底层实现 【免费下载链接】Bindu Bindu: The identity, communication, and payments layer for AI agents. 项目地址: https://gitcode.com/gh_mirrors/bin/Bindu 点击查看 免费下载 导读
gateway/agents/planner.md 是 Bindu Gateway 中 planner 智能体的完整定义——它既… · 2026/9/25 3:23:57
DRV8701E栅极驱动芯片:从原理图到智能车竞赛落地的完整指南 /* 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 3:23:57
ESP32 轻量应用平台:基于 LittleFS 与 JSON 实现应用即目录 /* 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 4:58:03
C++ Primer高清PDF下载指南:版本选择、质量判断与高效学习路线 /* 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 4:58:02
AD620+LM358小信号采集电路:从原理到PCB布局的工程实践 /* 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 4:58:02
S32K ADC寄存器深度解析与DMA协同优化 /* 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 4:58:02
Ozone嵌入式调试原理:硬件级追踪与RTOS深度分析 /* 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 4:58:02
GDS版图从入门到精通:层次结构、生成流程与-uniquifycellnames避坑指南 /* 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 4:57:55
创维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 /* 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