Как рассчитать дни, принадлежащие номеру недели на основе ISO - PullRequest
1 голос
/ 08 июля 2019

У меня есть номер недели на основе ISO, который рассчитывается с использованием следующего API Java 8 LocalDate

int weekNumOfYear = LocalDate#get(IsoFields.WEEK_OF_WEEK_BASED_YEAR)

Учитывая год и номер недели (например, 201927), Как я могу рассчитать начальный и конечный день для этой недели (201917)?

Я использую класс Calendar для этой проблемы, но не уверен, что он правильный (особенно, следовал ли формат ISO)

Обновление: следующий код не работает правильно для 201953, есть нет 53-й недели для 2019

@Test
    public void testGetWeekDays() {
        Integer year = 2019;
        Integer week = 27;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Calendar cal = Calendar.getInstance();

        //Use ISO format
        cal.setMinimalDaysInFirstWeek(4);

        cal.setFirstDayOfWeek(Calendar.MONDAY);
        cal.set(Calendar.YEAR, year);
        cal.set(Calendar.WEEK_OF_YEAR, week);
        cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
        String beginDate = sdf.format(cal.getTime());
        cal.add(Calendar.DAY_OF_WEEK, 6);
        String endDate = sdf.format(cal.getTime());
        System.out.println(beginDate);
        System.out.println(endDate);
    }

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Вы также можете использовать with, чтобы получить начальный и конечный день недели

System.out.println(localDate.with(DayOfWeek.MONDAY));
System.out.println(localDate.with(DayOfWeek.SUNDAY));

Если вы хотите получить начальный и конечный день по номеру недели, используйте ISO_WEEK_DATE

LocalDate startDay = LocalDate.parse("2019-W26-1", DateTimeFormatter.ISO_WEEK_DATE);

LocalDate endDay = LocalDate.parse("2019-W26-7", DateTimeFormatter.ISO_WEEK_DATE);

Одна цифра для дня недели.Значение изменяется с понедельника (1) до воскресенья (7).

2 голосов
/ 08 июля 2019

tl; dr

Учитывая год и номер недели (например, 201927), я мог бы рассчитать начальный и конечный день для этой недели (201917)?

YearWeek              // Represent a particular week of a week-based year.
.of(                  // Factory method, rather than calling `new`. 
    2019 ,            // The number of the desired week-based year ( *not* calendar year! ).
    26                // Week of the year, 1 through 52 or 53. 
)
.atDay(               // Generate a `LocalDate` object for a day within this week.
    DayOfWeek.MONDAY  // Specify the day-of-week.
)                     // Generate a `LocalDate` for the first day of this week.
.plusDays( 6 )        // Generate a `LocalDate` representing the last day of this week. 

ThreeTen-Extra - YearWeek

Работать со стандартными неделями намного проще с классом org.threeten.extra.YearWeek, представленным в ThreeTen-Extra проект.Этот проект добавляет функциональность к современным java.time классам, встроенным в Java 8 и более поздние версии.

Если у вас есть строка, соответствующая ISO 8601 , представляющая стандарт неделя , синтаксический анализ.

String input = "2019-W27";
YearWeek yw = YearWeek.parse( input);

yw.toString (): 2019-W27

Стандартная неделя начинается с понедельника.Объект YearWeek может генерировать LocalDate для любого дня недели.Укажите день, используя перечисление DayOfWeek.

LocalDate ld = yw.atDay( DayOfWeek.MONDAY);

ld.toString (): 2019-07-01

Чтобы получитьостаток недели добавляйте день снова и снова.

LocalDate nextDay = ld.plusDays( 1 ) ;

ld.toString (): 2019-07-02

Чтобы завершитьнеделю, добавьте шесть.

LocalDate nextDay = ld.plusDays( 6 ) ;

ld.toString (): 2019-07-07

Или получите фантазию, используя потоки Java.Создайте поток, вызвав LocalDate::datesUntil.

Stream < LocalDate > stream = ld.datesUntil ( ld.plusWeeks ( 1 ) );
List < LocalDate > dates = stream.collect ( Collectors.toList () );

date.toString (): [2019-07-01, 2019-07-02, 2019-07-03, 2019-07-04, 2019-07-05, 2019-07-06, 2019-07-07]

Кстати, стандартный способ представления дня неделив течение стандартной недели стоит добавить дефис и номер 1-7.

2019-W26-1 = понедельник

2019-W26-2 = вторник

2019-W26-7 = воскресенье

...