Изменение даты Java на один час назад
У меня есть объект даты Java:
Date currentDate = new Date();
Это даст текущую дату и время. Пример:
Thu Jan 12 10:17:47 GMT 2012
Вместо этого я хочу получить дату, изменив ее на один час назад, чтобы он дал мне:
Thu Jan 12 09:17:47 GMT 2012
Каким будет лучший способ сделать это?
Ответы
Ответ 1
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));
Ответ 2
Аналогично решению @Sumit Jain
Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);
или
Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
Ответ 3
ТЛ; др
В 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
. Вы можете начать с 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 [Америка/Монреаль]
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?
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Здесь вы можете найти некоторые полезные классы, такие как Interval
, YearWeek
, YearQuarter
и другие.
Ответ 4
Используйте Calendar.
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
Ответ 5
Или используя знаменитую библиотеку Joda Time:
DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Ответ 6
Просто вычтите количество миллисекунд за час до даты.
currentDate.setTime(currentDate.getTime() - 3600 * 1000));
Ответ 7
Вы можете использовать следующий код для даты и времени:
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");
Ответ 8
Это может быть достигнуто с помощью java.util.Date
. Следующий код вычитает 1 час с вашей даты.
Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)
Аналогично для вычитания 20 секунд с вашей даты
newDate = DateUtils.addSeconds(date, -20)
Ответ 9
Это сработало для меня вместо использования формата. Для работы со временем просто используйте методы parse и toString()
String localTime = "6:11"; LocalTime localTime = LocalTime.parse (местное время)
LocalTime lt = 6:11; localTime = lt.toString()
Ответ 10
Получите время в миллисекундах, минус минуты в миллисекундах и преобразуйте его в Date. Здесь вам нужно объективировать один!!!
int minutes = 60;
long currentDateTime = System.currentTimeMillis();
Date currentDate = new Date(currentDateTime - minutes*60*1000);
System.out.println(currentDate);