Как установить время для объекта даты в Java - PullRequest
59 голосов
/ 02 марта 2011

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

Ответы [ 3 ]

135 голосов
/ 02 марта 2011
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();

См. Также

14 голосов
/ 02 марта 2011

Можете ли вы показать код, который вы используете для установки объекта даты? В любом случае <вы можете использовать этот код для инициализации даты: </p>

new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse("2011-01-01 00:00:00")
5 голосов
/ 18 января 2018

Я хотел бы внести современный ответ.Это подразумевает использование 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...