Подтвердить что ты не робот

Как установить время на объект даты в java

Я создал объект Date в Java. Когда я это делаю, он показывает что-то вроде: date=Tue Aug 09 00:00:00 IST 2011. В результате кажется, что мой файл Excel меньше на один день (27 февраля становится 26 февраля и т.д.). Я думаю, что это должно быть из-за времени. Как я могу настроить его примерно на 5:30 вечера?

4b9b3361

Ответ 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();
}