我想有一个compareTo方法来忽略java.util.Date的时间部分。我想有很多方法可以解决这个问题。最简单的方法是什么?
当前回答
对这个替代方案有什么意见吗?
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
sdf.format(date1).equals(sdf.format(date2));
其他回答
我的建议:
Calendar cal = Calendar.getInstance();
cal.set(1999,10,01); // nov 1st, 1999
cal.set(Calendar.AM_PM,Calendar.AM);
cal.set(Calendar.HOUR,0);
cal.set(Calendar.MINUTE,0);
cal.set(Calendar.SECOND,0);
cal.set(Calendar.MILLISECOND,0);
// date column in the Thought table is of type sql date
Thought thought = thoughtDao.getThought(date, language);
Assert.assertEquals(cal.getTime(), thought.getDate());
我更倾向于直接使用Joda库而不是java.util.Date,因为Joda区分了日期和时间(参见YearMonthDay和DateTime类)。
然而,如果你确实希望使用java.util.Date,我建议写一个实用方法;如。
public static Date setTimeToMidnight(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime( date );
calendar.set(Calendar.HOUR_OF_DAY, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
return calendar.getTime();
}
更新:虽然Joda Time在当时是一个很好的建议,使用java。在可能的情况下,从Java 8+替代时间库。
我倾向于使用Joda Time,这让这变得非常简单:
DateTime first = ...;
DateTime second = ...;
LocalDate firstDate = first.toLocalDate();
LocalDate secondDate = second.toLocalDate();
return firstDate.compareTo(secondDate);
编辑:正如评论中提到的,如果你使用DateTimeComparator.getDateOnlyInstance(),它甚至更简单:)
// TODO: consider extracting the comparator to a field.
return DateTimeComparator.getDateOnlyInstance().compare(first, second);
(“使用Joda Time”是几乎所有SO问题的基础,这些问题询问java.util.Date或java.util.Calendar。这是一个非常优秀的API。如果你要用日期/时间做任何重要的事情,你应该尽可能地使用它。)
如果必须使用内置API,则应该使用适当的日期和时区创建Calendar实例。然后,您可以将每个日历中的每个字段(小时、分钟、秒和毫秒)设置为0,并比较结果时间。与Joda解决方案相比,确实很讨厌:)
时区部分很重要:java.util.Date总是基于UTC。在大多数情况下,我对一个日期感兴趣,那是一个特定时区的日期。这本身将迫使您使用Calendar或Joda Time(除非您想自己考虑时区,我不建议这样做)。
android开发人员的快速参考
//Add joda library dependency to your build.gradle file
dependencies {
...
implementation 'joda-time:joda-time:2.9.9'
}
示例代码(示例)
DateTimeComparator dateTimeComparator = DateTimeComparator.getDateOnlyInstance();
Date myDateOne = ...;
Date myDateTwo = ...;
int retVal = dateTimeComparator.compare(myDateOne, myDateTwo);
if(retVal == 0)
//both dates are equal
else if(retVal < 0)
//myDateOne is before myDateTwo
else if(retVal > 0)
//myDateOne is after myDateTwo
已经提到了apache common -utils:
org.apache.commons.lang.time.DateUtils.truncate(date, Calendar.DAY_OF_MONTH)
给你Date对象,只包含日期,没有时间,你可以与Date. compareto进行比较
如果严格使用Date (java.util.Date),或者不使用任何外部库。用这个:
public Boolean compareDateWithoutTime(Date d1, Date d2) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
return sdf.format(d1).equals(sdf.format(d2));
}