Adicionando n horas a uma data em Java?


136

Como adiciono n horas a um objeto Date? Encontrei outro exemplo usando dias no StackOverflow, mas ainda não entendo como fazê-lo com horas.


3
Use joda-time.sourceforge.net , se possível.
Babar

3
Use Java 8 Date and Time, se possível.
peceps 18/08/16

@Babar FYI, o projeto Joda-Time agora está no modo de manutenção , com a equipe aconselhando a migração para as classes java.time . Consulte o Tutorial da Oracle .
Basil Bourque 25/03

Respostas:


210

Marque a classe Calendário. Possui addmétodo (e alguns outros) para permitir a manipulação do tempo. Algo assim 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.


4
Apenas tome cuidado se estiver lidando com horário de verão / horário de verão.
CurtainDog 27/08/10

5
Não é preciso mencionar que você pode adicionar "horas negativos"
pramodc84

6
O @CurtainDog Using Calendar.add()cuida disso automaticamente.
Jesper

6
cal.setTime (new Date ()) não é necessário - o javadoc de Calendar.getInstance () diz: "O Calendário retornado é baseado no horário atual no fuso horário padrão com o código de idioma padrão".
Mithrandir

FYI, os incômodos aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle .
Basil Bourque

82

Se você usa o Apache Commons / Lang , pode fazê-lo em uma etapa usando DateUtils.addHours():

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

(O objeto original permanece inalterado)


3
Você também pode usar horas negativas:DateUtils.addHours(oldDate, -1);
Kaptain 24/02

Nos bastidores, isso faz exatamente o que a resposta de Nikita faz, mas é muito simples e fácil de ler. Além disso, se você já usa o Apache Commons / Lang ... por que não?
13188 Matt

28

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 para armazenar data / hora em vez do objeto Data, poderá fazer

long newDate = oldDate + 2 * HOUR;

26

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

A estrutura java.time incorporada no Java 8 e posterior substitui as antigas classes Java.util.Date/.Calendar. Essas classes antigas são notoriamente problemáticas. Evite-os.

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

Instant instant = myUtilDate.toInstant();

Você pode adicionar horas a isso Instantpassando um TemporalAmountcomo Duration.

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

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

String output = instantHourLater.toString();

Você pode querer ver esse momento através das lentes do relógio de parede de uma região . Ajuste o Instantfuso horário desejado / esperado criando um ZonedDateTime.

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

Como alternativa, você pode ligar plusHourspara adicionar sua contagem de horas. Ser zoneado significa 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 classes de data e hora antigas, incluindo java.util.Datee .Calendar. Mas se você realmente precisa de uma java.util.Dateinteroperabilidade com classes ainda não atualizadas para os tipos java.time, converta de ZonedDateTimevia Instant. Novos métodos adicionados às classes antigas facilitam a conversão de / para tipos java.time.

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

Para obter mais discussões sobre conversão, consulte minha resposta à pergunta, converter java.util.Date para que tipo "java.time"? .


Sobre java.time

A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date, Calendar, e SimpleDateFormat.

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

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

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

Onde obter as classes java.time?

  • Java SE 8 , Java SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação em pacote configurável.
    • O Java 9 adiciona alguns recursos e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações do pacote Android das classes java.time.
    • Para anteriormente Android (<26), o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .

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


23

Com Joda-Time

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

2
+1 um pouco desnecessário para isso, mas se você estiver indo para fazer mais data manipulação, joda tempo é uma grande biblioteca
Joeri Hendrickx

3
@JoeriHendrickx Se o programador estiver adicionando horas a uma data, é muito provável que esteja fazendo outro trabalho de data e hora. Não considero desnecessário o Joda-Time ; a primeira coisa que faço ao configurar qualquer novo projeto é adicionar o Joda-Time. Até a Sun e a Oracle concordaram que o antigo java.util.Date e Calendário precisavam ser eliminados, e eles adicionaram o novo pacote java.time. * (Inspirado no Joda-Time) ao Java 8.
Basil Bourque

