新闻详情

新闻详情

首页 / 资讯中心 / 详情

Humanizer DefaultDateTimeHumanizeStrategy 深度解析:DateTime 人性化策略的实现与定制

发布时间:2026/9/25 3:23:53来源:尧图网络
Humanizer DefaultDateTimeHumanizeStrategy 深度解析:DateTime 人性化策略的实现与定制
开发工具【免费下载链接】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),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

OpenCV 三维直方图可视化:基于 viz 模块的 3D Histogram 交互式渲染实战 2026/9/25 4:11:46

OpenCV 三维直方图可视化:基于 viz 模块的 3D Histogram 交互式渲染实战

计算机视觉图像处理机器学习 【免费下载链接】opencv_contrib 项目地址: https://gitcode.com/gh_mirrors/ope/opencv_contrib 点击查看 免费下载 本教程对应 opencv_contrib 仓库 modules/viz 模块的官方示例 histo3D.cpp 及其配套文档 histo3D.markdown。你将学习…

阅读更多 →
日志信息== 2026/9/25 4:11:46

日志信息==

从完整堆栈可以看出,问题出在 Desugar(脱糖)过程中: 核心问题:DesugaringGraphs.forVariant() 在处理 Java 8 特性降级时,需要 ASM7 支持 触发位置:DexArchiveBuilderTask 执行 DEX 构建时&…

阅读更多 →
SonarQube自定义规则开发实战:从AST到质量门禁的Java插件指南 2026/9/25 4:11:39

SonarQube自定义规则开发实战:从AST到质量门禁的Java插件指南

简介:压缩包内是一套面向SonarQube平台的Java自定义规则集,供有定制代码检测诉求的开发人员与质量保障人员参考使用。规则覆盖编码规范、潜在缺陷、复杂度等专项检查,能在标准分析之外筛出需人工关注的代码点,配合持续集成流水线中…

阅读更多 →
VSCode配置C语言开发环境:MinGW-w64实战指南 2026/9/25 4:11:32

VSCode配置C语言开发环境:MinGW-w64实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
切比雪夫阶梯阻抗变换器设计:从理论推导到ADS仿真全流程 2026/9/25 4:11:32

切比雪夫阶梯阻抗变换器设计:从理论推导到ADS仿真全流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
PowerBuilder程序部署与OLEDB跨机连接问题排查实战 2026/9/25 4:11:32

PowerBuilder程序部署与OLEDB跨机连接问题排查实战

简介:一套面向 PowerBuilder Windows 桌面开发者的 VDN 系统测试版安装包,集中演示了消息推送、微信接口、加密解密函数与二维码生成解析等企业级功能模块。项目基于 PowerBuilder 事件驱动模型,借助 PBL 对象库、PBNI 与 .NET 互操作完成扩展…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