Modifica della data di Java un'ora indietro


124

Ho un oggetto data Java:

Date currentDate = new Date();

Questo darà la data e l'ora correnti. Esempio:

Thu Jan 12 10:17:47 GMT 2012

Invece, voglio ottenere la data, cambiandola in un'ora indietro, quindi dovrebbe darmi:

Thu Jan 12 09:17:47 GMT 2012

Quale sarebbe il modo migliore per farlo?


c'è qualche mktimeequivalente in java? sottrarre 60 minuti da esso?
Shiplu Mokaddim

Risposte:


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


La prima soluzione con Calendar funzionerebbe se l'ora è mezzanotte di un giorno e si desidera un'ora prima delle 23:00 del giorno precedente?
George Arokiam,

1
@GeorgeArokiam sì, lo sarebbe
Kimi

66

Simile alla soluzione di @Sumit Jain

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

o

Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.HOURS.toMillis(1));

3
Soluzione migliore. La creazione di istanze di calendario sembra eccessiva in questa particolare applicazione.
www.Decompiler.com

2
@cosmolev Calendar è eccessivo nella maggior parte degli esempi che trovo.
Peter Lawrey

2
@ Stoan ho aggiunto un esempio più leggibile. Tieni presente che Calendar è incredibilmente inefficiente.
Peter Lawrey,

@PeterLawrey Date currentDate = new Date(System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(10)); Questo dovrebbe essere di 10 minuti indietro?
Siya Sosibo

15

tl; dr

In UTC :

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

Oppure, suddiviso in zone:

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

Utilizzando java.time

Java 8 e versioni successive hanno il nuovo framework java.time integrato.

Instant

Se ti interessa solo UTC (GMT), usa la Instantclasse.

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

Scarica su console.

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

istantaneo: 2015-10-29T00: 37: 48.921Z | instantHourEarlier: 2015-10-28T23: 37: 48.921Z

Nota come in questo istante è successo di tornare alla data di ieri.

ZonedDateTime

Se ti interessa un fuso orario, usa la ZonedDateTimeclasse. Puoi iniziare con un Istantaneo e assegnare un fuso orario, un ZoneIdoggetto. Questa classe gestisce le regolazioni necessarie per anomalie come l' ora legale (DST) .

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

Scarica su console.

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

istantaneo: 2015-10-29T00: 50: 30.778Z

zdt: 2015-10-28T20: 50: 30.778-04: 00 [America / Montreal]

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

Conversione

Le vecchie classi java.util.Date/.Calendar ora sono obsolete. Evitali. Sono notoriamente fastidiosi e confusi.

Quando è necessario utilizzare le vecchie classi per operare con il vecchio codice non ancora aggiornato per i tipi java.time, chiamare i metodi di conversione. Ecco un esempio di codice che va da Instant o ZonedDateTime a java.util.Date.

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

…o…

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

Informazioni su java.time

Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date, Calendar, eSimpleDateFormat .

Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .

Per saperne di più, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .

Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizza un driver JDBC compatibile con JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno dijava.sql.* classi.

Dove ottenere le classi java.time?

Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval, YearWeek, YearQuartere altro .


Salve signore, ancora non riesco a trovare il modo corretto di fare "tempo fa" per l'Istant.
Ticherhaz

9

Usa il calendario .

Calendar cal = Calendar.getInstance();

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

7

O utilizzando la famosa libreria Joda Time :

DateTime dateTime = new DateTime();
dateTime = dateTime.minusHours(1);
Date modifiedDate = dateTime.toDate();

5

Basta sottrarre il numero di millisecondi in un'ora dalla data.

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


4

È possibile utilizzare dal codice seguente per data e ora:

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

Produzione :

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

Questo collegamento è buono: vedi qui

E vedi: Vedi anche

E: qui

E: qui

E: qui

Se ti serve solo tempo:

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

2
FYI: questa risposta utilizza vecchie classi data-ora problematiche che ora sono legacy, soppiantate dalle moderne classi java.time.
Basil Bourque

0

Ciò può essere ottenuto utilizzando java.util.Date. Il codice seguente sottrarrà 1 ora dalla data.

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

Allo stesso modo per sottrarre 20 secondi dalla tua data

newDate = DateUtils.addSeconds(date, -20)    

-1

Ottieni il tempo in millisecondi, meno i tuoi minuti in millisecondi e convertilo in Data. Qui devi oggettivarne uno !!!

    int minutes = 60;
    long currentDateTime = System.currentTimeMillis();
    Date currentDate = new Date(currentDateTime - minutes*60*1000);
    System.out.println(currentDate);

@ Makky: so che le cose sono cambiate. Ma non è una risposta sbagliata !!! Perché dici una risposta sbagliata? Hai visto completamente la risposta accettata?
Zenith

1
Perché dovresti rispondere anche a una domanda che ha 5 anni e ha accettato la risposta.
Makky

Questa risposta non fornisce alcun valore oltre alle risposte esistenti anni fa. E questa risposta utilizza incautamente terribili vecchie classi data-ora che sono state soppiantate per anni dalle classi java.time. Un altro problema: questa risposta ignora il problema del fuso orario e mostra il codice che utilizzerà l'attuale fuso orario predefinito della JVM mentre la domanda richiedeva GMT / UTC. Vedere le parti successive della risposta corretta di Kimi o vedere la mia risposta per ulteriori discussioni.
Basil Bourque

-1

Per me ha funzionato invece usando il formato. Per lavorare con il tempo basta usare i metodi parse e toString ()

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

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


1
Questa risposta non affronta la domanda. La domanda riguarda più di un semplice momento della giornata.
Basil Bourque
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.