Joda-Time: получите максимальное количество недель для определенного года - PullRequest
8 голосов
/ 08 июня 2011

Как получить максимальное количество недель для определенного года с Joda-Time ?

Ответы [ 3 ]

12 голосов
/ 09 июня 2011
new DateTime().withYear(PARTICULAR_YEAR).weekOfWeekyear().getMaximumValue();

@ cody Комментарий

Разница между двумя методами .withWeekOfWeekyear() и .withWeekyear()

Пример

new DateTime().withDate(2011, 1, 2);   

2/1/2011       : Sunday, last day of last week of 2010 (27/12/2010 - 2/1/2011)   
dayOfWeek      : 7
weekOfWeekyear : 52  
weekyear       : 2010


new DateTime().withDate(2011, 1, 3);

3/1/2011       : Monday, first day of first week of 2011 (3/1/2011 - 9/1/2011)
dayOfWeek      : 1
weekOfWeekyear : 1
weekyear       : 2011
4 голосов
/ 02 марта 2015

Я знаю, что ответ на этот старый вопрос является некромантией, но принятый ответ (по lschin) содержит ошибку - хотя в большинстве случаев он возвращает правильное значение, иногда он возвращает неправильное значение, в зависимости от того, когда Расчет был выполнен. Например:

new DateTime().withYear(2014).weekOfWeekyear().getMaximumValue();

Если вы выполните вышеприведенное в 28 декабря 2014 , вы получите правильное значение 52 . Тем не менее, тот же код при запуске всего через день, 29 декабря 2014 , вернет значение 53 . Что, очевидно, является проблемой, потому что данный год имеет постоянное количество недель (не говоря уже о том, что вы не хотите, чтобы ваши методы работали только иногда). Вы можете проверить это, изменив системную дату или используя фиксированную дату вместо new Date().

Проблема здесь weekOfWeekyear(), которая может увеличить значение данного года, если new DateTime() вернет дату, близкую к концу года. Это не проблема, когда текущий и следующий год имеют одинаковое количество недель, но в противном случае это будет проблемой. Итак, чтобы исправить это, используйте:

new DateTime().withWeekyear(2014).weekOfWeekyear().getMaximumValue();
                   ^^^^

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

0 голосов
/ 02 января 2018

ТЛ; др

org.threeten.extra.YearWeek.of( 2018 , 1 ).is53WeekYear()

... или ...

org.threeten.extra.YearWeek.of( 2018 , 1 ).lengthOfYear()

java.time

Проект Joda-Time теперь находится в режиме обслуживания , и команда рекомендует перейти на классы java.time .

Неделя

Какое у вас определение недели? Неделя № 1 содержит 1 января? Или неделя № 1 содержит определенный день недели, например, воскресенье? Является ли неделя № 1 первой неделей, содержащей только дни нового года? Другое определение?

ISO 8601

Если ваше определение соответствует стандарту ISO 8601 , это означает, что неделя № 1 содержит первый четверг календарного года, а понедельник начинается каждую неделю. Таким образом, в году 52 или 53 недели. И последние несколько дней или первые несколько дней календаря могут появиться в предыдущем / следующем году на основе недели.

ThreeTen-Extra YearWeek класс

Для стандартных недель добавьте библиотеку ThreeTen-Extra в ваш проект. Эти классы расширяют функциональность классов java.time, встроенных в Java 8 и более поздние версии.

Получите неделю из желаемого номера года на основе недели.

YearWeek yw = YearWeek.of( 2018 , 1 ) ;

Возможно, вам нужен текущий год-неделя.

LocalDate ld = LocalDate.now( ZoneId.of( "America/Montreal" ) ) ;
YearWeek yw = YearWeek.from( ld ) ;

Получите количество недель в этом году, 52 или 53.

int weeksCount = yw.lengthOfYear() ;

Или просто спросите, есть ли в этом году 53 недели.

boolean has53 = yw.is53WeekYear() ;

О java.time

Платформа java.time встроена в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar и & SimpleDateFormat.

Проект Joda-Time , который теперь находится в режиме обслуживания , рекомендует перейти на классы java.time .

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Где получить классы java.time?

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и more .

...