[英]Round down a DateTime based on a given Period using Joda-Time
给定一个周期,例如3天或5周(一个字段只有一种字段类型的周期),我想将给定的DateTime
舍入到该周期的最接近单位(即,忽略“ 5天”中的5个)。 例子:
范例1:
范例2:
我最初的想法是使用Period
的DurationFieldType getFieldTypes()
方法,并为DateTime
每个匹配字段(在最大字段下方)将它们设置为零。 不过,我不知道如何让DateTimeFieldType
从A S DateTime
以及如何将它们比作DurationFieldType
。
我宁愿不采取if else
措施。
波纹管示例是一种解决方案,以防您可以以天为单位表示期限(可以修改为几周,几个月等)。 使用DateTime Joda Java库。
不幸的是,四舍五入需要您看到可能的问题。 自计算周期以来,您需要有一个起点。 在下面的示例中,我们计算自1970/01/01 00:00:00 UTC以来的时间段。 还是您实际上是在要求从一个月(年)的第一天开始算起3天的期限? 这会更有意义。
您需要问自己的问题:leap日会发生什么?
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
评论时间过长:
目前尚不清楚“四舍五入”是什么意思。 首先,您应该处理LocalDateTime
,而不要处理DateTime
(它们是非常不同的东西,请在此处查看我的答案)。
在我看来,您希望将所有分辨率低于“周期”单位的字段设置为零,然后将下一个字段设置为给定值的倍数……是这样吗? 然后,我不明白您的第二个示例(5个星期在哪里?),无论如何,这将被错误地指定:如何处理“ 40个月”?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.