Календарь возвращает неправильную неделю года - PullRequest
0 голосов
/ 09 октября 2018

Я хочу, чтобы эта текущая неделя в день 9/10/2018 была 42-й неделей в году после установки первого дня недели в воскресенье.Тем не менее я получаю вывод 41 из приведенного ниже фрагмента

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

Я что-то здесь упускаю?

Справочная информация: Начало нашей недели может быть переменным.Наша конфигурация позволяет пользователям выбирать первый день недели.

1 Ответ

0 голосов
/ 10 октября 2018

Извините, если я слишком настойчив.Я все еще думаю, что вы должны оставить расчет для пользовательского объекта 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()).Если вы хотите свой собственный первый день недели и 4 дня в первую неделю, как в ISO 8601, используйте:

    WeekFields customWeekFields = WeekFields.of(firstDayOfWeek, 4);
...