给定一个时间段,例如 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)
我最初的想法是使用 Period
的 DurationFieldType 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/