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(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
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".
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
publicstaticfinallong HOUR =3600*1000;// in milli-seconds.
Você pode escrever.
Date newDate =newDate(oldDate.getTime()+2* HOUR);
Se você usar muito para armazenar data / hora em vez do objeto Data, poderá fazer
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 .
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.
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 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.
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 .
+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
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
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 =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());
Aqui está a saída:
This is the ActualDate:FriDec1209:00:00 EST 2014This is HoursAddedDate:SatDec1306:00:00 EST 2014
Você também pode usar: Calendar cal = Calendar.getInstance ();
Stefan Sprenger
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)é 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=newDateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
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:
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
Respostas:
Marque a classe Calendário. Possui
add
método (e alguns outros) para permitir a manipulação do tempo. Algo assim deve funcionar.Verifique a API para mais.
fonte
Calendar.add()
cuida disso automaticamente.java.util.Date
,java.util.Calendar
ejava.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()
:(O objeto original permanece inalterado)
fonte
DateUtils.addHours(oldDate, -1);
Para simplificar o exemplo de @ Christopher.
Digamos que você tenha uma constante
Você pode escrever.
Se você usar muito para armazenar data / hora em vez do objeto Data, poderá fazer
fonte
tl; dr
Ou…
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
toInstant
método adicionado recentemente ao java.util.Date para converter do tipo antigo para o novo tipo java.time. AnInstant
é um momento na linha do tempo no UTC com uma resolução de nanossegundos .Você pode adicionar horas a isso
Instant
passando umTemporalAmount
comoDuration
.Para ler essa data e hora, gere uma String no formato ISO 8601 padrão chamando
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 umZonedDateTime
.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.Você deve evitar usar as classes de data e hora antigas, incluindo
java.util.Date
e.Calendar
. Mas se você realmente precisa de umajava.util.Date
interoperabilidade com classes ainda não atualizadas para os tipos java.time, converta deZonedDateTime
viaInstant
. Novos métodos adicionados às classes antigas facilitam a conversão de / para tipos java.time.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
, eSimpleDateFormat
.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 .fonte
Com Joda-Time
fonte
ClassNotDefinedException
Desde o Java 8:
Veja
LocalDateTime
API .fonte
ZonedDateTime
ao invés de umLocalDateTime
. 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 solicitouZonedDateTime.toInstant()
eDate.from()
conforme descrito aqui stackoverflow.com/a/32274725/5661065Usando a nova classe java.util.concurrent.TimeUnit, você pode fazer assim
fonte
Algo como:
fonte
java.util.Date
,java.util.Calendar
ejava.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.Aqui está a saída:
fonte
fonte
Se você deseja usar
java.time
, aqui está um método para adicionar durações no formato ISO 8601:fonte
Duration.parse(iso8601duration)
é interessante, obrigado, mas você não pode usar o operador+
emLocalDateTime
, você pode querer editar isso. Mas.plus(...)
funciona.Date
objeto, que representa um momento específico no UTC. Seu uso deLocalDateTime
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 trocarLocalDateTime
porZonedDateTime
.Você pode fazer isso com a API Joda DateTime
fonte
usando Java 8 classes. podemos manipular data e hora com muita facilidade, como abaixo.
fonte
Date
objeto, que representa um momento específico no UTC. Seu uso deLocalDateTime
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:
fonte
Date
objeto, que representa um momento específico no UTC. Seu uso deLocalDateTime
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:
fonte