Я пытаюсь получить дату понедельника до 1 фактического месяца - PullRequest
0 голосов
/ 29 января 2019

Java не выполняет некоторые строки моего кода при использовании библиотеки Calendary.

Я пытаюсь получить дату понедельника до 1 текущего месяца.

//Today is Tuesday, 2 January of 2019 (29/01/2019)

Calendar cp1 = GregorianCalendar.getInstance();
cp1.set(Calendar.DAY_OF_MONTH, 1); //THIS LINE DON'T WORKS
cp1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
SimpleDateFormat sdf=new SimpleDateFormat ("dd/MM/yyyy");
System.out.println(sdf.format (cp1.getTime()));

// возвращаем 28/01/2019 вместо 31/12/2018.

ЕСЛИ Я ДОБАВЛЯЮ System.out.println(cp1) после строки 2, то ява не переходит на строку 2 и работает хорошо.

//Today is Tuesday, 2 January of 2019 (29/01/2019)

Calendar cp1 = GregorianCalendar.getInstance();
cp1.set(Calendar.DAY_OF_MONTH, 1); //THIS LINE WORKS NOW
System.out.println (cp1.getTime());
cp1.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
SimpleDateFormat sdf=new SimpleDateFormat ("dd/MM/yyyy");
System.out.println(sdf.format (cp1.getTime())); 

// возвращаем 31/12/2018, это правильная дата.

// Почему java не выполнил 2-ю строку в моем первом коде?Является ли ошибка Java?

Ожидаемый результат «31/12/2018».Фактический результат "28/01/2019".

1 Ответ

0 голосов
/ 29 января 2019

Я бы настоятельно рекомендовал использовать java.time, так как с ним легче иметь дело.

Используйте реализацию TemporalAdjuster, найденную в классе TemporalAdjusters.Передайте объект enum DayOfWeek для желаемого дня недели.

LocalDate now = LocalDate.now();
LocalDate mondayBefore1OfMonth = now.withDayOfMonth(1)
                                    .with(TemporalAdjusters.previous(DayOfWeek.MONDAY));

System.out.println(mondayBefore1OfMonth); // 2018-12-31

Для вашей задачи (воспроизводимый как https://ideone.com/ph73wK), кажетсячто если вы не сделаете вызов приватному методу computeTime(), поле Calendar.DAY_OF_MONTH будет переопределено или что-то в этом роде, сделав вызов .getTime() или .get(Calendar.DAY_OF_MONTH), вы обновите дату, и выполучить хороший результат

...