Java日期舍入

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

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

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

Date now = new Date(); Date nearestMinute = DateUtils.round(now, Calendar.MINUTE); 

没有第三方库的方法(虽然可能不那么优雅而且不那么灵活):添加一半字段(对于分钟 – 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 ); 

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

您可以使用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 ) 

最佳解决方案是使用Apache commons中的DateUtils。 但是,如果您想避免导入它们,那么这将是Java中的解决方案。 不确定这是否符合“优雅解决方案”的意思。

 /** Takes given date and returns date rounded to nearest minute */ public Date roundToMin(Date d){ Calendar date = new GregorianCalendar(); date.setTime(d); int deltaMin = date.get(Calendar.SECOND)/30; date.set(Calendar.SECOND, 0); date.set(Calendar.MILLISECOND, 0); date.add(Calendar.MINUTE, deltaMin); return date.getTime(); } 

如果我可以使用普通Java实现这一点,我尽量不使用其他库:

  new Date( ((new Date().getTime() + 500) / 1000) * 1000 ) 

添加commons-lang jar只是为了绕日期不是一个好主意,我更喜欢这个函数:

 public static Date round(Date d) { try { SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy"); return sdf.parse(sdf.format(d)); } catch (ParseException ex) { //This exception will never be thrown, because sdf parses what it formats return d; } } 

在下面的函数“roundBy”中,可以对日期进行舍入
可选地按秒/分钟/小时/天。
这可能不准确,但希望这个想法很清楚

 public static final long MILLISECONDS_IN_SECOND = (long)(1000); public static final long MILLISECONDS_IN_MINUTE = (MILLISECONDS_IN_SECOND * 60); public static final long MILLISECONDS_IN_HOUR = (MILLISECONDS_IN_MINUTE * 60); public static final long MILLISECONDS_IN_DAY = (MILLISECONDS_IN_HOUR * 24); 
 public synchronized static Date roundBy(Date date, long UNIT) { long time = date.getTime(); long timeOutOfUnit= time % UNIT; time -= timeOutOfUnit; if(timeOutOfUnit >= (UNIT / 2)) { time += UNIT; } return new Date(time); }