与NodaTime四舍五入时间



我有一些LocalDateTime,我需要根据定义的分钟列表将一天中的时间向上/向下舍入到最接近的分钟数。 例如,如果我有日期时间2018-03-20T12:13:47并且我必须将其四舍五入到接下来的半小时(因此分钟是 00 或 30),我会得到2018-03-20T12:30:00。四舍五入会得到2018-03-20T12:00:00.

四舍五入可以是任意分钟,例如每 10 分钟(0、10、20、30、40、50)、每刻钟 (0、15、30、45),或者说到四分之一或之后 (15, 45)。这意味着舍入日期可能会在另一个日期结束。

NodaTime中是否有任何功能可以帮助进行此舍入,还是我必须自己编写?我现在有一个工作版本,但它包括双循环和在午夜添加小时和分钟。

有一种功能会有所帮助:">调整器"的想法。如果您编写自己的方法返回Func<LocalTime, LocalTime>则可以使用With方法将其应用于LocalTimeLocalDateTimeOffsetDateTimeOffsetTime(在 2.3+ 中)。

这将有助于非常容易地处理截断情况:

using System;
using NodaTime;
class Test
{
static void Main()
{
var truncator = CreateTruncator(10);
var start = new LocalDateTime(2018, 3, 21, 7, 32, 15);
var truncated = start.With(truncator);
Console.WriteLine(truncated); // 2018-03-21T07:30:00
}
static Func<LocalTime, LocalTime> CreateTruncator(int minuteGranularity) =>
input => new LocalTime(
input.Hour,
input.Minute / minuteGranularity * minuteGranularity);
}

(请注意,如果您给出的minuteGranularity为 7 或其他不是 60 倍的值,它仍将截断为始终从小时开始的时间段。

但是,没有办法提前日期。调节器机制也适用于Func<LocalDateTime, LocalDateTime>- 您可以将其应用于LocalDateTimeOffsetDateTime。但是,是的,您需要编写代码来自己进行该调整。正如您所说,您可能需要许多不同的四舍五入选项,而Noda Time很难涵盖所有可能的用例。

我绝对建议编写一个方法来创建一个调整器,而不仅仅是编写一个接受LocalDateTime和几分钟的方法 - 它提供了一种非常容易地传递调整器的方法,正如我所展示的,它符合 Noda Time 自己的调整。(在TimeAdjustersDateAdjusters类中查找我们提供的开箱即用的课程。

如果您需要帮助编写特定的调整器,这可能值得在单独的问题中提出。我不希望它需要双循环等。

最新更新