Alterando a data Java uma hora atrás

124

Eu tenho um objeto de data Java:

Date currentDate = new Date();

Isso fornecerá a data e a hora atuais. Exemplo:

Thu Jan 12 10:17:47 GMT 2012

Em vez disso, quero obter a data, alterando-a para uma hora de volta para que me dê:

Thu Jan 12 09:17:47 GMT 2012

Qual seria a melhor maneira de fazer isso?

Makky
fonte
existe algum mktimeequivalente em java? subtrair 60 minutos disso?
Shiplu Mokaddim

Respostas:

243

java.util.Calendar

Calendar cal = Calendar.getInstance();
// remove next line if you're always using the current time.
cal.setTime(currentDate);
cal.add(Calendar.HOUR, -1);
Date oneHourBack = cal.getTime();

java.util.Date

new Date(System.currentTimeMillis() - 3600 * 1000);

org.joda.time.LocalDateTime

new LocalDateTime().minusHours(1)

Java 8: java.time.LocalDateTime

LocalDateTime.now().minusHours(1)

Java 8 java.time.Instant

// always in UTC if not timezone set
Instant.now().minus(1, ChronoUnit.HOURS));
// with timezone, Europe/Berlin for example
Instant.now()
       .atZone(ZoneId.of("Europe/Berlin"))
       .minusHours(1));
Kimi
fonte
8
Basta variar o fato de que existe Calendar.HOUR que funciona com relógio de 12 horas e Calendar.HOUR_OF_DAY para relógio de 24 horas: chintat.blogspot.ca/2006/05/…
Wolf
A primeira solução com o Calendário funcionaria se o horário fosse meia-noite de um dia e você quisesse uma hora mais cedo, ou seja, 23h do dia anterior?
George Arokiam
1
@GeorgeArokiam sim, seria
Kimi,
66

Semelhante à solução da @Sumit Jain

Date currentDate = new Date(System.currentTimeMillis() - 3600 * 1000);

ou

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));
Peter Lawrey
fonte
3
Solução muito melhor. A criação de instâncias de calendário parece um exagero neste aplicativo específico.
www.Decompiler.com
2
@cosmolev Calendar é um exagero na maioria dos exemplos que encontro.
Peter Lawrey
2
@Stoan Eu adicionei um exemplo mais legível. Você deve observar que o Calendário é incrivelmente ineficiente.
Peter Lawrey
@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Isso deve estar 10 minutos atrasado?
Siya Sosibo
15

tl; dr

Em UTC :

Instant.now().minus( 1 , ChronoUnit.HOURS ) 

Ou, zoneado:

Instant.now()
       .atZone( ZoneId.of ( "America/Montreal" ) )
       .minusHours( 1 )

Usando java.time

Java 8 e posterior tem a nova estrutura java.time integrada.

Instant

Se você se preocupa apenas com o UTC (GMT), use a Instantclasse.

Instant instant = Instant.now ();
Instant instantHourEarlier = instant.minus ( 1 , ChronoUnit.HOURS );

Despeje para o console.

System.out.println ( "instant: " + instant + " | instantHourEarlier: " + instantHourEarlier );

instantâneo: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Observe como, neste instante, voltou para a data de ontem.

ZonedDateTime

Se você se preocupa com um fuso horário, use a ZonedDateTimeclasse. Você pode começar com um Instant e atribuir um fuso horário, um ZoneIdobjeto. Esta classe lida com os ajustes necessários para anomalias, como horário de verão (DST) .

Instant instant = Instant.now ();
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant ( instant , zoneId );
ZonedDateTime zdtHourEarlier = zdt.minus ( 1 , ChronoUnit.HOURS );

Despeje para o console.

System.out.println ( "instant: " + instant + "\nzdt: " + zdt + "\nzdtHourEarlier: " + zdtHourEarlier );

instantâneo: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [América / Montreal]

zdtHourEarlier: 2015-10-28T19: 50: 30.778-04: 00 [America / Montreal]

Conversão

As antigas classes java.util.Date/.Calendar estão desatualizadas. Evite-os. Eles são notoriamente problemáticos e confusos.

Quando você deve usar as classes antigas para operar com código antigo ainda não atualizado para os tipos java.time, chame os métodos de conversão. Aqui está um exemplo de código indo de um Instant ou um ZonedDateTime para um java.util.Date.

java.util.Date date = java.util.Date.from( instant );

…ou…

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

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 Oracle . E pesquise no 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 cordas, 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 provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval, YearWeek, YearQuarter, e mais .

