Добавляете n часов к дате в Java? - PullRequest
128 голосов
/ 27 августа 2010

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

Ответы [ 15 ]

200 голосов
/ 27 августа 2010

Проверьте календарь класса. У него есть метод 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, one hour in the future

Проверьте API для более.

71 голосов
/ 27 августа 2010

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

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

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

28 голосов
/ 28 августа 2010

Чтобы упростить пример @ Кристофера.

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

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;
23 голосов
/ 08 октября 2015

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.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.Date для какого типа «java.time»? .


О java.time

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

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

Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: 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) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

23 голосов
/ 27 августа 2010

С Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
21 голосов
/ 13 февраля 2014

Начиная с Java 8:

LocalDateTime.now().minusHours(1);

См. LocalDateTime API .

14 голосов
/ 27 августа 2010

Что-то вроде:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours
12 голосов
/ 16 октября 2013

Используя новый java.util.concurrent.TimeUnit класс, вы можете сделать это следующим образом

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours
6 голосов
/ 15 декабря 2014

Это еще один фрагмент кода, когда ваш Date объект находится в формате Datetime.Прелесть этого кода в том, что если вы дадите больше часов, дата также обновится соответственно.

4 голосов
/ 25 мая 2017

Если вы хотите использовать java.time, вот метод добавления длительностей в формате ISO 8601:

import java.time.Duration;
import java.time.LocalDateTime;

...

LocalDateTime yourDate = ...

...

// Adds 1 hour to your date.

yourDate = yourDate.plus(Duration.parse("PT1H")); // Java.
// OR
yourDate = yourDate + Duration.parse("PT1H"); // Groovy.  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...