Sea*_*oyd 80
您需要使用modulo来截断四分之一小时:
Date whateverDateYouWant = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(whateverDateYouWant);
int unroundedMinutes = calendar.get(Calendar.MINUTE);
int mod = unroundedMinutes % 15;
calendar.add(Calendar.MINUTE, mod < 8 ? -mod : (15-mod));
Run Code Online (Sandbox Code Playgroud)
正如EJP所指出的,这也没关系(替换最后一行,只有在日历宽松的情况下才有效):
calendar.set(Calendar.MINUTE, unroundedMinutes + mod);
Run Code Online (Sandbox Code Playgroud)
如果您想要准确,您还必须截断较小的字段:
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
Run Code Online (Sandbox Code Playgroud)
您还可以使用DateUtils.truncate()从Apache的共享/郎做到这一点:
calendar = DateUtils.truncate(calendar, Calendar.MINUTE);
Run Code Online (Sandbox Code Playgroud)
Dir*_*irk 22
如果您只想向下舍入,这是一个使用Java Time API的更易读的版本:
LocalDateTime time = LocalDateTime.now();
LocalDateTime lastQuarter = time.truncatedTo(ChronoUnit.HOURS)
.plusMinutes(15 * (time.getMinute() / 15));
Run Code Online (Sandbox Code Playgroud)
输出:
2016-11-04T10:58:10.228
2016-11-04T10:45:00
小智 10
这很简单,找到自1970年以来的季度数量为双倍,四舍五入并乘以15分钟:
long timeMs = System.System.currentTimeMillis();
long roundedtimeMs = Math.round( (double)( (double)timeMs/(double)(15*60*1000) ) ) * (15*60*1000) );
Run Code Online (Sandbox Code Playgroud)
用它设置日期或日历对象.
有了上面的答案,你最终得到了所有有趣的代码来处理溢出到几小时,几天等.
我将使用自纪元以来的ms时间.
添加7.5分钟或7.5x60x1000 = 450000
并截断为900000的倍数
new Date(900000 * ((date.getTime() + 450000) / 900000))
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为ms时间开始的时间恰好是00:00:00.而且由于世界上所有时区都以15分钟的步长变化,这不会影响四舍五入.
(哎呀,我有一个0太多,忘了一些重要的括号:现在还为时尚早)
Java 8的注释实现.接受任意舍入单位和增量:
public static ZonedDateTime round(ZonedDateTime input, TemporalField roundTo, int roundIncrement) {
/* Extract the field being rounded. */
int field = input.get(roundTo);
/* Distance from previous floor. */
int r = field % roundIncrement;
/* Find floor and ceiling. Truncate values to base unit of field. */
ZonedDateTime ceiling =
input.plus(roundIncrement - r, roundTo.getBaseUnit())
.truncatedTo(roundTo.getBaseUnit());
ZonedDateTime floor =
input.plus(-r, roundTo.getBaseUnit())
.truncatedTo(roundTo.getBaseUnit());
/*
* Do a half-up rounding.
*
* If (input - floor) < (ceiling - input)
* (i.e. floor is closer to input than ceiling)
* then return floor, otherwise return ceiling.
*/
return Duration.between(floor, input).compareTo(Duration.between(input, ceiling)) < 0 ? floor : ceiling;
}
Run Code Online (Sandbox Code Playgroud)
来源:我自己
精彩的帖子,非常感谢你们!这正是我所需要的:)
这是我基于工作的代码。
我的用例是“鉴于现在是上午11:47,我想设置两个日期来表示当前的5分钟帧:上午11:45和上午11:50”
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
int modulo = calendar.get(Calendar.MINUTE) % 5;
if(modulo > 0) {
calendar.add(Calendar.MINUTE, -modulo);
}
myObject.setStartDate(calendar.getTime());
calendar.add(Calendar.MINUTE, 5);
myObject.setDueDate(calendar.getTime());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52809 次 |
| 最近记录: |