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

Incorrect boolean outcome using isWeekEnd method with Calendar instance

None 的现有线程帮助我理解了为什么我在主方法中输入的日期(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 显示为周末 (true),但将 2016、27、11 显示为工作日 (false)

两件事:

  1. Calendar class 适用于从 0 开始的月份:一月 = 0,二月 = 1,等等。
  2. set 方法采用年、月、日的顺序,而不是年、日、月。

语句c1.set(2016, 25, 11);实际上将日期设置为2018年2月11日(星期日),因为25 = 2×12 + 1,所以年份增加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);

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

对于您的情况,因为它只是一个日期(没有时间),所以 java.time.LocalDate 适合您的用例。检查星期几的好简单方法,它还尝试几个月,以便一月 = 1。