Додавання n годин до дати на Java?


136

Як додати n годин до об’єкта Date? Я знайшов інший приклад, використовуючи дні в StackOverflow, але все ще не розумію, як це зробити за допомогою годин.


3
Якщо можливо, використовуйте joda-time.sourceforge.net .
Бабар

3
Використовуйте дату та час Java 8, якщо це можливо.
пецепс

@Babar FYI, проект Joda-Time зараз перебуває в режимі обслуговування , команда радить перейти до класів java.time . Дивіться Підручник від Oracle .
Василь Бурк

Відповіді:


210

Перевірте календарний клас. Він має 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 для отримання додаткової інформації.


4
Будьте обережні, якщо ви маєте справу з економією літнього часу / літнього часу.
CurtainDog

5
Зайве згадувати, що ви можете додати "негативні години"
pramodc84

6
@CurtainDog Використання забороняє Calendar.add()це автоматично.
Jesper

6
cal.setTime (нова дата ()) не потрібна - javadoc календаря Calendar.getInstance () говорить: "Повернений календар заснований на поточному часу в часовому поясі за замовчуванням з локальним умовою за замовчуванням."
мітрандір

FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Василь Бурк

82

Якщо ви використовуєте Apache Commons / Lang , ви можете це зробити за один крок, використовуючи DateUtils.addHours():

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

(Оригінальний об'єкт незмінний)


3
Ви також можете скористатися негативом Години:DateUtils.addHours(oldDate, -1);
Капітан

За лаштунками це робить саме те, що робить відповідь Нікіти, але це дуже просто і легко читати. Плюс, якщо ви вже використовуєте Apache Commons / Lang ... чому б і ні?
Мет

28

Щоб спростити приклад @ Крістофера.

Скажіть, у вас є константа

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

Можна писати.

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

Якщо ви використовуєте довгий час для зберігання дати / часу замість об'єкта Дата, ви можете це зробити

long newDate = oldDate + 2 * HOUR;

26

тл; д-р

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.Дати тип" java.time "? .


Про java.time

Java.time каркас вбудований в Java 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.

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

Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - 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, і більш .


23

З Joda-Time

DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);

2
+1 трохи непотрібно для цього, але якщо ви збираєтеся робити більше маніпуляцій на побачення, час joda - це чудова бібліотека
Joeri Hendrickx

3
@JoeriHendrickx Якщо програміст додає годин в день , то дуже ймовірно , що вони роблять інші дати і часу роботи. Я взагалі не вважаю Joda-Time зайвим; Перше, що я роблю при створенні будь-якого нового проекту, це додати Joda-Time. Навіть Sun та Oracle погодилися з тим, що старий java.util.Date & Calendar потрібно припинити, тому вони додали новий Java.time. * Пакет (натхненний Joda-Time) до Java 8.
Василь Бурк

У мене були проблеми з Джодою на андроїд. ClassNotDefinedException
Тримав

23

З Java 8:

LocalDateTime.now().minusHours(1);

Див. LocalDateTimeAPI .


4
Близький, але не зовсім правильний. Вам слід йти ZonedDateTimeскоріше, ніж за LocalDateTime. "Місцевий" означає не прив'язаний до якоїсь конкретної місцевості та не прив'язаний до часової шкали. Як і "Різдво починається опівночі 25 грудня 2015 року" - це різний момент у різних часових поясах, без жодного сенсу, поки ви не застосуєте певний часовий пояс, щоб отримати певний момент на часовій лінії. Крім того, без часового поясу літній час (DST) та інші аномалії не обробляються при такому використанні LocalDateTime. Дивіться мою відповідь для порівняння.
Василь Бурк

1
Крім того, щоб отримати java.util.Dateоб'єкт , як запитуюча запитав нас , ZonedDateTime.toInstant()і , Date.from()як описано тут stackoverflow.com/a/32274725/5661065
hayduke

16

Використовуючи новий клас java.util.concurrent.TimeUnit, ви можете це зробити так

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours

14

Щось на зразок:

Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() + 
                        (2L * hoursInMillis)); // Adds 2 hours

1
FYI, тривожні старі класи дату, такі як java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Василь Бурк

7

