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.
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.
Respostas:
Marque a classe Calendário. Possui add
mé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.
Calendar.add()
cuida disso automaticamente.
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle .
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)
DateUtils.addHours(oldDate, -1);
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;
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.
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 toInstant
mé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 Instant
passando um TemporalAmount
como 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 Instant
fuso horário desejado / esperado criando um ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
Como alternativa, você pode ligar plusHours
para 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.Date
e .Calendar
. Mas se você realmente precisa de uma java.util.Date
interoperabilidade com classes ainda não atualizadas para os tipos java.time, converta de ZonedDateTime
via 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"? .
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?
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 .
Com Joda-Time
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
ZonedDateTime
ao 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.
java.util.Date
objeto como o solicitante nos solicitou ZonedDateTime.toInstant()
e Date.from()
conforme descrito aqui stackoverflow.com/a/32274725/5661065
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
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
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 & Java 9. Consulte Tutorial pela Oracle .
Esse é outro trecho de código quando seu Date
objeto 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
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);
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.
Duration.parse(iso8601duration)
é interessante, obrigado, mas você não pode usar o operador +
em LocalDateTime
, você pode querer editar isso. Mas .plus(...)
funciona.
Date
objeto, que representa um momento específico no UTC. Seu uso de LocalDateTime
falha ao abordar a questão. LocalDateTime
nã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?
Date
objeto @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 LocalDateTime
por ZonedDateTime
.
Você pode fazer isso com a API Joda DateTime
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
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);
Date
objeto, que representa um momento específico no UTC. Seu uso de LocalDateTime
falha ao abordar a questão. LocalDateTime
nã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?
Você pode usar a classe LocalDateTime do Java 8. Por exemplo:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Date
objeto, que representa um momento específico no UTC. Seu uso de LocalDateTime
falha ao abordar a questão. LocalDateTime
nã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?
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();
}