Java日期舍入

dar*_*nmc 26 java

我想要一种优雅的方法将java Date向上或向下舍入到最近的分钟(或秒,小时,天).

例如,"Wed Wed 25 10:36:34 GMT 2012"的日期四舍五入到最接近的分钟将是"Wed Jan 25 10:37:00 GMT 2012"

Gui*_*ido 50

如果您使用Apache commons-lang,则可以使用DateUtils来舍入日期:

Date now = new Date();
Date nearestMinute = DateUtils.round(now, Calendar.MINUTE);
Run Code Online (Sandbox Code Playgroud)

  • 干杯,truncate()对于始终向下舍入也很有用 (10认同)

Wiz*_*art 26

没有第三方库的方法(虽然可能不那么优雅而且不那么灵活):添加一半字段(按分钟舍入 - 30秒)并将此字段和较低的字段设置为零.

Calendar calendar = ... // assume you already have it with a specified Date value

// 'add' cause changing larger fields if necessary
calendar.add( Calendar.SECOND, 30 ); 
calendar.set( Calendar.SECOND, 0 );
calendar.set( Calendar.MILLISECOND, 0 );
Run Code Online (Sandbox Code Playgroud)

如果当前值小于30秒,则"添加"时分钟值不会改变.否则,它将增加1.在任何情况下,秒和较低值都归零.所以我们有一个四舍五入.

  • 谢谢,是的,避免依赖第三方库很好 (2认同)

Gui*_*ume 8

你可以使用Apache-commons' DateUtils.

import org.apache.commons.lang.time.FastDateFormat;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;

FastDateFormat dtFormat = DateFormatUtils.ISO_DATETIME_FORMAT;

Date now = new Date( );
Date nearestHour = DateUtils.round( now, Calendar.HOUR );
Date nearestDay = DateUtils.round( now, Calendar.DAY_OF_MONTH );
Date nearestYear = DateUtils.round( now, Calendar.YEAR );

System.out.println( "Now: " + dtFormat.format( now ) );
System.out.println( "Nearest Hour: " + dtFormat.format( nearestHour ) );
System.out.println( "Nearest Day: " + dtFormat.format( nearestDay ) );
System.out.println( "Nearest Year: " + dtFormat.format( nearestYear )
Run Code Online (Sandbox Code Playgroud)


小智 7

要使用 Apache commons-lang 向上/向下舍入,您可以使用以下方法:

  • 舍入使用DateUtils.ceiling(date, Calendar.HOUR)
  • 向下舍入使用DateUtils.truncate(date, Calendar.HOUR)
  • 四舍五入到最接近的单位使用DateUtils.round(date, Calendar.HOUR)

参见示例:

    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");

    String sDate1 = "11-05-2019 19:01:00";
    Date date1 = formatter.parse(sDate1);
    System.out.println(DateUtils.round(date1, Calendar.HOUR));    // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.truncate(date1, Calendar.HOUR)); // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.ceiling(date1, Calendar.HOUR));  // Sat May 11 20:00:00 MSK 2019

    String sDate2 = "11-05-2019 19:29:00";
    Date date2 = formatter.parse(sDate2);
    System.out.println(DateUtils.round(date2, Calendar.HOUR));    // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.truncate(date2, Calendar.HOUR)); // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.ceiling(date2, Calendar.HOUR));  // Sat May 11 20:00:00 MSK 2019

    String sDate3 = "11-05-2019 19:30:00";
    Date date3 = formatter.parse(sDate3);
    System.out.println(DateUtils.round(date3, Calendar.HOUR));    // Sat May 11 20:00:00 MSK 2019
    System.out.println(DateUtils.truncate(date3, Calendar.HOUR)); // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.ceiling(date3, Calendar.HOUR));  // Sat May 11 20:00:00 MSK 2019

    String sDate4 = "11-05-2019 19:31:00";
    Date date4 = formatter.parse(sDate4);
    System.out.println(DateUtils.round(date4, Calendar.HOUR));    // Sat May 11 20:00:00 MSK 2019
    System.out.println(DateUtils.truncate(date4, Calendar.HOUR)); // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.ceiling(date4, Calendar.HOUR));  // Sat May 11 20:00:00 MSK 2019

    String sDate5 = "11-05-2019 19:59:00";
    Date date5 = formatter.parse(sDate5);
    System.out.println(DateUtils.round(date5, Calendar.HOUR));    // Sat May 11 20:00:00 MSK 2019
    System.out.println(DateUtils.truncate(date5, Calendar.HOUR)); // Sat May 11 19:00:00 MSK 2019
    System.out.println(DateUtils.ceiling(date5, Calendar.HOUR));  // Sat May 11 20:00:00 MSK 2019
Run Code Online (Sandbox Code Playgroud)


ber*_*lus 5

这是 Java8+ 的答案:

public static Instant roundHalfUp(Instant instant, TemporalUnit unit) {
    return instant.plus(unit.getDuration().dividedBy(2))
            .truncatedTo(unit);
}
Run Code Online (Sandbox Code Playgroud)

要将日期四舍五入到分钟,请使用日期->即时->日期转换:

Date.from(roundHalfUp(date.toInstant(), ChronoUnit.MINUTES))
Run Code Online (Sandbox Code Playgroud)