Зміна дати Java на одну годину назад


124

У мене є об’єкт дати Java:

Date currentDate = new Date();

Це дасть поточну дату та час. Приклад:

Thu Jan 12 10:17:47 GMT 2012

Натомість я хочу отримати дату, змінивши її на одну годину назад, тому вона повинна дати мені:

Thu Jan 12 09:17:47 GMT 2012

Який був би найкращий спосіб зробити це?


є якийсь mktimeеквівалент у Java? відняти від нього 60 хвилин?
Шиплу Мокаддім

Відповіді:


243

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8: java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

Java 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));

8
Просто змініть
Вовк

Чи буде перше рішення з Календарем спрацьовувати, якщо час є опівночі одного дня, і ви хочете на годину раніше, а це 23 вечора попереднього дня?
Джордж Арокіям

1
@GeorgeArokiam так би було
Кімі

66

Подібно до рішення @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

або

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3
Шлях краще рішення. Створення екземплярів календаря виглядає як надмірне в цьому додатку.
www.Decompiler.com

2
У більшості прикладів, які я знайду, календар @cosmolev надмірний.
Пітер Лоурі

2
@Stoan Я додав більш читабельний приклад. Слід зазначити, що Календар неймовірно неефективний.
Пітер Лоурі

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Це повинно відстати на 10 хвилин?
Сія Сосібо

15

тл; д-р

В UTC :

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

Або зоновано:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

Використання java.time

У Java 8 і пізніших версіях вбудована нова платформа java.time .

Instant

Якщо вас цікавить тільки UTC (GMT), тоді використовуйте Instantклас.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

Скиньте до консолі.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

мить: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Зверніть увагу, як у цю мить трапилося повернутися до вчорашньої дати.

ZonedDateTime

Якщо ви дбаєте про часовий пояс, використовуйте ZonedDateTimeклас. Ви можете розпочати з Миттєвого та призначити часовий пояс ZoneIdоб’єкту. Цей клас обробляє необхідні корективи для аномалій, таких як літній час (DST) .

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

Скиньте до консолі.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

мить: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [Америка / Монреаль]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [Америка / Монреаль]

Перетворення

Старі класи java.util.Date/.Calendar застаріли. Уникайте їх. Вони сумно викликають занепокоєння і заплутаність.

Коли потрібно використовувати старі класи для роботи зі старим кодом, ще не оновленим для типів java.time, зателефонуйте до методів перетворення. Ось приклад коду, який переходить від Instant або ZonedDateTime до java.util.Date.

java.util.Date date = java.util.Date.from( instant );

… Або…

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

Про 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, і більш .


Здрастуйте, сер, я досі не можу знайти належного способу зробити "час назад" для Миттєвого.
Тічергаз



5

Просто відніміть кількість мілісекунд за годину від дати.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));


4

Ви можете використовувати з наведеного нижче коду для дати та часу:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

Вихід:

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

Це посилання добре: Дивіться тут

І дивіться: Дивіться теж

І: Ось

І: Ось

І: Ось

Якщо вам потрібен просто час:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

2
FYI: У цій відповіді використовуються тривожні старі класи дату, які тепер є застарілими, заміщені сучасними класами java.time.
Василь Бурк

0

Цього можна досягти, використовуючи java.util.Date. Наступний код віднімає 1 годину від вашої дати.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

Аналогічно для відняття 20 секунд від дати

newDate = DateUtils.addSeconds(date, -20)    

-1

Отримайте час у мілісекундах мінус хвилини в мілісекундах і перетворіть його на Дату. Тут вам потрібно об’єктивувати один !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);

@Makky: Я знаю, що все змінилося. Але це не помилкова відповідь !!! Чому ви говорите на цю неправильну відповідь? Ви повністю бачили прийняту відповідь?
Зеніт

1
Чому ви навіть відповіли на запитання, якому вже 5 років і прийняли відповідь.
Макі

Цей відповідь не надає ніякої цінності, ніж існуючі багаторічні відповіді. І ця відповідь нерозумно використовує жахливі старі класи часу, які роками витіснялися класами java.time. Ще одна проблема: ця відповідь ігнорує проблему часового поясу та показує код, який буде використовувати поточний часовий пояс JVM за замовчуванням, тоді як питання запитує GMT / UTC. Дивіться пізніші частини правильної відповіді Кімі або див. Мій відповідь для більшого обговорення.
Василь Бурк

-1

Для мене він працював замість формату. Щоб працювати з часом, просто використовуйте методи parse і toString ()

Рядок localTime = "6:11"; LocalTime localTime = LocalTime.parse (localtime)

LocalTime lt = 6:11; localTime = lt.toString ()


1
Ця відповідь не стосується питання. Питання стосується лише більше часу часу.
Василь Бурк
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.