3 ответов:
Calendar cal = Calendar.getInstance(); cal.set(Calendar.HOUR_OF_DAY,17); cal.set(Calendar.MINUTE,30); cal.set(Calendar.SECOND,0); cal.set(Calendar.MILLISECOND,0); Date d = cal.getTime();См. Также
можете ли вы показать код, который вы используете для создания объекта Date? В любом случае
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
я хотел бы внести свой вклад в современное ответа. Это включает в себя использование
java.time, современный API даты и времени Java, а не старыйDate, ниCalendarза исключением тех случаев, когда нет никакого способа избежать этого.ваша проблема, скорее всего, действительно проблема часового пояса. Когда это Вт авг 09 00:00:00 Ист 2011 в часовых поясах к западу от Ист полночь еще не достигнуто. Это еще 8 августа. Если, например, ваш API для ввода даты в Excel ожидает UTC, дата будет за день до то, что ты задумал. Я считаю, что реальным и хорошим решением является создание даты-времени 00:00 UTC (или любого часового пояса или смещения, ожидаемого и используемого на другом конце).
LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27); ZonedDateTime utcDateDime = yourDate.atStartOfDay(ZoneOffset.UTC); System.out.println(utcDateDime);это выводит
2018-02-27T00:00Z
Zозначает UTC (думайте об этом как о смещении нуля от часового пояса UTC или Zulu). Еще лучше, конечно, если бы вы могли пройтиLocalDateиз первой строки кода в Excel. Он не включает время суток, поэтому путаница невозможна. С другой стороны, если вы нужен старомодныйDateобъект для этого, конвертировать непосредственно перед передачейDateon:Date oldfashionedDate = Date.from(utcDateDime.toInstant()); System.out.println(oldfashionedDate);на моем компьютере эта печать
Tue Feb 27 01:00:00 CET 2018не обманывайтесь, это правильно. Мой часовой пояс (по центрально-европейскому времени) находится по смещению +01:00 от мирового в феврале (стандартное время), так 01:00:00 на 00:00:00 по Гринвичу. Это просто
Date.toString()захватывая часовой пояс JVMs и используя его для создания строки.как я могу установить его на что-то как в 5: 30 вечера?
отвечая на ваш прямой вопрос напрямую, если у вас есть
ZonedDateTime,OffsetDateTimeилиLocalDateTime, во всех этих случаях будет выполнить то, что вы просили:yourDateTime = yourDateTime.with(LocalTime.of(17, 30));если
yourDateTimeбылLocalDateTimeна2018-02-27T00:00, теперь2018-02-27T17:30. Аналогично для других типов, только они включают смещение и часовой пояс тоже в зависимости от обстоятельств.если у вас была только дата, как в первом фрагменте выше, вы также можете добавить время суток информация к нему:
LocalDate yourDate = LocalDate.of(2018, Month.FEBRUARY, 27); LocalDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30));для большинства целей вы должны предпочесть добавить время суток в определенном часовом поясе, хотя, например
ZonedDateTime dateTime = yourDate.atTime(LocalTime.of(17, 30)) .atZone(ZoneId.of("Asia/Kolkata"));дает
2018-02-27T17:30+05:30[Asia/Kolkata].
DateиCalendarvsjava.timeThe
Dateкласс, который вы используете, а такжеCalendarиSimpleDateFormatиспользуемые в других ответах давно устарели, иSimpleDateFormatв частности, оказалось хлопотно. Во всех случаях современный JAVA date and time API-это так много с ним приятнее работать. Вот почему я хотел дать этот ответ на старый вопрос, который все еще посещается.ссылки: Oracle Tutorial Date Time, объясняя, как использовать
java.time.
Comments