Как установить первый месяц года в Java-календаре - PullRequest
0 голосов
/ 01 марта 2019

Мое требование: я хочу получить номер недели в году по проходной дате.

Правило:

Первый месяц года должен быть февраль.Неделя должна начинаться с субботы по пятницу.

Например:

02/01/2019 - should return week number as 1
02/02/2019 - should return week number as 2

1 Ответ

0 голосов
/ 01 марта 2019

Мне потребуется немного аргументации, чтобы найти правильное решение: если я правильно понимаю, первая пятница февраля всегда на неделе 1. Неделя 1 начинается за 6 дней до этого.Если мы представим, что «неделя 0» начинается на 7 дней раньше, то номер недели для дня всегда будет числом целых недель с начала этой «недели 0» за 13 дней до первой пятницы февраля.Мы можем рассчитать это.

public static int getWeekNumber(LocalDate date) {
    int year = date.getYear();
    if (date.getMonth().equals(Month.JANUARY)) {
        // calculate from February in previous year
        year--;
    }

    LocalDate imaginaryWeek0Start = LocalDate.of(year, Month.FEBRUARY, 1)
            .with(TemporalAdjusters.nextOrSame(DayOfWeek.FRIDAY))
            .minusDays(13);

    long weekNo = ChronoUnit.WEEKS.between(imaginaryWeek0Start, date);

    return Math.toIntExact(weekNo);
}

Давайте попробуем это с двумя примерами дат из вашего вопроса:

    System.out.println(getWeekNumber(LocalDate.of(2019, Month.FEBRUARY, 1)));
    System.out.println(getWeekNumber(LocalDate.of(2019, Month.FEBRUARY, 2)));

Это напечатано:

1
2

Если вы намеревались использовать класс Calendar, я намеренно этого не делаю.Этот класс плохо спроектирован и давно устарел.Вместо этого я рекомендую LocalDate и другие классы из java.time, современного Java-API даты и времени.

Ссылка: Руководство по Oracle: Date Time , объясняющее, какиспользовать java.time.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...