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

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

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

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

введите здесь описание изображения

Теперь, когда я меняю формат даты на:

введите здесь описание изображения

Выход разный.

Выход :

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

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

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

Отвечая на вопрос, как я обновляю формат: а) Перейдите в Панель управления -> Часы и регион введите здесь описание изображения

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

введите здесь описание изображения


person Dhaval Shah    schedule 01.05.2020    source источник
comment
Не очень понятно, как вы меняете формат даты на США/Великобританию. Не уверен, что это изображение не отображается правильно. Можете ли вы указать в коде, как это управляется?   -  person Sandeep Lakdawala    schedule 01.05.2020
comment
Я обновил сообщение с вашим вопросом о том, как вы обновляете формат даты, надеюсь, это поможет.   -  person Dhaval Shah    schedule 01.05.2020
comment
Я рекомендую вам не использовать Calendar и GregorianCalendar. Эти классы плохо разработаны и давно устарели. Вместо этого используйте LocalDate и другие классы из java.time, современного API даты и времени Java.   -  person Ole V.V.    schedule 01.05.2020
comment
Недели нумеруются по-разному в США и Великобритании, поэтому ожидается получение разных результатов от calendar.getActualMaximum(Calendar.WEEK_OF_MONTH). Как вы считаете недели? Хотите узнать, сколько разных номеров недель может быть в месяце? Также это отличается между США и Великобританией.   -  person Ole V.V.    schedule 01.05.2020


Ответы (1)


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

  • В США неделя начинается в воскресенье. Неделя 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.время

Для своей демонстрации я использую java.time, современный API даты и времени Java, с рекомендацией, что вы делаете то же самое в своей работе с датами. С современными классами гораздо приятнее работать, чем с устаревшим классом 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, но, несмотря на то, что я спросил в комментарии, вы не сказали нам, какое количество недель в месяце вы считаете правильным, поэтому я могу 'т.

person Ole V.V.    schedule 01.05.2020