我们要求使用Java代码在下一个四分之一钟前四舍五入,例如:
如果当前日期时间是2020-05-28T10:01:00 然后,向上舍入到下一季度,使其达到2020-05-28T10:15:00
如果当前日期时间是2020-05-28T10:15:01 然后,向上舍入到下一季度,使其达到2020-05-28T10:30:00
如果当前日期时间是2020-05-28T10:46:15 然后,向上舍入到下一季度,使其达到2020-05-28T11:00:00
如果当前日期时间是2020-12-31T23:47:00 然后,向上舍入到下一个季度,使其达到2021-01-01T00:00:00
有人可以提供Java代码来实现此目的吗?任何帮助表示赞赏。
尝试以下代码,但无法获得我正在寻找的输出:
import java.util.Calendar;
import java.util.Date;
public class Main {
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
int round = calendar.get(Calendar.MINUTE) % 15;
calendar.add(Calendar.MINUTE, round < 8 ? -round : (15-round));
calendar.set( Calendar.SECOND, 0 );
System.out.println(calendar.getTime());
}
}
答案 0 :(得分:3)
可以使用LocalDateTime
包中的java.time
类轻松地完成此操作,无论如何,您都应该使用该类 1 。
public static LocalDateTime roundUpToQuarter(LocalDateTime datetime) {
int minutesToAdd = 15 - (datetime.getMinute() % 15);
return datetime
.plusMinutes(minutesToAdd)
.truncatedTo(ChronoUnit.MINUTES);
}
此计算涉及模数运算符,可确保我们得到加到下一个完整季度的分钟数。 truncatedTo(ChronoUnit.MINUTES)
调用依次将所有小于“分钟”的字段设置为零。
更新:我不确定您确切的用例,但是正如Basil指出的那样,如果您想在时间轴上表示片刻,那么您还需要时区或偏移量。可以通过上述方法中的LocalDateTime
实例替换ZonedDateTime
实例来实现。
1 Date
,Calendar
和SimpleDateFormat
类已过时。它们可以在简单的情况下工作,但是会在更复杂的情况下会造成麻烦。参见What's wrong with Java Date & Time API?。
答案 1 :(得分:0)
您可以尝试以下代码。
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date(1609438620000l));
int fraction = calendar.get(Calendar.MINUTE) / 15;
switch (fraction) {
case 0: {
calendar.set(Calendar.MINUTE, 0);
break;
}
case 1: {
calendar.set(Calendar.MINUTE, 15);
break;
}
case 2: {
calendar.set(Calendar.MINUTE, 30);
break;
}
default: {
calendar.set(Calendar.MINUTE, 45);
break;
}
}
calendar.add(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);
System.out.println(calendar.getTime());