Я создал объект Date
в Java. Когда я это делаю, он показывает что-то вроде: date=Tue Aug 09 00:00:00 IST 2011
. В результате кажется, что мой файл Excel меньше на один день (27 февраля становится 26 февраля и т.д.). Я думаю, что это должно быть из-за времени. Как я могу настроить его примерно на 5:30 вечера?
Как установить время на объект даты в java
Ответ 1
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();
См. также
Ответ 2
Можете ли вы показать код, который вы используете для установки объекта даты? В любом случае < вы можете использовать этот код для инициализации даты:
new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
Ответ 3
Я хотел бы внести современный ответ. Это включает использование 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
:
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 вечера?
Чтобы ответить на ваш прямой вопрос напрямую, если у вас есть 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, объясняющая, как использовать java.time
.
Ответ 4
Если у вас нет доступа к java 8 и API java.time, вот моя простая функция - копировать время одной даты на другую с использованием старого java.util.Calendar (вдохновлено Jigar Джоши):
/**
* Copy only the time of one date to the date of another date.
*/
public static Date copyTimeToDate(Date date, Date time) {
Calendar t = Calendar.getInstance();
t.setTime(time);
Calendar c = Calendar.getInstance();
c.setTime(date);
c.set(Calendar.HOUR_OF_DAY, t.get(Calendar.HOUR_OF_DAY));
c.set(Calendar.MINUTE, t.get(Calendar.MINUTE));
c.set(Calendar.SECOND, t.get(Calendar.SECOND));
c.set(Calendar.MILLISECOND, t.get(Calendar.MILLISECOND));
return c.getTime();
}