2

给定一个时间段,例如 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)

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

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

4

2 回答 2

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
于 2013-11-27T19:20:18.970 回答
0

评论太长了:

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

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

于 2013-05-16T19:44:16.513 回答