Установите время до 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
запрос не выполняется.
- Регулярное выражение для разделения строки с использованием пробела, если оно не окружено одинарными или двойными кавычками
- getClass (). getClassLoader () имеет значение null, почему?
- JVM отправляет обратно память в ОС
- Правильное закрытие SSLSocket
- .clone () или Arrays.copyOf ()?
Я знаю, что 12:00:00 == 00:00:00
!
Я использую AppEngine. Это ошибка appengine, проблема или какая-то другая проблема? Или это зависит от чего-то еще?
- Простой AJAX с примером JSP
- SwingUtilities.invokeLater () зачем он нужен?
- Почему в Chrome отключен плагин Java (JRE)?
- Какова цель использования менеджеров макетов Java?
- Запрос Http Servlet теряет параметры из тела POST после прочтения его один раз
- Java 8 LocalDateTime обрабатывает недопустимую дату
- Роль / цель ContextLoaderListener весной?
- Добавить jar в classpath во время выполнения под java 9
Используйте другую константу вместо 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();