В Java, как мы округляем время до ближайшего часа и минуты? - PullRequest
4 голосов
/ 23 ноября 2011

У меня есть строка, которая имеет время.Мне нужно округлить его до ближайшего часа, а также до ближайшей минуты.Как мне сделать это в Java?Пример: String time = "12:58:15";Мне нужно округлить до 1:00:00, а также 12: 58: 00

Ответы [ 5 ]

20 голосов
/ 23 ноября 2011

Для операций с календарем вы должны использовать класс 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();
    }

}

И результат:

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
1 голос
/ 21 мая 2019

В 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);

Например: "2019-05-21 13:41:50" будет напечатано как 2019-05-21 14:00:00

1 голос
/ 23 ноября 2011

Один из способов - сначала преобразовать его в Date, используя SimpleDateFormat и его метод синтаксического анализа (Javadoc объяснит нужный вам формат). Затем вы можете посмотреть на секунды и определить, следует ли вам подняться на одну минуту вверх или вниз (если она поднимется, установите секунды на 0 и добавьте минуту). Аналогично для часа, просто посмотрите на минуты и, если оно меньше 30, округлите, а если больше тридцати, установите на ноль и увеличьте час.

0 голосов
/ 11 июня 2015
package com.xyz.util;

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

public class DateTimeUtils {

    public static void main(String[] args) {
        Date date = new Date();
        date.setHours(23);
        System.out.println("prev whole hour, millies: "+toWholeHour(date,-1)+", "+toWholeHour(date,-1).getTime());
        System.out.println("curr whole hour, millies: "+toWholeHour(date,0)+", "+toWholeHour(date,0).getTime());
        System.out.println("next whole hour, millies: "+toWholeHour(date,1)+", "+toWholeHour(date,1).getTime());

        System.out.println("prev whole minute, millies: "+toWholeMinute(date,-1)+", "+toWholeMinute(date,-1).getTime());
        System.out.println("curr whole minute, millies: "+toWholeMinute(date,0)+", "+toWholeMinute(date,0).getTime());
        System.out.println("next whole minute, millies: "+toWholeMinute(date,1)+", "+toWholeMinute(date,1).getTime());
    }

    public static Date toWholeHour(Date d, int beforeOrAfter) {
        Calendar c = new GregorianCalendar();
        c.setTime(d);
        c.add(Calendar.HOUR, beforeOrAfter);
        c.set(Calendar.MINUTE, 0);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

    public static Date toWholeMinute(Date d, int beforeOrAfter) {
        Calendar c = new GregorianCalendar();
        c.setTime(d);
        c.add(Calendar.MINUTE, beforeOrAfter);
        c.set(Calendar.SECOND, 0);
        c.set(Calendar.MILLISECOND, 0);
        return c.getTime();
    }

}
0 голосов
/ 23 ноября 2011

Создать дату, используя SimpleDateFormat.Создать GregorianCalendar из даты.Сверните минуты или секунды на 30. Затем установите минуты или секунды равными 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...