总是在下一刻钟前四舍五入

时间:2020-05-30 21:16:39

标签: java

我们要求使用Java代码在下一个四分之一钟前四舍五入,例如:

  1. 如果当前日期时间是2020-05-28T10:01:00 然后,向上舍入到下一季度,使其达到2020-05-28T10:15:00

  2. 如果当前日期时间是2020-05-28T10:15:01 然后,向上舍入到下一季度,使其达到2020-05-28T10:30:00

  3. 如果当前日期时间是2020-05-28T10:46:15 然后,向上舍入到下一季度,使其达到2020-05-28T11:00:00

  4. 如果当前日期时间是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());
        }
    }

2 个答案:

答案 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 DateCalendarSimpleDateFormat类已过时。它们可以在简单的情况下工作,但是在更复杂的情况下会造成麻烦。参见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());
相关问题