首页 > 解决方案 > 日期时间的人性化器

问题描述

我有这个代码:

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);

标签: c#humanizer

解决方案


[编辑]:使用 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

另见:https ://github.com/Humanizr/Humanizer#humanize-timespan


推荐阅读