Почему библиотека дат thirteen.org возвращает даты одного и того же года для 53-недельного года (для 53-й недели)?

Использование библиотеки https://www.threeten.org/threeten-extra.

При вычислении первого воскресенья месяца с учетом номера недели и года я заметил, что если я использовал 2018 и 53 неделю, я получаю в результате первое воскресенье 2018-12-02.

Тем не менее, 2018 год — это не 53-недельный год, поэтому мне интересно, делаю ли я что-то не так, или, возможно, в 2018 году есть что-то особенное? Я не видел, чтобы была соблюдена дата начала недели или другие условия 53-недель, но я мог что-то упустить.

В других тестах, таких как 2011 (также не a и неделя 53-недельного года), логика даты переносит результат, как и ожидалось, в 2012-01-01 (первое воскресенье первой недели следующего года).

Годы 2020, 2015 и 2019 (все 53-недельные годы) отображают значение результата, как и ожидалось, в декабре соответствующего года.

Вот код:

YearWeek yw = YearWeek.of(year, weekNumber);
//Get the date of the first day of that week.
LocalDate ld = yw.atDay( DayOfWeek.MONDAY ) ;
// Use a TemporalAdjuster to get nth day-of-week of that month date’s month.
TemporalAdjuster ta = TemporalAdjusters.dayOfWeekInMonth( 1 , DayOfWeek.SUNDAY ) ;
//  TemporalAdjuster ta = TemporalAdjusters.firstDayOfMonth();
LocalDate firstSunday = ld.with( ta ) ;
return firstSunday.toString();

Предложения?

«первое воскресенье месяца, учитывая номер недели и год» не имеет для меня смысла. Как вы вычисляете «месяц», зная номер недели и год?

Sweeper 15.05.2022 15:41

@Sweeper en.wikipedia.org/wiki/ISO_week_date уже существует.

tevemadar 15.05.2022 15:45

@tevemadar Я знаю, что это важно, но как получить «месяц» из номера недели и года? Вам также понадобится день недели, чтобы понять это, верно? Неделя может охватывать максимум два месяца.

Sweeper 15.05.2022 15:48

Пожалуйста, ознакомьтесь с документацией библиотеки. Эта библиотека была создана специально для таких расчетов данных.

Morkus 15.05.2022 15:51

Дело не в том, что делает библиотека, а в плохо сформулированном требовании. Что точно вы подразумеваете под «первое воскресенье месяца, учитывая номер недели и год»? Разные части одной и той же недели могут приходиться на разные месяцы, поэтому в таком случае какой месяц вас интересует?

Jon Skeet 15.05.2022 15:55

Спросить библиотеку, какое первое воскресенье 53-й недели в 2018 году, когда в 2018 году не 53 недели, следует перенести на воскресенье следующего года, верно? Возможно, я неправильно понял ваш комментарий выше, но 2 декабря 2018 года все в том же месяце. Другие не 53-недельные годы, которые я тестировал, переходят с первого воскресенья на следующее воскресенье (в следующем году) для недели = 53. Я опубликую свой фактический код выше.

Morkus 15.05.2022 16:02

Ваш вопрос стал намного яснее после редактирования. Спасибо. Теперь очень ясно, как вы это вычисляете, а именно используете понедельник недели для определения «месяца».

Sweeper 15.05.2022 16:31

Извините, я должен был включить код для начала. Спасибо за ваш отличный ответ (и решение) ниже. :)

Morkus 15.05.2022 16:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот что делает YearWeek.of:

Obtains an instance of YearWeek from a week-based-year and week.

If the week is 53 and the year does not have 53 weeks, week one of the following year is selected.

Поэтому для (2018, 53) он выбирает первую неделю 2019 года, потому что в 2018 году всего 52 недели. Это неделя, начинающаяся с 31.12.2018 и заканчивающаяся 06.01.2019.

Затем вы получаете понедельник этой недели, то есть 2018-12-31, и настраиваете эту дату на первое воскресенье месяца. «Месяц» здесь декабрь, в результате вы получите 2018-12-02.

Точно так же для (2011, 53) вы получаете первую неделю 2012 года, потому что в 2011 году всего 52 недели. Но в отличие от 2019 года, это неделя, начинающаяся с 02.01.2012 и заканчивающаяся 08.01.2012, так что проблем нет.

Так что же «особенного» в 2018 году? Его последняя неделя заканчивается перед последним днем ​​года, я полагаю? Это приводит к тому, что первая неделя следующего года начинается в декабре.

Хороший ответ, за исключением того, что пункт первого предложения «он выбирает первую неделю 2019 года» сбивает с толку. 2018-W53 — последняя неделя 2018 года.

Basil Bourque 15.05.2022 17:34

То, что натыкается на следующую неделю, нуждается в большем объяснении в вашей прозе. Ваш предпоследний абзац нуждается в таком же дополнительном объяснении.

Basil Bourque 15.05.2022 17:38

@BasilBourque Я не уверен, правильно ли я понял, но я все равно пытался редактировать. Теперь лучше?

Sweeper 15.05.2022 17:47

Другие вопросы по теме