Проверьте календарь класса. У него есть addметод (и некоторые другие), позволяющие манипулировать временем. Нечто подобное должно работать.
Calendar cal =Calendar.getInstance();// creates calendar
cal.setTime(newDate());// 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
Просто будьте осторожны, если вы имеете дело с летним / летним временем.
CurtainDog
5
Излишне упоминать, что вы можете добавить «отрицательные часы»
pramodc84
6
@CurtainDog Using Calendar.add()позаботится об этом автоматически.
Джеспер
6
cal.setTime (new Date ()) не требуется - в javadoc Calendar.getInstance () говорится: «Возвращенный календарь основан на текущем времени в часовом поясе по умолчанию и в локали по умолчанию».
Вы также можете использовать отрицательные часы:DateUtils.addHours(oldDate, -1);
Kaptain
За кулисами это делает именно то, что делает ответ Никиты, но это очень просто и легко читается. Кроме того, если вы уже используете Apache Commons / Lang ... почему бы и нет?
Мэтт
28
Чтобы упростить пример @ Кристофера.
Скажем, у вас есть постоянная
publicstaticfinallong HOUR =3600*1000;// in milli-seconds.
Ты можешь написать.
Date newDate =newDate(oldDate.getTime()+2* HOUR);
Если вы используете long для хранения даты / времени вместо объекта Date, вы можете сделать
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.time, встроенная в Java 8 и более поздние версии, вытесняет старые классы Java.util.Date/.Calendar. Эти старые классы, как известно, хлопотно. Избежать их.
Используйте toInstantметод, недавно добавленный в java.util.Date, чтобы преобразовать старый тип в новый тип java.time. InstantЭто момент на линии времени в UTC с разрешением наносекунд .
Чтобы прочитать эту дату и время, сгенерируйте строку в стандартном формате ISO 8601, вызвав ее toString.
String output = instantHourLater.toString();
Вы можете захотеть увидеть этот момент через призму часового времени какого-то региона . Настройте Instantв желаемый / ожидаемый часовой пояс, создав ZonedDateTime.
Кроме того, вы можете позвонить, 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());
Чтобы узнать больше, смотрите Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .
Вы можете обмениваться объектами java.time напрямую с вашей базой данных. Используйте драйвер JDBC, соответствующий JDBC 4.2 или более поздней версии . Нет необходимости в строках, нет необходимости в java.sql.*классах.
Более поздние версии Android связывают реализации классов java.time.
Для более ранних версий Android (<26) проект ThreeTenABP адаптирует ThreeTen-Backport (упомянутый выше). Смотрите Как использовать ThreeTenABP… .
Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time. Вы можете найти некоторые полезные классы здесь , такие как Interval, YearWeek, YearQuarter, и более .
+1 немного не нужно для этого, но если вы собираетесь больше манипулировать датами, то joda time - отличная библиотека
Joeri Hendrickx
3
@JoeriHendrickx Если программист добавляет часов в день , то очень вероятно , что они делают другие даты и времени работы. Я не считаю Joda-Time ненужным; первое, что я делаю при настройке любого нового проекта, это добавляю Joda-Time. Даже Sun и Oracle сошлись во мнении, что старые java.util.Date и Calendar должны быть сняты с производства, поэтому они добавили новый пакет java.time. * (Вдохновленный Joda-Time) в Java 8.
Василий Бурк
У меня были проблемы с Йодой на андроиде. Хранится получениеClassNotDefinedException
Близко, но не совсем верно. Вы должны идти за, ZonedDateTimeа не LocalDateTime. «Местный» означает, что он не привязан к какой-либо конкретной местности и не привязан к временной шкале. Например, «Рождество начинается в полночь 25 декабря 2015 года» - это другой момент в разных часовых поясах, который не имеет смысла, пока вы не примените определенный часовой пояс, чтобы получить определенный момент на временной шкале. Кроме того, без часового пояса летнее время (DST) и другие аномалии не будут обрабатываться с таким использованием LocalDateTime. Смотрите мой ответ по сравнению.
Василий Бурк
1
Также, чтобы получить java.util.Dateобъект, как нас просил запрашивающий, ZonedDateTime.toInstant()и Date.from()как описано здесь stackoverflow.com/a/32274725/5661065
Это еще один фрагмент кода, когда ваш Dateобъект находится в формате Datetime. Прелесть этого кода в том, что если вы дадите больше часов, дата также обновится соответствующим образом.
String myString ="09:00 12/12/2014";SimpleDateFormat simpleDateFormat =newSimpleDateFormat("HH:mm dd/MM/yyyy");Date myDateTime =null;//Parse your string to SimpleDateFormattry{
myDateTime = simpleDateFormat.parse(myString);}catch(ParseException e){
e.printStackTrace();}System.out.println("This is the Actual Date:"+myDateTime);Calendar cal =newGregorianCalendar();
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 ActualDate:FriDec1209:00:00 EST 2014This is HoursAddedDate:SatDec1306:00:00 EST 2014
Вы также можете использовать: Календарь cal = Calendar.getInstance ();
Стефан Спренгер,
4
Date argDate =newDate();//set your date.String argTime ="09:00";//9 AM - 24 hour format :- Set your time.SimpleDateFormat sdf =newSimpleDateFormat("dd-MMM-yyyy");SimpleDateFormat dateFormat =newSimpleDateFormat("dd-MMM-yyyy HH:mm");String dateTime = sdf.format(argDate)+" "+ argTime;Date requiredDate = dateFormat.parse(dateTime);
Duration.parse(iso8601duration)это интересно, спасибо, но вы не можете использовать оператор +on LocalDateTime, вы можете отредактировать это. Но .plus(...)работает.
qlown
Спасибо @qlown, я думаю, что + работает отлично, потому что именно так я сейчас и использую. Я изменю ответ соответственно.
Даниил
Вопрос об Dateобъекте, который представляет определенный момент в UTC. Ваше использование LocalDateTimeне решает вопрос. LocalDateTimeотсутствует какая-либо концепция часового пояса или смещения от UTC, и поэтому не может представлять момент. Неправильный класс для этой проблемы. Посмотрите, в чем разница между Instant и LocalDateTime?
Базилик Бурк
@BasilBourque Dateобъект устарел. Вопрос двусмысленный, когда речь идет о часовом поясе, поэтому мои ответы остаются. Кроме того, вы можете просто поменять LocalDateTimeна ZonedDateTime.
Даниэль
4
Вы можете сделать это с Joda DateTime API
DateTime date=newDateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
Вопрос об Dateобъекте, который представляет определенный момент в UTC. Ваше использование LocalDateTimeне решает вопрос. LocalDateTimeотсутствует какая-либо концепция часового пояса или смещения от UTC, и поэтому не может представлять момент. Неправильный класс для этой проблемы. Посмотрите, в чем разница между Instant и LocalDateTime?
Базилик Бурк
0
Вы можете использовать класс LocalDateTime из Java 8. Например:
long n =4;LocalDateTime localDateTime =LocalDateTime.now();System.out.println(localDateTime.plusHours(n));
Вопрос об Dateобъекте, который представляет определенный момент в UTC. Ваше использование LocalDateTimeне решает вопрос. LocalDateTimeотсутствует какая-либо концепция часового пояса или смещения от UTC, и поэтому не может представлять момент. Неправильный класс для этой проблемы. Посмотрите, в чем разница между Instant и LocalDateTime?
Василий Бурк
-1
Вы можете использовать этот метод, это легко понять и реализовать:
Этот подход уже представлен в другом ответе, опубликованном несколько лет назад. Я не вижу, как это добавляет ценность.
Василий Бурк
Дополнительным преимуществом моего предложения является простота и легкость реализации, пользователь просто вставляет его и использует его, а также добавляет часы, минуты или секунды, как вы знаете, уровень начинающих отличается, и если предлагаемые ответы объединяются между простыми ответами и расширенные ответы это будет заметно :)
Ответы:
Проверьте календарь класса. У него есть
add
метод (и некоторые другие), позволяющие манипулировать временем. Нечто подобное должно работать.Проверьте API для больше.
источник
Calendar.add()
позаботится об этом автоматически.java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и Java 9. См. Учебное пособие Oracle .Если вы используете Apache Commons / Lang , вы можете сделать это за один шаг, используя
DateUtils.addHours()
:(Исходный объект не изменился)
источник
DateUtils.addHours(oldDate, -1);
Чтобы упростить пример @ Кристофера.
Скажем, у вас есть постоянная
Ты можешь написать.
Если вы используете long для хранения даты / времени вместо объекта Date, вы можете сделать
источник
ТЛ; др
Или…
Использование java.time
Среда java.time, встроенная в Java 8 и более поздние версии, вытесняет старые классы Java.util.Date/.Calendar. Эти старые классы, как известно, хлопотно. Избежать их.
Используйте
toInstant
метод, недавно добавленный в java.util.Date, чтобы преобразовать старый тип в новый тип java.time.Instant
Это момент на линии времени в UTC с разрешением наносекунд .Вы можете добавить к этому часы,
Instant
передавTemporalAmount
такие какDuration
.Чтобы прочитать эту дату и время, сгенерируйте строку в стандартном формате ISO 8601, вызвав ее
toString
.Вы можете захотеть увидеть этот момент через призму часового времени какого-то региона . Настройте
Instant
в желаемый / ожидаемый часовой пояс, создавZonedDateTime
.Кроме того, вы можете позвонить,
plusHours
чтобы добавить свой счет часов. Зональность означает переход на летнее время (DST) и другие аномалии, которые будут обрабатываться от вашего имени.Вам следует избегать использования старых классов даты и времени, включая
java.util.Date
и.Calendar
. Но если вам действительно нужнаjava.util.Date
функциональная совместимость с классами, которые еще не обновлены для типов java.time, выполните конвертацию сZonedDateTime
помощьюInstant
. Новые методы, добавленные к старым классам, облегчают преобразование в / из типов java.time.Для получения дополнительной информации о преобразовании см. Мой ответ на вопрос « Преобразовать java.util.Date» к какому типу «java.time»? ,
О 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
, и более .источник
С Joda-Time
источник
ClassNotDefinedException
Начиная с Java 8:
Смотрите
LocalDateTime
API .источник
ZonedDateTime
а неLocalDateTime
. «Местный» означает, что он не привязан к какой-либо конкретной местности и не привязан к временной шкале. Например, «Рождество начинается в полночь 25 декабря 2015 года» - это другой момент в разных часовых поясах, который не имеет смысла, пока вы не примените определенный часовой пояс, чтобы получить определенный момент на временной шкале. Кроме того, без часового пояса летнее время (DST) и другие аномалии не будут обрабатываться с таким использованием LocalDateTime. Смотрите мой ответ по сравнению.java.util.Date
объект, как нас просил запрашивающий,ZonedDateTime.toInstant()
иDate.from()
как описано здесь stackoverflow.com/a/32274725/5661065Используя новый класс java.util.concurrent.TimeUnit, вы можете сделать это следующим образом
источник
Что-то вроде:
источник
java.util.Date
,java.util.Calendar
иjava.text.SimpleDateFormat
теперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и Java 9. См. Учебное пособие Oracle .Это еще один фрагмент кода, когда ваш
Date
объект находится в формате Datetime. Прелесть этого кода в том, что если вы дадите больше часов, дата также обновится соответствующим образом.Вот результат:
источник
источник
Если вы хотите использовать
java.time
, вот метод для добавления длительностей в формате ISO 8601:источник
Duration.parse(iso8601duration)
это интересно, спасибо, но вы не можете использовать оператор+
onLocalDateTime
, вы можете отредактировать это. Но.plus(...)
работает.Date
объекте, который представляет определенный момент в UTC. Ваше использованиеLocalDateTime
не решает вопрос.LocalDateTime
отсутствует какая-либо концепция часового пояса или смещения от UTC, и поэтому не может представлять момент. Неправильный класс для этой проблемы. Посмотрите, в чем разница между Instant и LocalDateTime?Date
объект устарел. Вопрос двусмысленный, когда речь идет о часовом поясе, поэтому мои ответы остаются. Кроме того, вы можете просто поменятьLocalDateTime
наZonedDateTime
.Вы можете сделать это с Joda DateTime API
источник
с помощью классов Java 8. мы можем очень легко манипулировать датой и временем, как показано ниже.
источник
Date
объекте, который представляет определенный момент в UTC. Ваше использованиеLocalDateTime
не решает вопрос.LocalDateTime
отсутствует какая-либо концепция часового пояса или смещения от UTC, и поэтому не может представлять момент. Неправильный класс для этой проблемы. Посмотрите, в чем разница между Instant и LocalDateTime?Вы можете использовать класс LocalDateTime из Java 8. Например:
источник
Date
объекте, который представляет определенный момент в UTC. Ваше использованиеLocalDateTime
не решает вопрос.LocalDateTime
отсутствует какая-либо концепция часового пояса или смещения от UTC, и поэтому не может представлять момент. Неправильный класс для этой проблемы. Посмотрите, в чем разница между Instant и LocalDateTime?Вы можете использовать этот метод, это легко понять и реализовать:
источник