3

我有这个代码:

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

2 回答 2

1

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

于 2021-07-10T11:28:03.223 回答
0

似乎目前在 Humanizer 中不可能做你想做的事。

查看第 102 行的PrecisionHumanize()方法,如果天数超过 365,则只返回年份。而且总的来说,似乎只能返回一种时间长度,没有年月分秒只有最大的一个

但是请查看另一个名为NodaTime的库,它可能可以做你想做的事。

这是与您的问题类似的另一个问题的链接。

于 2021-07-11T15:53:21.187 回答