Basil Bourque
fonte
Olá senhor, ainda não consigo encontrar a maneira adequada de fazer "tempo atrás" para o Instant.
Ticherhaz
9

Use o calendário .

Calendar cal = Calendar.getInstance();

cal.setTime(new Date());
cal.set(Calendar.HOUR, cal.get(Calendar.HOUR) - 1);
Adarshr
fonte
7

Ou usando a famosa biblioteca Joda Time :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();
Jean Logeart
fonte
5

Basta subtrair o número de milissegundos em uma hora da data.

currentDate.setTime(currentDate.getTime() - 3600 * 1000));

Sumit Jain
fonte
4

Você pode usar o código abaixo para data e hora:

DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
       //get current date time with Calendar()
       Calendar cal = Calendar.getInstance();
       System.out.println("Current Date Time : " + dateFormat.format(cal.getTime()));

       cal.add(Calendar.DATE, 1);
       System.out.println("Add one day to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, 1);
       System.out.println("Add one month to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, 1);
       System.out.println("Add one year to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, 1);
       System.out.println("Add one hour to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, 1);
       System.out.println("Add one minute to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, 1);
       System.out.println("Add one second to current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.DATE, -1);
       System.out.println("Subtract one day from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MONTH, -1);
       System.out.println("Subtract one month from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.YEAR, -1);
       System.out.println("Subtract one year from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.HOUR, -1);
       System.out.println("Subtract one hour from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.MINUTE, -1);
       System.out.println("Subtract one minute from current date : " + dateFormat.format(cal.getTime()));

       cal = Calendar.getInstance();
       cal.add(Calendar.SECOND, -1);
       System.out.println("Subtract one second from current date : " + dateFormat.format(cal.getTime()));

Resultado :

Current Date Time : 2008/12/28 10:24:53
Add one day to current date : 2008/12/29 10:24:53
Add one month to current date : 2009/01/28 10:24:53
Add one year to current date : 2009/12/28 10:24:53
Add one hour to current date : 2008/12/28 11:24:53
Add one minute to current date : 2008/12/28 10:25:53
Add one second to current date : 2008/12/28 10:24:54
Subtract one day from current date : 2008/12/27 10:24:53
Subtract one month from current date : 2008/11/28 10:24:53
Subtract one year from current date : 2007/12/28 10:24:53
Subtract one hour from current date : 2008/12/28 09:24:53
Subtract one minute from current date : 2008/12/28 10:23:53
Subtract one second from current date : 2008/12/28 10:24:52

Este link é bom: Veja aqui

E veja: Veja também

E: aqui

E: aqui

E: aqui

Se você só precisa de tempo:

DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

fonte
2
Para sua informação: esta resposta usa classes antigas e problemáticas que agora são legadas, suplantadas pelas classes java.time modernas.
Basil Bourque
0

Isso pode ser feito usando java.util.Date. O código a seguir subtrairá 1 hora de sua data.

Date date = new Date(yourdate in date format);
Date newDate = DateUtils.addHours(date, -1)

Da mesma forma, para subtrair 20 segundos de sua data

newDate = DateUtils.addSeconds(date, -20)    
Dhananjay
fonte
-1

Obtenha o tempo em milissegundos, menos seus minutos em milissegundos e converta-o em Data. Aqui você precisa objetivar um !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);
Zênite
fonte
@Makky: Eu sei que as coisas mudaram. Mas não é uma resposta errada !!! Por que você dá uma resposta errada? Você viu a resposta aceita na íntegra?
Zenith,
1
Por que você responderia a uma pergunta de 5 anos e com resposta aceita.
Makky
Esta resposta não fornece nenhum valor além das respostas existentes há anos. E esta Resposta imprudentemente usa terríveis classes de data e hora que foram suplantadas por anos pelas classes java.time. Outro problema: esta Resposta ignora a questão do fuso horário e mostra o código que usará o fuso horário padrão atual da JVM enquanto a pergunta feita para GMT / UTC. Veja as últimas partes da Resposta correta de Kimi ou veja minha Resposta para mais discussão.
Basil Bourque
-1

Funcionou para mim em vez de usar o formato. Para trabalhar com o tempo, basta usar os métodos parse e toString ()

String localTime = "6:11"; LocalTime localTime = LocalTime.parse (localtime)

LocalTime lt = 6:11; localTime = lt.toString ()

Shahid Hussain Abbasi
fonte
1
Esta resposta não responde à pergunta. A questão é mais do que apenas uma hora do dia.
Basil Bourque