Необходимо получить правильный вывод для количества недель в месяце, независимо от того, какой формат даты используется - PullRequest
0 голосов
/ 01 мая 2020

У меня есть этот код, который возвращает номер недели правильно.

package org.test.Calendar;

import java.util.Calendar;
import java.util.GregorianCalendar;

public class GetDaysInMonth {
    public static void main(String[] args) {
        Calendar calendar = GregorianCalendar.getInstance();
        int year = 2020;
        int month = Calendar.MAY;
        int date = 1;
        calendar.set(year, month, date);
        int numOfDaysInMonth = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
        int numOfWeeksInMonth = calendar.getActualMaximum(Calendar.WEEK_OF_MONTH);

        System.out.println("Number of Days In Month: " + numOfDaysInMonth);
        System.out.println("Number of Weeks In Month: " + numOfWeeksInMonth);
    }    
}

Вывод:

Количество дней в месяце: 31

Количество недель в месяце: 6

Мой формат даты был:

enter image description here

Теперь, когда я изменяю свой формат даты на:

enter image description here

Вывод отличается.

Вывод:

Количество дней в месяце: 31

Количество недель в месяце: 4

Нужны входные данные, такие как как получить правильный вывод независимо от того, какой формат даты мы используем ?

Отвечая на вопрос, как я обновляю формат: a) Go в Панель управления -> Часы и регион enter image description here

b) Выберите Изменить дату, время или ссылку на числовой формат. Вы получите ниже всплывающее окно, просто измените формат.

enter image description here

1 Ответ

2 голосов
/ 01 мая 2020

Ваши результаты такие, какими они должны быть. Поскольку вы ожидали чего-то другого, ваши ожидания должны были быть неверными.

  • В США неделя начинается в воскресенье. Неделя 1 месяца - это неделя, в которой содержится первый день месяца. Таким образом, пятница 1 мая и суббота 2 мая составляют неделю 1. Неделя 2 начинается в воскресенье, 3 мая. Неделя 3 - 10 мая, неделя 4 - 17 мая, неделя 5 - 24 мая и неделя 6 - всего 31 мая.
  • Великобритания следует международному стандарту, где неделя начинается в понедельник, а неделя 1 - первая неделя, которая содержит не менее 4 дней месяца. Таким образом, неделя 1 - с понедельника, 4 мая, до воскресенья, 10 мая. Неделя 2 начинается 11 мая, неделя 3 - 18 мая. Неделя 4 - с 25 по 31 мая, и, следовательно, последняя неделя месяца.

В вашем коде вы не запрашивали количество недель в месяце. Вы запросили самое большое число недель в месяце. Это 6 в США и 4 в Великобритании. Хотя месяц имеет одинаковую длину в обоих местах.

java .time

Для демонстрации я использую java .time, современный Java API даты и времени , с рекомендацией, что вы делаете то же самое в вашей работе даты. С современными классами гораздо приятнее работать, чем с устаревшим Calendar классом, который, честно говоря, всегда плохо спроектирован.

    YearMonth mayThisYear = YearMonth.of(2020, Month.MAY);
    LocalDate firstOfMonth = mayThisYear.atDay(1);
    LocalDate lastOfMonth = mayThisYear.atEndOfMonth();

    // US weeks
    WeekFields us = WeekFields.of(Locale.US);
    int weekOfFirstDay = firstOfMonth.get(us.weekOfMonth());
    int weekOfLastDay = lastOfMonth.get(us.weekOfMonth());
    System.out.println("US week numbers are " + weekOfFirstDay + " - " + weekOfLastDay);

Вывод:

Номера недели в США равны 1 - 6

Давайте вместо этого попробуем для Соединенного Королевства Великобритании и Северной Ирландии, Великобритании, кратко:

    // UK weeks
    WeekFields uk = WeekFields.of(Locale.UK);
    int weekOfFirstDay = firstOfMonth.get(uk.weekOfMonth());
    int weekOfLastDay = lastOfMonth.get(uk.weekOfMonth());
    System.out.println("UK week numbers are " + weekOfFirstDay + " - " + weekOfLastDay);

Номера недели в Великобритании - 0 - 4

Мне бы очень хотелось показать вам, как получить желаемый результат, используя java .time, но, хотя я и спросил в комментарии, вы не сказали нам, что считаете правильным числом недель в месяце, поэтому я не могу.

...