Задать метод для Java Календарь работает, только если я его распечатал - PullRequest
0 голосов
/ 06 марта 2020

Я столкнулся с проблемой, которую действительно не понимаю. Я пытаюсь использовать метод set в Календаре, но он изменяет значения только в том случае, если я его распечатываю, вот код:

Calendar cal = Calendar.getInstance();
cal.set(2020,2,31);
// System.out.println("Necessary print: " + cal.getTime());

cal.set(Calendar.DAY_OF_WEEK, cal.getFirstDayOfWeek());
// reset time
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);

System.out.println("Date set: " + cal.getTime());
System.out.println("Day of month: " + cal.get(Calendar.DAY_OF_MONTH));

Этот предыдущий код дает мне вывод:

Date set: Mon Mar 02 00:00:00 CET 2020
Day of month: 2

И если я раскомментирую «необходимый отпечаток», то получу:

Necessary print: Tue Mar 31 23:07:17 CEST 2020
Date set: Mon Mar 30 00:00:00 CEST 2020
Day of month: 30

Мне действительно интересно, почему отпечаток может повлиять на этот метод Спасибо заранее за помощь! ?

1 Ответ

2 голосов
/ 06 марта 2020

Документация состояний класса Calendar содержит:

Поля календаря можно изменить тремя способами: set(), add() и roll(). set(f, value) меняет поле календаря f на value. Кроме того, он устанавливает внутреннюю переменную-член, чтобы указать, что поле календаря f было изменено. Хотя поле календаря f изменяется немедленно, значение time календаря в миллисекундах не пересчитывается до следующего вызова get(), getTime(), getTimeInMillis(), add() или roll(). Таким образом, множественные вызовы set() не запускают несколько ненужных вычислений. В результате изменения поля календаря с помощью set() другие поля календаря также могут изменяться в зависимости от поля календаря, значения поля календаря и системы календаря. Кроме того, get(f) не обязательно вернет значение, установленное вызовом метода set, после пересчета полей календаря. Специфика определяется конкретным классом календаря.

TL; DR: Вам необходимо вызвать cal.getTime(), чтобы обновить значения.

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