使用NodaTime舍入时间 - c#

我有一些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>的方法,则可以使用LocalTime方法将其应用于LocalDateTimeOffsetDateTimeOffsetTimeWith(在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类中查找我们提供的现成类。)

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

与哪些运算符>>兼容 - java

我这里没有什么代码int b=3; b=b >> 1; System.out.println(b); 它可以完美工作,但是当我将变量b更改为byte,short,float,double时,它包含错误,但是对于变量int和long来说,它可以完美工作,为什么它不能与其他变量一起工作? 参考方案 位移位运算符(例如>>)与任何整数类型兼…

>> Python中的运算符 - python

>>运算符做什么?例如,以下操作10 >> 1 = 5有什么作用? 参考方案 它是右移运算符,将所有位“右移”一次。二进制10是1010移到右边变成0101这是5

Python 3运算符>>打印到文件 - python

我有以下Python代码编写项目的依赖文件。它可以在Python 2.x上正常工作,但是在使用Python 3进行测试时会报告错误。depend = None if not nmake: depend = open(".depend", "a") dependmak = open(".depend.mak&#…

PHP set_time_limit无效 - php

我有一个非常痛苦的慢脚本,该脚本从MySQL获取大量数据并从中创建大量报告,并最终以应用程序/强制下载的形式提供给用户。长话短说,在生产服务器上,它会在大约30秒后终止(相当稳定),然后吐出一个空文件。在开发服务器上,它可以正常工作,但是执行时间却要长得多-大约90秒。为了安全起见,我将php.ini文件设置为max_execution_time = 200…

Java日期时间为ISO_DATE_TIME - java

我想在Java中DateTimeFormatter ISO_DATE_TIME的末尾添加一个Z,而不是硬编码String sample = "2018-05-11T13:35:11Z"; DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd'T&#…