我有一些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
方法将其应用于LocalTime
、LocalDateTime
、OffsetDateTime
和OffsetTime
(在 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>
- 您可以将其应用于LocalDateTime
、OffsetDateTime
。但是,是的,您需要编写代码来自己进行该调整。正如您所说,您可能需要许多不同的四舍五入选项,而Noda Time很难涵盖所有可能的用例。
我绝对建议编写一个方法来创建一个调整器,而不仅仅是编写一个接受LocalDateTime
和几分钟的方法 - 它提供了一种非常容易地传递调整器的方法,正如我所展示的,它符合 Noda Time 自己的调整。(在TimeAdjusters
和DateAdjusters
类中查找我们提供的开箱即用的课程。
如果您需要帮助编写特定的调整器,这可能值得在单独的问题中提出。我不希望它需要双循环等。