java - 使用 Joda-Time 根据给定的 Period 向下舍入 DateTime

标签 java datetime jodatime

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

示例 1:

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

示例 2:

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

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

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

最佳答案

下面的示例是一种解决方案,以防您可以以天为单位表达期限(可以修改为周、月等)。使用 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

关于java - 使用 Joda-Time 根据给定的 Period 向下舍入 DateTime,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16514961/

相关文章:

java - 无法使用 spring security 进行身份验证。输入凭据后

java - 模拟resttemplate来测试作为restFul客户端的服务

python - 当日期不唯一时,在 Pandas 中按日期分组后计算观察结果

python - 从 PST/PDT(Facebook 时间戳)转换为 UTC

减法时的 Python timedelta 行为

java - Joda Time 发现小时之间的差异

java - 如何使用 Java 中的 Joda 日期/时间库获取 “this week” 的日期/时间范围?

java - 如何从 Lucene 5.x 中的字段中获取 n 个第一项?

java - 无法解析完成方法——从 Android Studio 方法调用

java - 使用 joda time 确定 if 语句持续多长时间(处理)