Изменение даты Java один час назад - PullRequest
101 голосов
/ 12 января 2012

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

Date currentDate = new Date();

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

Thu Jan 12 10:17:47 GMT 2012

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

Thu Jan 12 09:17:47 GMT 2012

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

Ответы [ 10 ]

194 голосов
/ 12 января 2012

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));
59 голосов
/ 12 января 2012

Аналогично решению @Sumit Jain

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

или

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
13 голосов
/ 29 октября 2015

tl; др

В 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 );

instant: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 Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .

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

Где получить классы java.time?

  • Java SE 8 , Java SE 9 , Java SE 10, Java SE 11 и более поздние версии - часть стандартного Java API с связанной реализацией.
    • Java 9 добавляет некоторые незначительные функции и исправления.
  • Java SE 6 и JavaSE 7
    • Большинство функций java.time перенесено в Java 6 & 7 в ThreeTen-Backport .
  • Android
    • Более поздние версии пакетов Android для реализации java.time классы.
    • Для более ранних версий Android (<26) проект <a href="https://github.com/JakeWharton/ThreeTenABP" rel="nofollow noreferrer"> ThreeTenABP адаптируется ThreeTen-Backport (упомянуто выше).См. Как использовать ThreeTenABP… .

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

8 голосов
/ 12 января 2012

Использование Календарь .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
7 голосов
/ 12 января 2012

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

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
6 голосов
/ 12 января 2012

Просто вычтите количество миллисекунд в часе из даты.

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

3 голосов
/ 24 августа 2016

Вы можете использовать нижеприведенный код для даты и времени:

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");
1 голос
/ 07 ноября 2017

Это может быть достигнуто с помощью java.util.Date. Следующий код вычтет 1 час из вашей даты.

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

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

newDate = DateUtils.addSeconds(date, -20)    
0 голосов
/ 24 января 2019

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

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

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

0 голосов
/ 25 октября 2017

Получите время в миллисекундах, минус ваши минуты в миллисекундах и преобразуйте его в дату.Здесь вам нужно объективировать один !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...