日历返回错误的一年中的星期

时间:2018-10-09 06:20:06

标签: java calendar dayofweek

我希望将本周的第一天设置为星期日之后,将本周的第9周设为2018年9月10日。我仍然从下面的代码段中得到41的输出

 Calendar c = Calendar.getInstance();
 c.setFirstDayOfWeek(Calendar.SUNDAY);
 System.out.println( c.get(Calendar.WEEK_OF_YEAR)  );

我在这里想念东西吗?

背景:我们的周开始时间可能会有所不同。我们的配置可以让用户确定一周的第一天。

1 个答案:

答案 0 :(得分:0)

抱歉,如果我太执着了。我仍然认为您应该将计算留给自定义WeekFields对象。如果我正确理解了您的评论,则需要:

    final int daysPerWeek = DayOfWeek.values().length; // A wordy way of writing 7 :-)
    WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, daysPerWeek);
    int customWeekNumber = date.get(customWeekFields.weekOfWeekBasedYear());

为了测试这是否与您正在做的事情一致,我编写了以下方法:

static void printWeekNumber(DayOfWeek firstDayOfWeek, LocalDate date) {
    DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("EEE uuuu-MM-dd", Locale.ENGLISH);
    final int daysPerWeek = DayOfWeek.values().length;

    // Week number according to your comment: “using the Temporal adjusters
    // I am getting the date on the last day of the week.
    // After that dividing the Day of the Year from the API by 7”
    DayOfWeek lastDayOfWeek = firstDayOfWeek.minus(1);
    int askersCommentWeekNumber = date
            .with(TemporalAdjusters.nextOrSame(lastDayOfWeek))
            .getDayOfYear()
                    / daysPerWeek;

    // My suggested way of calculating the same week number
    WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, daysPerWeek);
    int customWeekNumber = date.get(customWeekFields.weekOfWeekBasedYear());

    System.out.format(Locale.ENGLISH, "Week begins on %-8s Date is %s. Week %2d or %2d, agree? %s%n", 
            firstDayOfWeek, date.format(dateFormatter), 
            askersCommentWeekNumber, customWeekNumber, 
            askersCommentWeekNumber == customWeekNumber);
}

为了便于手工检查计算,我选择了不同年份的一月日期:

    printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2017, Month.JANUARY, 9));
    printWeekNumber(DayOfWeek.MONDAY, LocalDate.of(2017, Month.JANUARY, 9));
    printWeekNumber(DayOfWeek.THURSDAY, LocalDate.of(2017, Month.JANUARY, 9));
    printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2018, Month.JANUARY, 9));
    printWeekNumber(DayOfWeek.MONDAY, LocalDate.of(2018, Month.JANUARY, 9));
    printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2019, Month.JANUARY, 9));
    printWeekNumber(DayOfWeek.MONDAY, LocalDate.of(2019, Month.JANUARY, 9));

输出:

Week begins on SUNDAY   Date is Mon 2017-01-09. Week  2 or  2, agree? true
Week begins on MONDAY   Date is Mon 2017-01-09. Week  2 or  2, agree? true
Week begins on THURSDAY Date is Mon 2017-01-09. Week  1 or  1, agree? true
Week begins on SUNDAY   Date is Tue 2018-01-09. Week  1 or  1, agree? true
Week begins on MONDAY   Date is Tue 2018-01-09. Week  2 or  2, agree? true
Week begins on SUNDAY   Date is Wed 2019-01-09. Week  1 or  1, agree? true
Week begins on MONDAY   Date is Wed 2019-01-09. Week  1 or  1, agree? true

但是,请检查结果是否符合您的要求。对于您问题中的示例,结果既不是41也不是42:

    printWeekNumber(DayOfWeek.SUNDAY, LocalDate.of(2018, Month.OCTOBER, 9));
Week begins on SUNDAY   Date is Tue 2018-10-09. Week 40 or 40, agree? true

编辑:如果您希望使用ISO 8601周编号,请使用date.get(WeekFields.ISO.dayOfWeek())。如果您希望按照ISO 8601的要求自定义一周的第一天和第一周的四天,请使用:

    WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, 4);
相关问题