【问题标题】:In java how do we round off time to nearest hour and minute?在java中,我们如何将时间四舍五入到最接近的小时和分钟?
【发布时间】:2011-11-22 20:17:24
【问题描述】:

我有一个有时间的字符串。我需要将它四舍五入到最近的小时和最近的分钟。我如何在Java中做到这一点? 例如:字符串时间=“12:58:15”; 我需要将它四舍五入到 1:00:00 和 12:58:00

【问题讨论】:

标签: java time


【解决方案1】:

对于日历操作,您必须使用 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

【讨论】:

  • 感谢您的回复。我需要使用上面提到的 String 对象,因为我将从文本文件中获取它。
  • 舍入时,还应将Calendar.MILLISECOND 设置为0,而不仅仅是秒(和分钟)。
  • 嗯,你“必须”使用Calendar 类?不,您可以使用原语long 来执行此逻辑。例如:long now = System.currentTimeMillis(); long rounded = now - now % 60000;一旦你有一个长,你可以做任何你想做的。
【解决方案2】:

在 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

【讨论】:

  • 为了四舍五入到整小时,我推荐localDateTime.truncatedTo(ChronoUnit.HOURS)(它也会摆脱任何纳秒)。
  • @OleV.V.是的,你是对的。在我上面的回答中, DateTImeFormatter 也会“照顾”它,因为最终结果是一个字符串。我会更新我的答案!
【解决方案3】:

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

【讨论】:

  • 感谢您的回复。我需要使用上面提到的 String 对象,因为我将从文本文件中获取它。
  • 您可以使用简单的日期格式转换为日期,执行您的工作,然后使用它转换回字符串。可能比解析字符串的所有可能排列更可靠。但是,如果你愿意,你可以用艰难的方式来做。
【解决方案4】:

使用 SimpleDateFormat 创建一个日期。 从日期创建 GregorianCalendar。 将分钟或秒滚动 30。 然后将分钟或秒设置为 0。

【讨论】:

  • 感谢您的回复。我需要使用上面提到的 String 对象,因为我将从文本文件中获取它。
【解决方案5】:
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();
    }

}

【讨论】:

    【解决方案6】:

    嗯,最好的答案是最简单的一个

      /**
       * 2020-01-01 10:00:55 is transformed into 2020-01-01 10:00:00
       * 2020-01-01 10:20:55 is transformed into 2020-01-01 10:00:00
       * 2020-01-01 10:30:01 is transformed into 2020-01-01 11:00:00
       * @return the Timestamp rounded to the nearest hour
       */
      public static Timestamp roundTimestampToNearestHour(Timestamp input){
        return Timestamp.from(Instant.ofEpochMilli(((input.getTime()+1800000)/(60000*60))*(60000*60)));
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 2011-01-22
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多