c# - 日期时间的人性化器
问题描述
我有这个代码:
Configurator.DateTimeHumanizeStrategy = new PrecisionDateTimeHumanizeStrategy(.75);
var dateTime1 = DateTime.UtcNow.AddYears(2).AddMonths(-5);
var text1 = dateTime1.Humanize();
在 text1 变量中,我得到“一年后”。但这不是很准确。有没有办法得到“从现在起一年零七个月”?
更新1:
解决方案@Daniel Hoffman 有一些问题,例如,如果我的日期是过去的:
//UtcNow is 11.07.2021
var dateTime6 = new DateTime(2021, 4, 24);
TimeSpan dateTimeSpan6 = dateTime6 - DateTime.UtcNow;
var text6 = dateTime6.Humanize();
string textSpan6 = dateTimeSpan6.Humanize(maxUnit: TimeUnit.Year, precision: 2);
然后我得到“2 个月,11 周”,其中包含两次基本相同的信息,但单位不同。
更新 2:
我已经通过使用 Duration() 方法解决了过去日期的问题:
var timeSpan = date - DateTime.UtcNow;
return timeSpan.Duration().Humanize(maxUnit: TimeUnit.Year, precision: 2, minUnit: TimeUnit.Day);
解决方案
[编辑]:使用 TimeSpan 将允许您指定经期的精确度,但您将失去拥有“昨天”或“明天”的能力,并且省略了“以前”或“从现在开始”,所有这些都是本地化。部分解决方法是对小于 366 天的 TimeSpan.Humanize 使用 TimeSpan.Humanize 方法,否则使用 DateTime.Humanize。如果它只用于一种语言,用户可以根据时间跨度是否为负数附加适当的文本。
您可以将精度参数与 TimeSpan 一起使用:
TimeSpan periodFromNow = DateTime.UtcNow.AddYears(2).AddMonths(-5) - DateTime.UtcNow;
然后:
string myPeriodFromNow = periodFromNow.Humanize(maxUnit: TimeUnit.Year, precision: 2);
其他示例:
TimeSpan.FromDays(486).Humanize(maxUnit: TimeUnit.Year, precision: 7) => "1 year, 3 months, 29 days" // One day further is 1 year, 4 month
TimeSpan.FromDays(517).Humanize(maxUnit: TimeUnit.Year, precision: 7) => "1 year, 4 months, 30 days" // This month has 30 days and one day further is 1 year, 5 months
推荐阅读
- python - 以python保留顺序合并两个或多个列表的最佳方法
- javascript - 如何使用 Fetch API 根据屏幕大小检索不同的 html 文件,并将其显示在 div 中
- django - 用 APIReqFactory 或 mock 测试 django 的正确方法是什么?
- typescript - 如何强制 TypeScript 对函数返回值进行多余的属性检查
- django - Django Form 没有显示在模板文件中,也没有出现任何错误
- javascript - 更改输入类型文本字段中的内容
- javascript - AudioContext Web 音频 API 在 IE(11) 中不起作用
- python - 使用正则表达式检查 for,from,of 之前的名词是否为单数
- scala - Scala Flink get java.lang.NoClassDefFoundError: scala/Product$class after using case class for customed DeserializationSchema
- php - 我可以使用 HTML 和 CSS 为 IBM Watson 机器人创建插件以将机器人集成到我的网站吗?