为什么daes date1.compareTO(date2)== 0即使日期相同也不能给我我想要的东西?

时间:2017-03-27 10:59:30

标签: java android date

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

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);
}

除了一件事之外,这段代码完美无缺:如果cal.gettime()等于12月1日,它仍然更大。输出是:

Fri Dec 01 00:00:00 EET 2017 BIGGER THAN Fri Dec 01 00:00:00 EET 2017

3 个答案:

答案 0 :(得分:0)

对于全天活动,Java 8+中的最佳表示是LocalDateCalendarlong值支持,因此在您的情况下容易出错。另一方面,LocalDate已实施equals()hashCode()以完全适合您的用例。

如果您绝对必须坚持使用Java7并且Joda不是一个选项,请考虑在从选择器填充日历之前清除日历:

@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中甚至还有DateUtils.isSameDay

答案 1 :(得分:0)

在设置时间后设置cal.set(pickerDate.getYear(), pickerDate.getMonth(), pickerDate.getDayOfMonth(), pickerTime.getCurrentHour(), pickerTime.getCurrentMinute(), 0 ); cal.set(Calendar.MILLISECOND,0); 对象中的毫秒数。

date12_1

如果它不起作用,获得正确结果的最佳方法是首先创建Calendar对象,然后创建getDate,它更简单,并为您提供更多更改选项。将您的Date date12_1 = format.parse("1/1/2017"); //change this line 更改为日历对象。

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();

{{1}}

答案 2 :(得分:0)

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

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

System.out.println(date12_1.getTime());
System.out.println(cal.getTimeInMillis());

您还需要将毫秒设置为0:

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