使用带有Calendar实例的isWeekEnd方法的布尔结果不正确

时间:2016-11-26 16:00:56

标签: java calendar boolean logical-operators

现有的线程都没有帮助我理解为什么我在主方法(2016,25,11)中输入的日期是星期五,因为我的方法isWeekend()正在弹出。我在其他线索中看到人们谈论将日历的第一天设置为星期一,但我不知道这会如何改变我的结果

public static boolean isWeekend(Calendar userDate){
    if (userDate.get(Calendar.DAY_OF_WEEK) == Calendar.SATURDAY || 
    userDate.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY)
        return true;
    else return false;
    } 

public static void main(String[] args) {
    Calendar c1 = Calendar.getInstance();
    c1.set(2016, 25, 11);
   System.out.println(CalendarBankHoliday.isWeekend(c1));
}  

请有人帮我理解这个

编辑:它正确显示2016,26,11为周末(真实)但2016年,27,11为工作日(虚假)

2 个答案:

答案 0 :(得分:3)

两件事:

  1. Calendar类适用于0个月:1月= 0,2月= 1等
  2. set方法按顺序采用年,月和日,而不是年,日和月。
  3. 声明c1.set(2016, 25, 11);实际上将日期设置为2018年2月11日(星期日),因为25 = 2×12 + 1,因此年份增加2,月份设置为2月。同样,声明c1.set(2016, 26, 11);实际上将日期设置为2018年3月11日(也是星期日)。

    要将c1设置为2016年11月25日,请将11更改为10,然后交换第二个和第三个参数:

    c1.set(2016, 10, 25); // Friday, November 25, 2016
    

    如果你对日期进行硬编码,你也可以使用静态常量来清晰:

    c1.set(2016, Calendar.NOVEMBER, 25);
    

答案 1 :(得分:2)

我建议不要使用旧版CalendarDate类。在Java 8中,有一个名为java.time的新包,它有更好的类来处理日期。

在您的情况下,因为它只是一个日期(没有时间),java.time.LocalDate适合您的用例。很简单的方法来检查一周中的几天,它也会尝试几个月,以便1月= 1。