У меня проблема со сбросом часов на Java. Для заданной даты я хочу установить часы на 00:00:00.
Это мой код:
/**
* Resets milliseconds, seconds, minutes and hours from the provided date
*
* @param date
* @return
*/
public static Date trim(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.HOUR, 0);
return calendar.getTime();
}
Проблема в том, что иногда время есть, 12:00:00
а иногда оно есть, 00:00:00
и когда я запрашиваю базу данных о сущности, которая была сохранена, 07.02.2013 00:00:00
и фактическое время сущности, которое хранится, 12:00:00
запрос не выполняется.
Я это знаю 12:00:00 == 00:00:00
!
Я использую AppEngine. Это ошибка appengine, проблема или какая-то другая проблема? Или это от чего-то еще зависит?
java
java.util.calendar
Аделин
источник
источник
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
, теперь унаследованы , их вытеснили классы java.time, встроенные в Java 8 и Java 9. См. Учебник от Oracle .calendar.set(Calendar.HOUR_OF_DAY, 0);
для своих целей, работает хорошо.Ответы:
Используйте другую константу вместо
Calendar.HOUR
, используйтеCalendar.HOUR_OF_DAY
.Calendar.HOUR
использует 0-11 (для использования с AM / PM) иCalendar.HOUR_OF_DAY
использует 0-23.Процитируем Javadocs:
и
Тестирование («сейчас» сейчас около 14:55 23 июля 2013 г. по тихоокеанскому летнему времени):
Вывод:
источник
Calendar.HOUR
PM не устанавливается значение AM, а остается 12:00.java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
, теперь унаследованы , их вытеснили классы java.time, встроенные в Java 8 и Java 9. См. Учебник от Oracle .java.time
Использование
java.time
фреймворка, встроенного в Java 8 и новее. См. Руководство .Если вам не нужны части времени суток (часы, минуты, секунды и т. Д.), Подумайте об использовании
LocalDate
класса.источник
LocalDateTime
- это совершенно неподходящий класс для этого. Он не может представлять момент, поскольку в нем отсутствует понятие часового пояса или смещения от UTC. ЗвонитьLocalDateTime.now
почти никогда не имеет смысла.ZonedDateTime
Вместо этого используйте . В противном случае вы игнорируете важные проблемы с часовыми поясами. Во-первых, некоторые свидания в некоторых зонах не начинаются в 00:00!Вот пара служебных функций, которые я использую именно для этого.
источник
Еще один способ JAVA 8:
Но гораздо полезнее редактировать уже существующую дату.
источник
LocalDateTime
не может представлять момент, поскольку в нем отсутствует понятие часового пояса или смещения от UTC. ЗвонитьLocalDateTime.now
почти никогда не имеет смысла.ZonedDateTime
Вместо этого вы должны использовать .Лучше в первую очередь установить часовой пояс для компонента DateFormat следующим образом:
Затем вы можете получить время «00:00:00», передав 0 миллисекунд форматеру:
или вы можете создать объект Date:
или у вас будет больше возможностей с помощью компонента Calendar, но вы также должны установить часовой пояс как GMT для экземпляра календаря:
источник
ТЛ; др
java.time
Вы используете ужасные старые классы времени и даты, которые были вытеснены много лет назад современными классами java.time, определенными в JSR 310.
Date
➙Instant
A
java.util.Date
представляет момент в формате UTC. Его замена естьInstant
. Вызовите новые методы преобразования, добавленные к старым классам.Часовой пояс
Укажите часовой пояс, в котором вы хотите, чтобы ваше новое время суток имело смысл.
Укажите правильное время имя зоны в формате
Continent/Region
, напримерAmerica/Montreal
,Africa/Casablanca
илиPacific/Auckland
. Никогда не используйте аббревиатуру из 2-4 букв, напримерEST
или,IST
поскольку они не являются истинными часовыми поясами, не стандартизированы и даже не уникальны (!).ZonedDateTime
Примените
ZoneId
к,Instant
чтобы получитьZonedDateTime
. Тот же момент, та же точка на временной шкале, но другое время на настенных часах.Изменение времени суток
Вы просили изменить время суток. Примените a,
LocalTime
чтобы изменить все части времени суток: час, минуту, секунду, доли секунды. Создается новыйZonedDateTime
экземпляр со значениями на основе оригинала. В java.time классы используют этот непреложный объекты шаблон , чтобы обеспечить безопасность потоков .Первый момент дня
Но вы просили конкретно 00:00. Так что, очевидно, вам нужен первый момент дня. Осторожно: некоторые дни в некоторых зонах не начинаются в 00:00:00. Они могут начаться в другое время, например 01:00:00, из-за аномалий, таких как переход на летнее время (DST).
Пусть java.time определит первый момент. Извлеките часть, содержащую только дату. Затем пройдите часовой пояс, чтобы получить первый момент.
Настроить на UTC
Если вам нужно вернуться в UTC, извлеките файл
Instant
.Instant
➙Date
Если вам нужно
java.util.Date
взаимодействовать со старым кодом, который еще не обновлен до java.time , выполните преобразование.источник
Сделать это могло бы быть проще (в Java 8)
источник
Мы можем установить часть времени java.util.Date на 00:00:00, используя класс LocalDate в Java 8 / Joda-datetime api :
источник
Если вам нужен формат 00:00:00 в строке, вы должны использовать SimpleDateFormat, как показано ниже. Использование «H» вместо «h».
источник
Другой способ сделать это - использовать DateFormat без секунд:
источник
Вы можете сделать это следующим образом:
источник
Поскольку Java8 добавляет новые функции Date, мы можем легко это сделать.
источник
LocalDateTime
не может представлять момент, поскольку в нем отсутствует понятие часового пояса или смещения от UTC. ЗвонитьLocalDateTime.now
почти никогда не имеет смысла.ZonedDateTime
Вместо этого вы должны использовать .