Я хотел бы внести современный ответ.Это подразумевает использование java.time
, современного Java-API даты и времени, а не старого Date
или Calendar
, за исключением случаев, когда его невозможно избежать.
Скорее всего, ваша проблема действительно связана с часовым поясом,Когда это вторник, 09 августа 00:00:00 IST 2011, в часовых поясах к западу от IST полночь еще не достигнута.Это все еще 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 или Зулу).Конечно, еще лучше, если бы вы могли передать LocalDate
из первой строки кода в Excel.Оно не включает время суток, поэтому путаница невозможна.С другой стороны, если вам для этого нужен старомодный объект Date
, преобразуйте непосредственно перед передачей Date
on:
Date oldfashionedDate = Date.from(utcDateDime.toInstant());
System.out.println(oldfashionedDate);
На моем компьютере это печатает
Tue Feb 27 01:00:00 CET 2018
Не обманывайтесь, это правильно.Мой часовой пояс (центральноевропейское время) находится в смещении +01: 00 от UTC в феврале (стандартное время), поэтому 01:00:00 здесь равно 00:00:00 UTC.Это просто Date.toString()
захват часового пояса JVM и использование его для создания строки.
Как мне установить его примерно на 5:30 вечера?
ToОтветьте на свой прямой вопрос напрямую, если у вас есть 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
и Calendar
против java.time
Класс Date
, который вы используете, а также Calendar
и SimpleDateFormat
, используемые в других ответах, давно устарел, и SimpleDateFormat
в частности оказался проблематичным.Во всех случаях современный API даты и времени Java намного приятнее работать.Вот почему я хотел дать этот ответ на старый вопрос, который все еще посещается.
Ссылка: Дата обучения для Oracle Time , объясняя, как использовать java.time
.