Установите время до 00:00:00

У меня проблема с перезагрузкой часов на 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, проблема или какая-то другая проблема? Или это зависит от чего-то еще?

Используйте другую константу вместо Calendar.HOUR , используйте Calendar.HOUR_OF_DAY .

 calendar.set(Calendar.HOUR_OF_DAY, 0); 

Calendar.HOUR использует 0-11 (для использования с AM / PM), а Calendar.HOUR_OF_DAY использует 0-23.

Чтобы процитировать Javadocs:

public static final int HOUR

Номер поля для получения и установки, указывающий час утреннего или дневного времени. ЧАС используется для 12-часового такта (0 – 11). Полдень и полночь представлены 0, а не на 12. Например, в 10: 04: 15.250 PM ЧАС составляет 10.

а также

public static final int HOUR_OF_DAY

Номер поля для get и set, указывающий час дня. HOUR_OF_DAY используется для 24-часовых часов. Например, в 10: 04: 15.250 PM HOUR_OF_DAY равно 22.

Тестирование («сейчас» в настоящее время составляет 14:55 23 июля 2013 года по тихоокеанскому времени):

 public class Main { static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); public static void main(String[] args) { Calendar now = Calendar.getInstance(); now.set(Calendar.HOUR, 0); now.set(Calendar.MINUTE, 0); now.set(Calendar.SECOND, 0); System.out.println(sdf.format(now.getTime())); now.set(Calendar.HOUR_OF_DAY, 0); System.out.println(sdf.format(now.getTime())); } } 

Вывод:

 $ javac Main.java $ java Main 2013-07-23 12:00:00 2013-07-23 00:00:00 

java.time

Использование frameworks java.time встроенной в Java 8 и более поздних java.time . См. Учебник .

 import java.time.LocalTime; import java.time.LocalDateTime; LocalDateTime now = LocalDateTime.now(); # 2015-11-19T19:42:19.224 # start of a day now.with(LocalTime.MIN); # 2015-11-19T00:00 now.with(LocalTime.MIDNIGHT); # 2015-11-19T00:00 

Если вам не нужно время суток (час, минута, секунды и т. Д.), Рассмотрите возможность использования classа LocalDate .

 LocalDate.now(); # 2015-11-19 

Вот несколько полезных функций, которые я использую для этого.

 /** * sets all the time related fields to ZERO! * * @param date * * @return Date with hours, minutes, seconds and ms set to ZERO! */ public static Date zeroTime( final Date date ) { return DateTimeUtil.setTime( date, 0, 0, 0, 0 ); } /** * Set the time of the given Date * * @param date * @param hourOfDay * @param minute * @param second * @param ms * * @return new instance of java.util.Date with the time set */ public static Date setTime( final Date date, final int hourOfDay, final int minute, final int second, final int ms ) { final GregorianCalendar gc = new GregorianCalendar(); gc.setTime( date ); gc.set( Calendar.HOUR_OF_DAY, hourOfDay ); gc.set( Calendar.MINUTE, minute ); gc.set( Calendar.SECOND, second ); gc.set( Calendar.MILLISECOND, ms ); return gc.getTime(); } 

Вам лучше сначала установить часовой пояс для компонента DateFormat следующим образом:

 DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("GMT")); 

Затем вы можете получить время «00:00:00», пройдя 0 миллисекунд в форматтер:

 String time = dateFormat.format(0); 

или вы можете создать объект Date:

 Date date = new Date(0); // also pass milliseconds String time = dateFormat.foramt(date); 

или у вас будет больше возможностей с помощью компонента Calendar, но вы также должны установить часовой пояс как GMT для экземпляра календаря:

 Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"), Locale.US); calendar.set(Calendar.HOUR_OF_DAY, 5); calendar.set(Calendar.MINUTE, 37); calendar.set(Calendar.SECOND, 27); dateFormat.format(calendar.getTime()); 

Еще один способ JAVA 8:

 LocalDateTime localDateTime = LocalDateTime.now().truncatedTo(ChronoUnit.HOURS); 

Но гораздо удобнее редактировать дату, которая уже существует.

Сделать это может быть проще (в Java 8)

 LocalTime.ofNanoOfDay(0) 

Мы можем установить java.util.Date часть времени в 00:00:00. Используя class LocalDate для Java 8 / Joda-datetime api :

 Date datewithTime = new Date() ; // ex: Sat Apr 21 01:30:44 IST 2018 LocalDate localDate = LocalDate.fromDateFields(datewithTime); Date datewithoutTime = localDate.toDate(); // Sat Apr 21 00:00:00 IST 2018 

Другой способ сделать это – использовать DateFormat без каких-либо секунд:

 public static Date trim(Date date) { DateFormat format = new SimpleDateFormat("dd.MM.yyyy"); Date trimmed = null; try { trimmed = format.parse(format.format(date)); } catch (ParseException e) {} // will never happen return trimmed; } 

Вы можете сделать это со следующим:

 Calendar cal = Calendar.getInstance(); cal.set(year, month, dayOfMonth, 0, 0, 0); Date date = cal.getTime(); 
  • Вопрос с интервью: проверьте, является ли одна строка rotationм другой строки
  • ConcurrentHashMap и Hashtable в Java
  • Java: преобразовать строку в TimeStamp
  • Исполнители Java: как я могу остановить отправленные задачи?
  • Заполнение combobox из базы данных с помощью hibernate в Java
  • Удаление десериализации в HashMap пользовательских объектов с помощью джексона
  • Как указать значение annotations из константы java
  • «Некомпилируемый исходный код» RuntimeException в netbeans
  • Collections.emptyList () возвращает List ?
  • JTable Как обновить модель таблицы после вставки, удалить или обновить данные.
  • Как сериализовать Java-примитивы с помощью Jersey REST
  • Давайте будем гением компьютера.