DateTime 的人性化工具

Humanizer for DateTime

我有这个代码:

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 周”,其中两次包含基本相同的信息,但单位不同。

更新二:

我已经使用 Duration() 方法解决了过去日期的问题:

var timeSpan = date - DateTime.UtcNow;

return timeSpan.Duration().Humanize(maxUnit: TimeUnit.Year, precision: 2, minUnit: TimeUnit.Day);

[Edit]: Using TimeSpan will allow you to specify the precision of your period, but you will lose the ability to have "yesterday" or "tomorrow", and it omits the " ago" or " from now", all of which are localized. A partial workaround would be to use the TimeSpan.Humanize method for TimeSpans less than 366 days and DateTime.Humanize otherwise. And if it's only going to be used in one language, the user can append the appropriate text depending on if the timespan is negative.

您可以将精度参数与 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

目前在 Humanizer 中似乎无法执行您想要的操作。

查看第 102 行的方法 PrecisionHumanize(),如果天数超过 365,则仅返回 。而且一般好像只能返回一种length of time,没有yearsmonths分钟,只是最大的一个

但是请查看另一个名为 NodaTime 的库,它可能能够满足您的需求。

这里是 link 一个与您的问题类似的不同问题。