比较日期的方法似乎根本不起作用

n0p*_*0pe 4 java date

public void display(Date date) {
        for (int i = 0; i < this.position; i++) {
            schedule[i].init();
            while (schedule[i].hasMoreOccurrences()) {
                Date tmp = schedule[i].nextOccurrence();
                if (tmp.compareTo(date) == 0) {
                    System.out.println(schedule[i].toString());
                    schedule[i].init();
                    break;
                }

            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

基本上,上面经历了一系列"事件".每个事件都有一个方法来检查它是否有更多的出现次数以及获取下一次出现的方法(类型为date).

该方法接受日期并遍历数组并检查每个事件.对于每个事件,它会检查是否有更多事件.如果是,则检查该事件是否与指定的日期"相等".如果是,则打印事件并跳出循环并移动到数组中的下一个事件.如果下一次出现不等于给定的日期,只要事件有更多要检查的事件,它就会继续检查.

我知道这个方法是支持打印事件,但我没有错误,没有输出.我一直在玩它一段时间无济于事.

我100%确定我的hasMoreOccurrences()和nextOccurrence()方法正常工作,因为依赖于它们的代码的其他部分非常有用.

我很难过:/感谢您的帮助:)

编辑 我已经打印了tmp和日期,我发现它们都出现在相同的日期但不是同一时间.我不关心时间,只关心日期.有任何想法吗?

Bal*_*usC 5

有几种方法可以比较两个Date实例而不考虑时间.

  1. 将两者都转换为日历并重置desinterest字段.

    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);
    
    Run Code Online (Sandbox Code Playgroud)

    然后比较它们.

    if (calendar1.equals(calendar2))
    
    Run Code Online (Sandbox Code Playgroud)

    (是的,这太可怕了,这就是为什么JodaTime存在且JSR-310正在进行中)

  2. 格式化为String而没有时间然后再解析.

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    date = sdf.parse(sdf.format(date));
    
    Run Code Online (Sandbox Code Playgroud)

    然后比较它们.

    if (date1.equals(date2))
    
    Run Code Online (Sandbox Code Playgroud)
  3. 从一开始就使用JodaTime.

    if (dateTime1.toLocalDate().equals(dateTime2.toLocalDate()))
    
    Run Code Online (Sandbox Code Playgroud)

请注意,我使用的是x.equals(y)代替,x.compareTo(y) == 0因为你应该如何比较Java中的相等对象.