Почему дата меняется при установке времени?

Мне любопытно, почему, когда я устанавливаю время (то есть час, минуту и ​​секунды), дата вычитает единицу. например для этого кода

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());

Когда он инициализирован, он работает нормально, но как только значения установлены, он вычитает день. Я напечатал значение до и после установки значений. Раньше это было так, как ожидалось, но как только он устанавливает это значение, он вычитает день.

Пожалуйста, покажите код того, как вы создаете экземпляры startDate и endDate

Ascalonian 07.08.2018 21:16

@Ascalonian обновлено

C. Smith 07.08.2018 21:37

Код, который вы показали для создания экземпляров startDate и endDate, НЕ устанавливает их на 1 августа и 7 августа. Как вы В самом деле создаете их экземпляры?

Dawood ibn Kareem 07.08.2018 21:41
Calendar был и всегда был сломанным классом. Используйте современные классы из пакета java.time.
Bohemian 07.08.2018 21:46

Предложение Богемиана хорошее. Но использование объекта Calendar напрямую может вызвать у вас проблемы, и вам лучше использовать GregorianCalendar, чем Calendar. Однако новые классы в java.time - НАМНОГО лучший выбор.

Joseph Larson 08.08.2018 00:34

Голосование за закрытие, поскольку было предоставлено недостаточно исходного кода для постановки диагноза.

Basil Bourque 08.08.2018 07:55

Являются ли startDate и endDate экземплярами java.util.Date? Методы setXxx устарели, потому что они ненадежны, поэтому не используйте их ни при каких обстоятельствах. В этом нет никакого смысла. Для даты начала и даты окончания используйте две переменные LocalDate. LocalDate - это дата без времени суток, что избавит вас от проблемы, с которой вы столкнулись.

Ole V.V. 08.08.2018 08:23

Когда я только что запустил ваш код, я получил Thu May 10 00:00:00 CDT 2018 и Wed Aug 08 23:59:59 CDT 2018. Я не вижу никаких проблем, кроме использования давно устаревших и плохо спроектированных классов даты и времени.

Ole V.V. 08.08.2018 08:30
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
8
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

LocalDate из java.time

    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, представляет дату без времени суток. Таким образом, вам не нужно устанавливать время (вы также не можете), чтобы не было никаких проблем с потенциальными побочными эффектами этого.

Что пошло не так в вашем коде?

Я серьезно сомневаюсь, что опубликованный вами код ведет себя так, как вы описываете. Следовательно, я думаю, что ваша ошибка где-то в другом месте. Однако без Минимальный, полный и проверяемый пример нельзя быть уверенным.

Другие вопросы по теме