Adicionando n horas a uma data em Java?

Como faço para adicionar n horas a um object Date? Eu encontrei outro exemplo usando dias no StackOverflow, mas ainda não entendo como fazer isso com horas.

Verifique a class do calendar. Tem add método (e alguns outros) para permitir a manipulação do tempo. Algo como isso deve funcionar.

  Calendar cal = Calendar.getInstance(); // creates calendar cal.setTime(new Date()); // 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 

Verifique a API para mais.

Se você usa o Apache Commons / Lang , você pode fazer isso em uma única etapa usando DateUtils.addHours() :

 Date newDate = DateUtils.addHours(oldDate, 3); 

(O object original é inalterado)

Para simplificar o exemplo de @ Christopher.

Digamos que você tenha uma constante

 public static final long HOUR = 3600*1000; // in milli-seconds. 

Você pode escrever.

 Date newDate = new Date(oldDate.getTime() + 2 * HOUR); 

Se você usar muito tempo para armazenar data / hora em vez do object Date, você pode fazer

 long newDate = oldDate + 2 * HOUR; 

Com Joda-Time

 DateTime dt = new DateTime(); DateTime added = dt.plusHours(6); 

tl; dr

 myJavaUtilDate.toInstant() .plusHours( 8 ) 

Ou…

 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. 

Usando java.time

O framework java.time embutido no Java 8 e posterior suplanta as antigas classs Java.util.Date /.Calendar. Essas classs antigas são notoriamente problemáticas. Evite-os.

Use o método toInstant recém-adicionado ao java.util.Date para converter do tipo antigo para o novo tipo java.time. Um Instant é um momento na linha do tempo no UTC com uma resolução de nanossegundos .

 Instant instant = myUtilDate.toInstant(); 

Você pode adicionar horas àquele Instant passando um TemporalAmount como Duration .

 Duration duration = Duration.ofHours( 8 ); Instant instantHourLater = instant.plus( duration ); 

Para ler essa data-hora, gere uma String no formato padrão ISO 8601 chamando toString .

 String output = instantHourLater.toString(); 

Você pode querer ver esse momento através da lente da hora do relógio de parede de alguma região. Ajuste o Instant no fuso horário desejado / esperado criando um ZonedDateTime .

 ZoneId zoneId = ZoneId.of( "America/Montreal" ); ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId ); 

Alternativamente, você pode ligar para o plusHours para adicionar sua contagem de horas. Estar zoneado significa que o horário de verão (DST) e outras anomalias serão tratadas em seu nome.

 ZonedDateTime later = zdt.plusHours( 8 ); 

Você deve evitar usar as antigas classs de data e hora, incluindo java.util.Date e .Calendar . Mas se você realmente precisa de um java.util.Date para interoperabilidade com classs ainda não atualizadas para tipos java.time, converta de ZonedDateTime via Instant . Novos methods adicionados às classs antigas facilitam a conversão de / para os tipos java.time.

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

Para mais discussões sobre conversão, veja minha resposta à pergunta, converter java.util.Date para o tipo “java.time”? .


Sobre o java.time

O framework java.time está embutido no Java 8 e posterior. Essas classs substituem as antigas classs herdadas de data e hora legadas , como java.util.Date , Calendar e SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migration para as classs java.time .

Para saber mais, veja o Oracle Tutorial . E pesquise o Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Você pode trocar objects java.time diretamente com seu database. Use um driver JDBC compatível com o JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de classs java.sql.* .

Onde obter as classs java.time?

  • Java SE 8 , Java SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação integrada.
    • O Java 9 adiciona alguns resources e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações do pacote Android das classs java.time.
    • Para Android anterior (<26), o projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima). Veja Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classs adicionais. Este projeto é um campo de testes para possíveis futuras adições ao java.time. Você pode encontrar algumas classs úteis aqui como Interval , YearWeek , YearQuarter e muito mais .

Desde o Java 8:

 LocalDateTime.now().minusHours(1); 

Veja a API LocalDateTime .

Algo como:

 Date oldDate = new Date(); // oldDate == current time final long hoursInMillis = 60L * 60L * 1000L; Date newDate = new Date(oldDate().getTime() + (2L * hoursInMillis)); // Adds 2 hours 

Usando a nova class java.util.concurrent.TimeUnit você pode fazer assim

  Date oldDate = new Date(); // oldDate == current time Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours 

Essa é outra parte do código quando seu object Date está no formato Datetime. A beleza deste código é: se você der mais horas, a data também será atualizada de acordo.

  String myString = "09:00 12/12/2014"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm dd/MM/yyyy"); Date myDateTime = null; //Parse your string to SimpleDateFormat try { myDateTime = simpleDateFormat.parse(myString); } catch (ParseException e) { e.printStackTrace(); } System.out.println("This is the Actual Date:"+myDateTime); Calendar cal = new GregorianCalendar(); 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()); 

Aqui está a saída:

  This is the Actual Date:Fri Dec 12 09:00:00 EST 2014 This is Hours Added Date:Sat Dec 13 06:00:00 EST 2014 

Se você está disposto a usar o java.time , aqui está um método para adicionar durações com o formato ISO 8601:

 import java.time.Duration; import java.time.LocalDateTime; ... LocalDateTime yourDate = ... ... // Adds 1 hour to your date. yourDate = yourDate.plus(Duration.parse("PT1H")); // Java. // OR yourDate = yourDate + Duration.parse("PT1H"); // Groovy. 

Você pode fazer isso com a API Joda DateTime

 DateTime date= new DateTime(dateObj); date = date.plusHours(1); dateObj = date.toDate(); 
 Date argDate = new Date(); //set your date. String argTime = "09:00"; //9 AM - 24 hour format :- Set your time. SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy"); SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm"); String dateTime = sdf.format(argDate) + " " + argTime; Date requiredDate = dateFormat.parse(dateTime); 

usando classs Java 8. podemos manipular a data e a hora com muita facilidade, conforme abaixo.

 LocalDateTime today = LocalDateTime.now(); LocalDateTime minusHours = today.minusHours(24); LocalDateTime minusMinutes = minusHours.minusMinutes(30); LocalDate localDate = LocalDate.from(minusMinutes); 

Você pode usar a class LocalDateTime do Java 8. Por exemplo:

 long n = 4; LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDateTime.plusHours(n)); 

Você pode usar este método, é fácil de entender e implementar:

 public static java.util.Date AddingHHMMSSToDate(java.util.Date date, int nombreHeure, int nombreMinute, int nombreSeconde) { Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.HOUR_OF_DAY, nombreHeure); calendar.add(Calendar.MINUTE, nombreMinute); calendar.add(Calendar.SECOND, nombreSeconde); return calendar.getTime(); }