Мне любопытно, почему, когда я устанавливаю время (то есть час, минуту и секунды), дата вычитает единицу. например для этого кода
Calendar calendarStart = Calendar.getInstance();
Calendar calendarEnd = Calendar.getInstance();
calendarStart.setTime(startDate);
calendarStart.set(11, 0);
calendarStart.set(12, 0);
calendarStart.set(13, 0);
calendarEnd.setTime(endDate);
calendarEnd.set(11, 23);
calendarEnd.set(12, 59);
calendarEnd.set(13, 59);
или даже этот код
startDate.setHours(0);
startDate.setMinutes(0);
startDate.setSeconds(0);
endDate.setHours(23);
endDate.setMinutes(59);
endDate.setSeconds(59);
Скажем, у меня есть дата начала August 01, 2018
и дата окончания August 07, 2018
, и после того, как я установил вышеуказанные значения, появятся даты Tue July 31 00:00:00 CDT 2018
и дата окончания Mon August 06 23:59:59 CDT 2018
. Почему это происходит и что я могу предпринять, кроме того, чтобы просто добавить к нему день после того, как он установлен.
Создание экземпляра начала и конца:
endDate = new Date();
Calendar temp = Calendar.getInstance();
temp.add(Calendar.DATE, -90);
startDate = new Date(temp.getTimeInMillis());
Когда он инициализирован, он работает нормально, но как только значения установлены, он вычитает день. Я напечатал значение до и после установки значений. Раньше это было так, как ожидалось, но как только он устанавливает это значение, он вычитает день.
@Ascalonian обновлено
Код, который вы показали для создания экземпляров startDate
и endDate
, НЕ устанавливает их на 1 августа и 7 августа. Как вы В самом деле создаете их экземпляры?
Calendar
был и всегда был сломанным классом. Используйте современные классы из пакета java.time
.
Предложение Богемиана хорошее. Но использование объекта Calendar напрямую может вызвать у вас проблемы, и вам лучше использовать GregorianCalendar, чем Calendar. Однако новые классы в java.time - НАМНОГО лучший выбор.
Голосование за закрытие, поскольку было предоставлено недостаточно исходного кода для постановки диагноза.
Являются ли startDate
и endDate
экземплярами java.util.Date
? Методы setXxx
устарели, потому что они ненадежны, поэтому не используйте их ни при каких обстоятельствах. В этом нет никакого смысла. Для даты начала и даты окончания используйте две переменные LocalDate
. LocalDate
- это дата без времени суток, что избавит вас от проблемы, с которой вы столкнулись.
Когда я только что запустил ваш код, я получил Thu May 10 00:00:00 CDT 2018
и Wed Aug 08 23:59:59 CDT 2018
. Я не вижу никаких проблем, кроме использования давно устаревших и плохо спроектированных классов даты и времени.
LocalDate start = LocalDate.of(2018, Month.AUGUST, 1);
LocalDate end = LocalDate.of(2018, Month.AUGUST, 7);
System.out.println("Start is " + start + ". End is " + end + '.');
Start is 2018-08-01. End is 2018-08-07.
Класс LocalDate
из java.time, современного API даты и времени Java, представляет дату без времени суток. Таким образом, вам не нужно устанавливать время (вы также не можете), чтобы не было никаких проблем с потенциальными побочными эффектами этого.
Я серьезно сомневаюсь, что опубликованный вами код ведет себя так, как вы описываете. Следовательно, я думаю, что ваша ошибка где-то в другом месте. Однако без Минимальный, полный и проверяемый пример нельзя быть уверенным.
Пожалуйста, покажите код того, как вы создаете экземпляры
startDate
иendDate