在java中我们如何将时间四舍五入到最近的小时和分钟?

Sri*_*vas 4 java time

我有一个有时间的字符串.我需要把它四舍五入到最近的小时和最近的一分钟.我怎么在java中做到这一点?例如:字符串时间="12:58:15"; 我需要把它整理到1:00:00和12:58:00

Fer*_*lez 20

对于日历操作,您必须使用Calendar类.在你的情况下你会做这样的事情:

package test;

import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

public class TestDate {

    public static void main(String[] args) {
        Calendar c = new GregorianCalendar();
        c.set(Calendar.HOUR_OF_DAY, 12);
        c.set(Calendar.MINUTE, 58);
        c.set(Calendar.SECOND, 15);
        Date d = c.getTime();

        System.out.println("Start point: " + d.toString());
        System.out.println("Nearest whole minute: " + toNearestWholeMinute(d));
        System.out.println("Nearest whole hour: " + toNearestWholeHour(d));
    }

    static Date toNearestWholeMinute(Date d) {
        Calendar c = new GregorianCalendar();
        c.setTime(d);

        if (c.get(Calendar.SECOND) >= 30)
            c.add(Calendar.MINUTE, 1);

        c.set(Calendar.SECOND, 0);

        return c.getTime();
    }

    static Date toNearestWholeHour(Date d) {
        Calendar c = new GregorianCalendar();
        c.setTime(d);

        if (c.get(Calendar.MINUTE) >= 30)
            c.add(Calendar.HOUR, 1);

        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);

        return c.getTime();
    }

}
Run Code Online (Sandbox Code Playgroud)

结果如下:

Start point: Tue Nov 22 12:58:15 CET 2011
Nearest whole minute: Tue Nov 22 12:58:00 CET 2011
Nearest whole hour: Tue Nov 22 13:00:00 CET 2011
Run Code Online (Sandbox Code Playgroud)

  • 舍入时,你还应该将`Calendar.MILLISECOND`设置为'0`,而不仅仅是秒(和分钟). (3认同)

Bak*_*alf 8

在 Java 8 中,您可以使用 java.time.LocalDateTime 或 ZonedDateTime(时区)。这将让您开始四舍五入到最接近的小时:

String mytime = "2019-05-21 13:41:50";

// Convert String to LocalDateTime
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(mytime, dtf);

// If minutes equals 30 or more, add 1 hour
int minutes = localDateTime.getMinute();
if (minutes >= 30)
{
    localDateTime = localDateTime.plusHours(1);
}

// Round down
localDateTime = localDateTime.truncatedTo(ChronoUnit.HOURS)

// Back to String (OP wants the end result to be of type String)    
String roundedTime = dtf.format(localDateTime);
System.out.println(roundedTime);
Run Code Online (Sandbox Code Playgroud)

例如:"2019-05-21 13:41:50"将打印为2019-05-21 14:00:00

  • 为了四舍五入到整个小时,我建议使用“localDateTime.truncatedTo(ChronoUnit.HOURS)”(它也会消除任何纳秒)。 (4认同)

AHu*_*ist 1

一种方法是首先使用SimpleDateFormat及其解析方法将其转换为 Date (javadoc 将解释您需要的格式)。然后你可以查看秒数并确定是否应该增加一分钟还是减少(如果增加,请将秒设置为 0 并添加一分钟)。同样,对于小时,只需查看分钟,如果小于 30,则向下舍入,如果大于 30,则设置为零并增加小时。