Java 为什么daes date1.compareTO(date2)==0,即使日期相同,也不能满足我的需求?

Java 为什么daes date1.compareTO(date2)==0,即使日期相同,也不能满足我的需求?,java,android,date,Java,Android,Date,我正在编写一个提醒应用程序,它应该有一个hashmap(黎巴嫩,在下面的代码片段中),包含不同的日期作为键,假日名称作为值。这是我的日历: SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy"); Calendar current = Calendar.getInstance(); Calendar cal = Calendar.getInstance(); cal.set(pickerDate.getYear(),

我正在编写一个提醒应用程序,它应该有一个hashmap(
黎巴嫩
,在下面的代码片段中),包含不同的日期作为键,假日名称作为值。这是我的日历:

SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy");
Calendar current = Calendar.getInstance();
Calendar cal = Calendar.getInstance();
cal.set(pickerDate.getYear(),
        pickerDate.getMonth(),
        pickerDate.getDayOfMonth(),
        pickerTime.getCurrentHour(),
        pickerTime.getCurrentMinute(),
        0
);
Date date12_1 = format.parse("1/1/2017");
Lebanon.put(date12_1, "New Year");
if (cal.getTime().compareTo(date12_1) > 0) {
  info.setText(cal.getTime() + "BIGGER THAN     " + date12_1);
} else if (cal.getTime().compareTo(date12_1) == 0) {
  info.setText(cal.getTime() + "EQUAL TO     " + date12_1);
} else if (cal.getTime().compareTo(date12_1) < 0) {
  info.setText(cal.getTime() + "SMALLER THAN     " + date12_1);
}

对于全天活动,Java8+中的最佳表示形式是。
Calendar
long
值支持,因此在您的情况下很容易出错<另一方面,code>LocalDate实现了
equals()
hashCode()
以完全适合您的用例

如果你必须坚持Java7而不是一个选项,考虑在从采摘者填写日历之前清除日历:< /P>

@Test
public void testCalendar() {
    Calendar cal = Calendar.getInstance();
    cal.setTime(new Date(0));

    int year = cal.get(Calendar.YEAR);
    int day = cal.get(Calendar.DAY_OF_MONTH);
    int month = cal.get(Calendar.MONTH);

    cal.set(Calendar.YEAR, 2016);
    cal.set(Calendar.MONTH, 3);
    cal.set(Calendar.DAY_OF_MONTH, 27);

    assertEquals(cal.get(Calendar.MILLISECOND), 0);
}

甚至在Apache
commons-lang3
中,在设置时间之后,在
cal
object中设置毫秒数

cal.set(pickerDate.getYear(),
        pickerDate.getMonth(),
        pickerDate.getDayOfMonth(),
        pickerTime.getCurrentHour(),
        pickerTime.getCurrentMinute(),
        0
);
cal.set(Calendar.MILLISECOND,0);
如果它不起作用,获得正确结果的最佳方法是先创建Calendar对象,然后创建getDate,这样做更简单,并为您提供更多的更改选项。将您的
date12\u 1
更改为日历对象

Date date12_1 = format.parse("1/1/2017"); //change this line

Calendar.getInstance()
还设置从系统时钟检索的毫秒数

这意味着毫秒几乎总是大于0。我自己测试过,时间戳得到了不同的值:

System.out.println(date12_1.getTime());
System.out.println(cal.getTimeInMillis());
您还需要将毫秒设置为0:

  • 您可以使用
    setTimeInMillis(0)
  • 或者您可以使用
    cal.set(Calendar.millis秒,0)将毫秒字段设置为0

显然你忘了米利斯。嗯……但是秒是00……这有什么关系@塞尔文尼不是。。所以有一个区别。那么如果我想说2017年1月1日星期五00:00:00等于2017年1月1日星期五00:00:00,我该怎么办呢?老实说,我不在乎秒和毫秒,如果可能的话,我可以不用它们@Mijhonestly不在乎秒和毫秒没关系。。它们存在于日历对象中,那么我该怎么做(…)?将它们都设置为0实际上,equals提供完全相同的输出。我试着用if(cal.getTime().after(date12_1)){info.setText(cal.getTime()+”大于“+date12_1”)}或者if(cal.getTime().equals(date12_1)){info.setText(cal.getTime()+”等于“+date12_1”)}或者if(cal.getTime().before)(date12_1){info.setText(cal.getTime()+”小于“+date12_1”)}但是没有运气…它给出相同的输出是的,真的。不知道你在说什么测试,但缺陷在测试中。在第一次编写后还添加了两个选项:1.使用
setTime(新日期(0))清除日历
和2.
DateUtils.isSameDay
我的问题是你说的毫秒数…谢谢你,现在它工作了。我如何将它们设置为0?@MC emperor在设置时间之前,你可以使用
setTimeInMillis(0)
设置时间(
cal.set(pickerDate.getYear(),…
)不可以。只有当系统时钟在对
Calendar.getInstance()
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.YEAR, 2014);
cal2.set(Calendar.DAY_OF_YEAR, 1);    
cal2.set(Calendar.MILLISECOND,0);
Date date12_1 = cal2.getTime();
System.out.println(date12_1.getTime());
System.out.println(cal.getTimeInMillis());