Mik*_*und 4 c# time rounding nodatime
我有一些LocalDateTimes 需要根据定义的分钟列表将一天中的时间向上/向下舍入到最接近的分钟数。例如,如果我有日期时间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>可以应用,为LocalTime,LocalDateTime,OffsetDateTime和OffsetTime(在2.3+)使用With方法。
这将非常容易地帮助截断案例:
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);
}
Run Code Online (Sandbox Code Playgroud)
(请注意,如果您将 aminuteGranularity设为 7 或其他不是 60 的因数,它仍将截断为始终从小时开始的时间段。)
但是,没有办法提前日期。调整器机制也适用于 a Func<LocalDateTime, LocalDateTime>- 您可以将其应用于LocalDateTime, OffsetDateTime。但是,是的,您需要编写代码来自己进行调整。正如您所说,您可能需要多种不同的选项来进行舍入,而 Noda Time 很难涵盖所有可能的用例。
我绝对推荐编写一个方法来创建一个调整器,而不是仅仅编写一个接受 aLocalDateTime和分钟数的方法——它提供了一种让你非常容易地传递调整器的方法,正如我所展示的,它适合野田时间自己的调整。(查看我们提供的开箱即用的TimeAdjusters和DateAdjusters类。)
如果您需要帮助编写特定的调整器,这可能值得在单独的问题中提出。我不希望它需要双循环等。
| 归档时间: |
|
| 查看次数: |
819 次 |
| 最近记录: |