Це ще один фрагмент коду, коли ваш Dateоб'єкт знаходиться у форматі Datetime. Краса цього коду полягає в тому, що якщо ви надаєте більше годин, дата також буде відповідно оновлена.

    String myString =  "09:00 12/12/2014";
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy");
    Date myDateTime = null;

    //Parse your string to SimpleDateFormat
    try
      {
        myDateTime = simpleDateFormat.parse(myString);
      }
    catch (ParseException e)
      {
         e.printStackTrace();
      }
    System.out.println("This is the Actual Date:"+myDateTime);
    Calendar cal = new GregorianCalendar();
    cal.setTime(myDateTime);

    //Adding 21 Hours to your Date
    cal.add(Calendar.HOUR_OF_DAY, 21);
    System.out.println("This is Hours Added Date:"+cal.getTime());

Ось вихід:

    This is the Actual Date:Fri Dec 12 09:00:00 EST 2014
    This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014

1
Ви також можете використовувати: Календар cal = Calendar.getInstance ();
Стефан Спрінгер

4
Date argDate = new Date(); //set your date.
String argTime = "09:00"; //9 AM - 24 hour format :- Set your time.
SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy");
SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm");
String dateTime = sdf.format(argDate) + " " + argTime;
Date requiredDate = dateFormat.parse(dateTime);

4

Якщо ви готові використовувати 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.  

1
Duration.parse(iso8601duration)цікаво, спасибі, але ви не можете використовувати оператор +на LocalDateTime, ви можете редагувати це. Але .plus(...)працює.
qlown

Дякую @qlown, я думаю, що + працює в groovy, тому що я зараз його використовую. Відповідь я модифікую відповідно.
Даніель

Питання стосується Dateоб'єкта, який представляє конкретний момент у UTC. Ваше використання LocalDateTimeне вдається вирішити питання. LocalDateTimeне вистачає жодної концепції часового поясу або зміщення з-за UTC, і тому не може представляти момент. Неправильний клас для цієї проблеми. Дивіться, в чому різниця між Instant і LocalDateTime?
Василь Бурк

DateОб'єкт @BasilBourque застарілий. Питання неоднозначне, коли йдеться про часовий пояс, тому мої відповіді стоять. Крім того, ви можете просто поміняти LocalDateTimeна ZonedDateTime.
Даніель

4

Це можна зробити за допомогою API Joda DateTime

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

Робота після того, як я змінив перший рядок на DateTime dateTime = новий DateTime (dateObj);
Sundararaj Govindasamy

1

за допомогою Java 8 класів. ми можемо дуже легко маніпулювати датою та часом, як нижче.

LocalDateTime today = LocalDateTime.now();
LocalDateTime minusHours = today.minusHours(24);
LocalDateTime minusMinutes = minusHours.minusMinutes(30);
LocalDate localDate = LocalDate.from(minusMinutes);

Питання стосується Dateоб'єкта, який представляє конкретний момент у UTC. Ваше використання LocalDateTimeне вдається вирішити питання. LocalDateTimeне вистачає жодної концепції часового поясу або зміщення з-за UTC, і тому не може представляти момент. Неправильний клас для цієї проблеми. Дивіться, в чому різниця між Instant і LocalDateTime?
Василь Бурк

0

Ви можете використовувати клас LocalDateTime з Java 8. Наприклад:

long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));

Питання стосується Dateоб'єкта, який представляє конкретний момент у UTC. Ваше використання LocalDateTimeне вдається вирішити питання. LocalDateTimeне вистачає жодної концепції часового поясу або зміщення з-за UTC, і тому не може представляти момент. Неправильний клас для цієї проблеми. Дивіться, в чому різниця між Instant і LocalDateTime?
Василь Бурк

-1

Ви можете використовувати цей метод. Це легко зрозуміти та реалізувати:

public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.add(Calendar.HOUR_OF_DAY, nombreHeure);
    calendar.add(Calendar.MINUTE, nombreMinute);
    calendar.add(Calendar.SECOND, nombreSeconde);
    return calendar.getTime();
}

Такий підхід уже представлений в іншій відповіді, опублікованій років тому. Я не бачу, як цей додає більше цінності.
Василь Бурк

Додана цінність моєї пропозиції - це простота та простота реалізації, користувач просто повинен вставити її та використовувати та додати години, хвилини чи секунди, як відомо, рівень початківців відрізняється, і якщо запропоновані відповіді поєднуються між простими відповідями і розширені відповіді це буде помітно :)
Німпо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.