Як додати n годин до об’єкта Date? Я знайшов інший приклад, використовуючи дні в StackOverflow, але все ще не розумію, як це зробити за допомогою годин.
Як додати n годин до об’єкта Date? Я знайшов інший приклад, використовуючи дні в StackOverflow, але все ще не розумію, як це зробити за допомогою годин.
Відповіді:
Перевірте календарний клас. Він має 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 для отримання додаткової інформації.
Calendar.add()це автоматично.
java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Якщо ви використовуєте Apache Commons / Lang , ви можете це зробити за один крок, використовуючи DateUtils.addHours():
Date newDate = DateUtils.addHours(oldDate, 3);
(Оригінальний об'єкт незмінний)
DateUtils.addHours(oldDate, -1);
Щоб спростити приклад @ Крістофера.
Скажіть, у вас є константа
public static final long HOUR = 3600*1000; // in milli-seconds.
Можна писати.
Date newDate = new Date(oldDate.getTime() + 2 * HOUR);
Якщо ви використовуєте довгий час для зберігання дати / часу замість об'єкта Дата, ви можете це зробити
long newDate = oldDate + 2 * HOUR;
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 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 8 і пізніших версій. Ці класи витісняти неприємні старі застарілі класи дати і часу , такі як java.util.Date, Calendar, і SimpleDateFormat.
Проект Joda-Time , який зараз знаходиться в режимі обслуговування , радить перейти до класів java.time .
Щоб дізнатися більше, дивіться навчальний посібник Oracle . І шукайте переповнення стека за багатьма прикладами та поясненнями. Специфікація - JSR 310 .
Ви можете обмінюватися об'єктами java.time безпосередньо зі своєю базою даних. Використовуйте драйвер JDBC, сумісний з JDBC 4.2 або пізнішої версії. Немає потреби в струнах, немає потреби в java.sql.*заняттях.
Де отримати класи java.time?
Проект ThreeTen-Extra розширює java.time додатковими класами. Цей проект є доказом можливих майбутніх доповнень до java.time. Ви можете знайти деякі корисні класи тут , такі як Interval, YearWeek, YearQuarter, і більш .
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
ZonedDateTimeскоріше, ніж за LocalDateTime. "Місцевий" означає не прив'язаний до якоїсь конкретної місцевості та не прив'язаний до часової шкали. Як і "Різдво починається опівночі 25 грудня 2015 року" - це різний момент у різних часових поясах, без жодного сенсу, поки ви не застосуєте певний часовий пояс, щоб отримати певний момент на часовій лінії. Крім того, без часового поясу літній час (DST) та інші аномалії не обробляються при такому використанні LocalDateTime. Дивіться мою відповідь для порівняння.
java.util.Dateоб'єкт , як запитуюча запитав нас , ZonedDateTime.toInstant()і , Date.from()як описано тут stackoverflow.com/a/32274725/5661065
Використовуючи новий клас java.util.concurrent.TimeUnit, ви можете це зробити так
Date oldDate = new Date(); // oldDate == current time
Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours
Щось на зразок:
Date oldDate = new Date(); // oldDate == current time
final long hoursInMillis = 60L * 60L * 1000L;
Date newDate = new Date(oldDate().getTime() +
(2L * hoursInMillis)); // Adds 2 hours
java.util.Date, java.util.Calendarі java.text.SimpleDateFormatтепер застарілі , замінені класами java.time, вбудованими в Java 8 та Java 9. Див. Підручник від Oracle .
Це ще один фрагмент коду, коли ваш 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
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);
Якщо ви готові використовувати 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.
Duration.parse(iso8601duration)цікаво, спасибі, але ви не можете використовувати оператор +на LocalDateTime, ви можете редагувати це. Але .plus(...)працює.
Dateоб'єкта, який представляє конкретний момент у UTC. Ваше використання LocalDateTimeне вдається вирішити питання. LocalDateTimeне вистачає жодної концепції часового поясу або зміщення з-за UTC, і тому не може представляти момент. Неправильний клас для цієї проблеми. Дивіться, в чому різниця між Instant і LocalDateTime?
DateОб'єкт @BasilBourque застарілий. Питання неоднозначне, коли йдеться про часовий пояс, тому мої відповіді стоять. Крім того, ви можете просто поміняти LocalDateTimeна ZonedDateTime.
Це можна зробити за допомогою API Joda DateTime
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
за допомогою 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?
Ви можете використовувати клас LocalDateTime з Java 8. Наприклад:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Dateоб'єкта, який представляє конкретний момент у UTC. Ваше використання LocalDateTimeне вдається вирішити питання. LocalDateTimeне вистачає жодної концепції часового поясу або зміщення з-за UTC, і тому не може представляти момент. Неправильний клас для цієї проблеми. Дивіться, в чому різниця між Instant і LocalDateTime?
Ви можете використовувати цей метод. Це легко зрозуміти та реалізувати:
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();
}