Eu tive problemas com o Joda no Android. Mantido recebendoClassNotDefinedException
TheRealChx101

23

Desde o Java 8:

LocalDateTime.now().minusHours(1);

Veja LocalDateTimeAPI .


4
Perto, mas não exatamente. Você deveria escolher um ZonedDateTimeao invés de um LocalDateTime. O "Local" significa não vinculado a nenhuma localidade específica e não vinculado à linha do tempo. Como "O Natal começa à meia-noite de 25 de dezembro de 2015" é um momento diferente nos vários fusos horários, sem sentido até você aplicar um fuso horário específico para obter um momento específico na linha do tempo. Além disso, sem um fuso horário, o horário de verão (DST) e outras anomalias não serão tratadas com esse uso do LocalDateTime. Veja minha resposta por comparação.
Basil Bourque

1
Também para obter um java.util.Dateobjeto como o solicitante nos solicitou ZonedDateTime.toInstant()e Date.from()conforme descrito aqui stackoverflow.com/a/32274725/5661065
hayduke

16

Usando a nova classe 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


7

Esse é outro trecho de código quando seu Dateobjeto está no formato Datetime. A beleza deste código é: se você der mais número de 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

1
Você também pode usar: Calendar cal = Calendar.getInstance ();
Stefan Sprenger

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

4

Se você deseja usar java.time, aqui está um método para adicionar durações no 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.  

1
Duration.parse(iso8601duration)é interessante, obrigado, mas você não pode usar o operador +em LocalDateTime, você pode querer editar isso. Mas .plus(...)funciona.
Qlown 24/05

Obrigado @qlown, acho que o + está funcionando bem porque é assim que estou usando agora. Modificarei a resposta de acordo.
Daniel

A pergunta é sobre um Dateobjeto, que representa um momento específico no UTC. Seu uso de LocalDateTimefalha ao abordar a questão. LocalDateTimenão possui qualquer conceito de fuso horário ou deslocamento do UTC e, portanto, não pode representar um momento. Classe incorreta para esse problema. Consulte Qual é a diferença entre Instant e LocalDateTime?
Basil Bourque

O Dateobjeto @BasilBourque está obsoleto. A pergunta é ambígua quando se trata do fuso horário, de modo que minhas respostas permaneçam. Além disso, você pode simplesmente trocar LocalDateTimepor ZonedDateTime.
28419 Daniel

4

Você pode fazer isso com a API Joda DateTime

DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();

Trabalhando depois que alterei a 1ª linha para DateTime dateTime = new DateTime (dateObj);
Sundararaj Govindasamy

1

usando Java 8 classes. podemos manipular data e hora com muita facilidade, como abaixo.

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

A pergunta é sobre um Dateobjeto, que representa um momento específico no UTC. Seu uso de LocalDateTimefalha ao abordar a questão. LocalDateTimenão possui qualquer conceito de fuso horário ou deslocamento do UTC e, portanto, não pode representar um momento. Classe incorreta para esse problema. Consulte Qual é a diferença entre Instant e LocalDateTime?
Basil Bourque

0

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

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

A pergunta é sobre um Dateobjeto, que representa um momento específico no UTC. Seu uso de LocalDateTimefalha ao abordar a questão. LocalDateTimenão possui qualquer conceito de fuso horário ou deslocamento do UTC e, portanto, não pode representar um momento. Classe incorreta para esse problema. Consulte Qual é a diferença entre Instant e LocalDateTime?
Basil Bourque

-1

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();
}

Essa abordagem já é apresentada em outra resposta postada anos atrás. Não vejo como este agrega mais valor.
Basil Bourque

O valor agregado da minha proposta é a simplicidade e a facilidade de implementação, o usuário precisa colá-lo e usá-lo e adicionar horas, minutos ou segundos, como você sabe, o nível de Iniciantes difere e se as respostas propostas combinam entre respostas simples e respostas avançadas será :) apreciável
Nimpo
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.