【问题标题】:Round down a DateTime based on a given Period using Joda-Time使用 Joda-Time 根据给定期间向下舍入 DateTime
【发布时间】:2013-05-07 01:38:29
【问题描述】:

给定一个时间段,例如 3 天或 5 周(只有一个字段类型的时间段),我想将给定的 DateTime 舍入到该时间段的最接近单位(即,忽略 '5 天内的 5 ')。例子:

示例 1:

  • 周期: 3 天。
  • 日期时间: UTC 星期三凌晨 4:26 (2013-05-15T04:26:00Z)
  • 四舍五入的日期时间: UTC 周三午夜 (2013-05-15T00:00:00Z)

示例 2:

  • 周期: 5 周。
  • 日期时间: UTC 星期三凌晨 4:26 (2013-05-15T04:26:00Z)
  • 四舍五入的日期时间: UTC 星期一午夜 (2013-05-13T00:00:00Z)

我最初的想法是使用PeriodDurationFieldType getFieldTypes() 方法,并将DateTime 中的每个匹配字段(最大字段下方)设置为零。但是,我不知道如何从DateTime 获取DateTimeFieldTypes,以及如何将它们与DurationFieldType 进行比较。

我宁愿不做一个巨大的if else 方法。

【问题讨论】:

    标签: java datetime jodatime


    【解决方案1】:

    下面的示例是一个解决方案,以防您可以用天表示周期(可以修改为周、月等)。使用 DateTime Joda Java 库。

    不幸的是,您需要四舍五入,我看到了可能的问题。从计算周期开始,您需要有一个时间起点。在下面的示例中,我们计算自 1970/01/01 00:00:00 UTC 以来的周期。还是您实际上要求从一个月(年)的第一天等获得 3 天的时间?这会更有意义。

    您需要问自己的问题:闰日会发生什么?

    Java 方法

    DateTime roundDays(DateTime dt, int windowDays) {
        Duration p = Duration.standardDays(windowDays);
    
        long t = dt.getMillis() / p.getMillis() * p.getMillis();
        // Keep TimeZone and round floor to a day
        return new DateTime(t, dt.getZone()).dayOfMonth().roundFloorCopy();
    }
    

    使用示例:

    DateTime dt = new DateTime(1385578964580L, DateTimeZone.UTC);
    
    System.out.println(roundDays(dt, 3));
    System.out.println(roundDays(dt.plusDays(2), 3));
    System.out.println(roundDays(dt.plusDays(4), 3));
    System.out.println(roundDays(dt.plusDays(6), 3));
    
    // Prints data rounded to every 3 days
    // 2013-11-26T00:00:00.000Z
    // 2013-11-29T00:00:00.000Z
    // 2013-11-29T00:00:00.000Z
    // 2013-12-02T00:00:00.000Z
    

    【讨论】:

    • 我能够以你的例子和回合分钟,它工作得很好。感谢发帖!
    【解决方案2】:

    评论太长了:

    不清楚“四舍五入”是什么意思。首先,您应该处理LocalDateTimes,而不是DateTimes(它们是非常不同的东西,请参阅我的回答here)。

    在我看来,您想将分辨率低于“周期”单位的所有字段设置为零,然后将下一个字段设置为给定值的倍数...是这样吗?然后,我不明白您的第二个示例(5 周在哪里?),无论如何,这将被错误地指定:如何处理“40 个月”的期限?

    【讨论】:

    • 是的,我发现很难表达我的问题。你完全理解。 40 个月的期限与 1 个月完全相同。我将使用LocalDateTime 进行调查。
    • 但是,再次,您介意解释一下您是如何获得“5 周”的 2013-05-13 的吗?您是在计算一年中的周数,还是选择最接近的 5 倍数?
    • 我只关心单位“周”,并将给定的DateTime 向下舍入到最近一周的开始。与 40 个月相同,我想向下舍入到最接近的月份(从给定的 DateTime)。我必须接受诸如 40 个月之类的期限,但此计算只需要 month 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-11
    • 2017-01-11
    • 2022-11-19
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多