Вопрос-ответ

Adding n hours to a date in Java?

Добавление n часов к дате в Java?

Как мне добавить n часов к объекту даты? Я нашел другой пример с использованием days в StackOverflow, но все еще не понимаю, как это сделать с hours .

Переведено автоматически
Ответ 1

Проверьте Calendar класс. У него есть add метод (и некоторые другие), позволяющий манипулировать временем.

Что-то вроде этого должно сработать:

Calendar cal = Calendar.getInstance(); // creates calendar
cal.setTime(new Date()); // sets calendar time/date
cal.add(Calendar.HOUR_OF_DAY, 1); // adds one hour
cal.getTime(); // returns new date object plus one hour

Проверьте API для получения дополнительной информации.

Ответ 2

Если вы используете Apache Commons / Lang, вы можете сделать это за один шаг с помощью DateUtils.addHours():

Date newDate = DateUtils.addHours(oldDate, 3);

(Исходный объект не изменился)

Ответ 3

Для упрощения примера @Christopher.

Допустим, у вас есть константа

public static final long HOUR = 3600*1000; // in milli-seconds.

Вы можете написать.

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Если вы используете long для хранения даты / времени вместо объекта Date, вы можете сделать

long newDate = oldDate + 2 * HOUR;
Ответ 4

tl; dr

myJavaUtilDate.toInstant()
.plusHours( 8 )

Или…

myJavaUtilDate.toInstant()                // Convert from legacy class to modern class, an `Instant`, a point on the timeline in UTC with resolution of nanoseconds.
.plus( // Do the math, adding a span of time to our moment, our `Instant`.
Duration.ofHours( 8 ) // Specify a span of time unattached to the timeline.
) // Returns another `Instant`. Using immutable objects creates a new instance while leaving the original intact.

Использование java.time

Фреймворк java.time, встроенный в Java 8 и более поздние версии, заменяет старые классы Java.util.Date / .Calendar . Эти старые классы, как известно, доставляют много хлопот. Избегайте их.

Используйте toInstant метод, недавно добавленный в java.util.Date для преобразования из старого типа в новый java.time. An Instant - это момент на временной шкале в UTC с разрешением в наносекунды.

Instant instant = myUtilDate.toInstant();

Вы можете добавить к ней количество часов, Instant передав TemporalAmount например Duration.

Duration duration = Duration.ofHours( 8 );
Instant instantHourLater = instant.plus( duration );

Чтобы прочитать эту дату-время, сгенерируйте строку в стандартном формате ISO 8601, вызвав toString.

String output = instantHourLater.toString();

Возможно, вы захотите увидеть этот момент через призму времени на настенных часах в каком-либо регионе. Отрегулируйте время Instant в соответствии с вашим желаемым / ожидаемым часовым поясом, создав ZonedDateTime.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );

В качестве альтернативы вы можете позвонитьplusHours, чтобы добавить количество часов. Зонирование означает, что переход на летнее время (DST) и другие аномалии будут обрабатываться от вашего имени.

ZonedDateTime later = zdt.plusHours( 8 );

Вам следует избегать использования старых классов даты и времени, включая java.util.Date и .Calendar. Но если вам действительно нужен java.util.Date для взаимодействия с классами, которые еще не обновлены для типов java.time, преобразуйте из ZonedDateTime через Instant. Новые методы, добавленные в старые классы, облегчают преобразование в / из типов java.time.

java.util.Date date = java.util.Date.from( later.toInstant() );

Подробнее о преобразовании читайте в моем ответе на вопрос, Преобразуйте java.util.Дату в какой тип “java.time”?.


О java.time

Платформа java.time встроена в Java 8 и более поздние версии. Эти классы заменяют старые, вызывающие беспокойство, устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

Проект Joda-Time, который сейчас находится в режиме обслуживания, рекомендует перейти на классы java.time.

Чтобы узнать больше, ознакомьтесь с Руководством по Oracle. И найдите в Stack Overflow множество примеров и пояснений. Спецификация - JSR 310.

Вы можете обмениваться объектами java.time непосредственно со своей базой данных. Используйте драйвер JDBC, совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где взять классы java.time?


  • Java SE 8, Java SE 9 и более поздние версии

    • Встроено.

    • Часть стандартного Java API с комплексной реализацией.

    • Java 9 добавляет некоторые незначительные функции и исправления.


  • Java SE 6 и Java SE 7

    • Большая часть функциональных возможностей java.time перенесена обратно на Java 6 и 7 в ThreeTen-Backport.


  • Android

    • Более поздние версии Android включают реализации классов java.time.

    • Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP ....


Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является испытательным полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти несколько полезных классов, таких как Interval, YearWeek, YearQuarter и больше.

java date