比较忽略毫秒的日期?

有没有办法比较两个日历对象,但忽略毫秒?

我编写了一个比较两个日历对象的测试用例,但是有一个问题。 虽然所有日,月,分和小时都匹配,但毫秒不匹配。 我在获得实际日期之前得到了预期的日期:

/** * @return */ private Calendar getExpectedOneMonthDateFromCurrentDate() { Calendar expectedOneMonth = Calendar.getInstance(); expectedOneMonth.add(Calendar.MONTH, -1); return expectedOneMonth; } assertEquals(getExpectedOneMonthDateFromCurrentDate(), DateRange.LAST_ONE_MONTH.getToDate()); 

从日历中删除毫秒

 cal.set(Calendar.MILLISECOND, 0); 

你需要使用

 cal.set(Calendar.MILLISECOND, 0); 

也可能

 cal.set(Calendar.SECOND, 0); 

如果你只需要分钟匹配。

将毫秒设置为0的解决方案有一个问题:如果日期为12:14:29.999和12:14:30.003,则将日期分别设置为12:14:29和12:14:30并将检测到在你不想要的地方。

我考虑过一个比较器:

 private static class SecondsComparator implements Comparator { public int compare(Calendar o1, Calendar o2) { final long difference = o1.getTimeInMillis() - o2.getTimeInMillis(); if (difference > -1000 && difference < 1000) return 0; else return difference < 0 ? 1 : -1; } } public static void main(String args[]) { Calendar c1 = Calendar.getInstance(); Utils.waitMilliseconds(100); Calendar c2 = Calendar.getInstance(); // will return 0 System.out.println(new SecondsComparator().compare(c1,c2)); } 

但是,它既不是一个好的解决方案,因为这个比较器打破了以下规则:

对于所有z,实现者必须确保x.compareTo(y)== 0表示sgn(x.compareTo(z))== sgn(y.compareTo(z))。

导致(x=y and y=z) => x=z

所以我没有看到任何解决方案......但事实上,如果你定义一些不同的日期,它们不同的,不是吗?

恕我直言最简单的方法是使用Apache Commons DateUtils( Apache Commons DateUtils )中的truncate()来删除毫秒并比较结果日期。

一种选择是调用Calendar.set(Calendar.MILLISECOND,0)来清除毫秒。 另一个是调用getTimeInMillis()来获取两个日历的时间(以毫秒为单位)。 然后,您可以在比较之前将它们除以1000,然后删除毫秒。

如果您在基本日期操作旁边执行任何操作,我建议使用Joda Time。 在您的情况下,您可以截断日期,然后比较:

 DateTime dateTime = new DateTime().millisOfDay().roundFloorCopy(); 
 clearMilis(date1).compareTo(clearMilis(date2)) /** * @param date date * * @return truncated miliseconds */ @Nonnull public static Date clearMillis(final @Nonnull Date date) { DateTime result = new DateTime(date); return result.minusMillis(result.getMillisOfSecond()).toDate(); } 
 public static String getFromatDateTime(Date date) { SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); final GregorianCalendar gc = new GregorianCalendar(); gc.setTime( date ); //gc.set( Calendar.HOUR_OF_DAY, 0 ); //gc.set( Calendar.MINUTE, 0 ); //gc.set( Calendar.SECOND, 0 ); //block ignore millisecond gc.set( Calendar.MILLISECOND, 0 ); String strDate = sdfDate.format(gc.getTime()); return strDate; } public static void main(String[] args) throws ParseException { SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S"); Date now = new Date(); String currentDate = Testing.getFromatDateTime(now); String fullDate = "2015-12-07 14:53:39.30"; String effDateStr = Testing.getFromatDateTime(sdfDate.parse(fullDate)); System.out.println("Currennt Date: " + currentDate); System.out.println("Effective Date: " + effDateStr); System.out.println(currentDate.compareTo(effDateStr)==0); } 

如果使用jodaTime,setCopy(“0”)方法返回一个DateTime对象,其毫秒设置为0,以便于比较:

 DateTime dateTimeZerodMillis = new DateTime().millisOfSecond ().setCopy("0")