Изменение даты Java на час назад

124

У меня есть объект даты Java:

Date currentDate = new Date();

Это даст текущую дату и время. Пример:

Thu Jan 12 10:17:47 GMT 2012

Вместо этого я хочу получить дату, изменив ее на один час назад, чтобы получить:

Thu Jan 12 09:17:47 GMT 2012

Как лучше всего это сделать?

Makky
источник
есть ли mktimeэквивалент в Java? вычесть из него 60 минут?
Шиплу Мокаддим

Ответы:

244

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));
Kimi
источник
8
Просто обратите внимание на тот факт, что есть Calendar.HOUR, который работает с 12-часовыми часами, и Calendar.HOUR_OF_DAY для 24-часовых часов: chintat.blogspot.ca/2006/05/…
Wolf
Будет ли первое решение с календарем работать, если время - полночь одного дня, а вы хотите на час раньше, то есть в 23:00 предыдущего дня?
Джордж Арокиам
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 минут позже ?
Siya Sosibo
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 | InstantHourРанее: 2015-10-28T23: 37: 48.921Z

Обратите внимание, как в этот момент случилось вернуться к вчерашней дате.

ZonedDateTime

Если вам важен часовой пояс, используйте ZonedDateTimeкласс. Вы можете начать с Instant и назначить часовой пояс, 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 [Америка / Монреаль]

zdtHourРанее: 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 Tutorial . И поищите в Stack Overflow множество примеров и объяснений. Спецификация - JSR 310 .

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

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

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

Василий Бурк
источник
Здравствуйте, сэр, я все еще не могу найти правильный способ сделать "время назад" для Instant.
Ticherhaz 02
9

Используйте Календарь .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
adarshr
источник
7

Или используя знаменитую библиотеку Joda Time :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Жан Логарт
источник
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
К вашему сведению: в этом ответе используются неприятные старые классы Date-time, которые теперь являются устаревшими, вытесненными современными классами java.time.
Basil
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
Зачем вам вообще отвечать на вопрос пятилетней давности, на который есть принятый ответ.
Makky
Этот ответ не имеет никакой ценности, кроме ответов, существующих много лет назад. И этот ответ неразумно использует ужасные старые классы даты и времени, которые годами вытеснялись классами java.time. Другая проблема: этот ответ игнорирует проблему часового пояса и показывает код, который будет использовать текущий часовой пояс JVM по умолчанию, в то время как вопрос запрашивает время по Гринвичу / UTC. См. Последующие части правильного ответа Кими или мой ответ для более подробного обсуждения.
Basil
-1

У меня это сработало вместо формата. Для работы со временем просто используйте методы parse и toString ()

Строка localTime = "6:11"; LocalTime localTime = LocalTime.parse (местное время)

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

Шахид Хуссейн Аббаси
источник
1
Этот ответ не касается вопроса. Вопрос касается не только времени суток.
Basil