Aggiunta di n ore a una data in Java?


136

Come faccio ad aggiungere n ore a un oggetto Date? Ho trovato un altro esempio usando i giorni su StackOverflow, ma ancora non capisco come farlo con le ore.


3
Utilizzare joda-time.sourceforge.net , se possibile.
Babar,

3
Utilizzare la data e l'ora di Java 8, se possibile.
Peceps,

@Babar FYI, il progetto Joda-Time è ora in modalità manutenzione , con il team che consiglia la migrazione alle classi java.time . Vedi Tutorial di Oracle .
Basil Bourque,

Risposte:


210

Controlla la classe del calendario. Ha addmetodo (e alcuni altri) per consentire la manipolazione del tempo. Qualcosa del genere dovrebbe funzionare.

    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

Controlla API per di più.


4
Fai solo attenzione se hai a che fare con l'ora legale / l'ora legale.
CurtainDog,

5
Inutile dire che è possibile aggiungere "ore negative"
pramodc84,

6
@CurtainDog Using Calendar.add()si occupa di questo automaticamente.
Jesper,

6
cal.setTime (nuova data ()) non è necessario: il javadoc di Calendar.getInstance () dice: "Il calendario restituito si basa sull'ora corrente nel fuso orario predefinito con le impostazioni internazionali predefinite."
mithrandir,

Cordiali saluti, le vecchie e problematiche classi data-ora come java.util.Date, java.util.Calendare java.text.SimpleDateFormatora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle .
Basil Bourque,

82

Se usi Apache Commons / Lang , puoi farlo in un solo passaggio usando DateUtils.addHours():

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

(L'oggetto originale è invariato)


3
Puoi anche usare Negativ Hours:DateUtils.addHours(oldDate, -1);
Kaptain

Dietro le quinte, fa esattamente quello che fa la risposta di Nikita, ma è molto semplice e facile da leggere. Inoltre, se usi già Apache Commons / Lang ... perché no?
Matt,

28

Per semplificare l'esempio di @ Christopher.

Dì che hai una costante

public static final long HOUR = 3600*1000; // in milli-seconds.

Tu puoi scrivere.

Date newDate = new Date(oldDate.getTime() + 2 * HOUR);

Se usi long per memorizzare data / ora invece dell'oggetto Date, puoi farlo

long newDate = oldDate + 2 * HOUR;

27

tl; dr

myJavaUtilDate.toInstant()
              .plusHours( 8 )

O…

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.

Utilizzando java.time

Il framework java.time incorporato in Java 8 e successivamente soppianta le vecchie classi Java.util.Date/.Calendar. Quelle vecchie classi sono notoriamente fastidiose. Evitali.

Utilizzare il toInstantmetodo appena aggiunto a java.util.Date per convertire dal vecchio tipo al nuovo tipo java.time. An Instantè un momento sulla linea del tempo in UTC con una risoluzione di nanosecondi .

Instant instant = myUtilDate.toInstant();

È possibile aggiungere ore a quello Instantpassando un TemporalAmounttale Duration.

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

Per leggere quella data-ora, genera una stringa in formato ISO 8601 standard chiamando toString.

String output = instantHourLater.toString();

Potresti voler vedere quel momento attraverso l'obiettivo dell'ora dell'orologio da parete di una regione . Regola il Instantfuso orario desiderato / previsto creando un ZonedDateTime.

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

In alternativa, puoi chiamare plusHoursper aggiungere il conteggio delle ore. Essere suddivisi in zone significa che l'ora legale (DST) e altre anomalie saranno gestite per tuo conto.

ZonedDateTime later = zdt.plusHours( 8 );

Dovresti evitare di usare le vecchie classi di data e ora, inclusi java.util.Datee .Calendar. Ma se hai davvero bisogno java.util.Datedi un'interoperabilità con classi non ancora aggiornate per i tipi java.time, converti da ZonedDateTimevia Instant. Nuovi metodi aggiunti alle vecchie classi facilitano la conversione da / verso i tipi java.time.

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

Per ulteriori discussioni sulla conversione, vedere la mia risposta alla domanda, Converti java.util.Date in quale tipo di "java.time"? .


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, e SimpleDateFormat.

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

Per saperne di più, consulta 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. Utilizzare un driver JDBC conforme a JDBC 4.2 o successivo. Nessuna necessità di stringhe, nessuna necessità di java.sql.*classi.

Dove ottenere le classi java.time?

  • Java SE 8 , Java SE 9 e versioni successive
    • Built-in.
    • Parte dell'API Java standard con un'implementazione in bundle.
    • Java 9 aggiunge alcune funzionalità e correzioni minori.
  • Java SE 6 e Java SE 7
    • Gran parte della funzionalità java.time è trasferita su Java 6 e 7 in ThreeTen-Backport .
  • androide
    • Versioni successive di implementazioni di bundle Android delle classi java.time.
    • Per precedenza Android (<26), il ThreeTenABP progetto si adatta ThreeTen-Backport (di cui sopra). Vedi Come usare ThreeTenABP… .

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


23

Con Joda-Time

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

2
+1 un po 'inutile per questo, ma se hai intenzione di fare più manipolazione della data, il tempo di joda è una grande biblioteca
Joeri Hendrickx,

3
@JoeriHendrickx Se il programmatore sta aggiungendo ore a una data, molto probabilmente stanno facendo un altro lavoro di data e ora. Non considero affatto inutile Joda-Time ; la prima cosa che faccio quando installo un nuovo progetto è aggiungere Joda-Time. Anche Sun e Oracle concordarono sul fatto che il vecchio java.util.Date & Calendar necessitasse di essere gradualmente eliminato, quindi aggiunsero il nuovo pacchetto java.time. * (Ispirato a Joda-Time) a Java 8.
Basil Bourque,

Ho avuto problemi con Joda su Android. Continuava a ricevereClassNotDefinedException
TheRealChx101

23

Da Java 8:

LocalDateTime.now().minusHours(1);

Vedi LocalDateTimeAPI .


4
Chiudi ma non del tutto giusto. Dovresti optare per un ZonedDateTimeanziché un LocalDateTime. "Locale" significa non legato a nessuna località particolare e non legato alla linea temporale. Come "Natale inizia a mezzanotte del 25 dicembre 2015" è un momento diverso tra i vari fusi orari, senza alcun significato fino a quando non si applica un determinato fuso orario per ottenere un determinato momento sulla linea del tempo. Inoltre, senza un fuso orario l'ora legale (DST) e altre anomalie non verranno gestite con tale utilizzo di LocalDateTime. Vedi la mia risposta al confronto.
Basil Bourque,

1
Inoltre per ottenere un java.util.Dateoggetto come richiedente ci aveva chiesto ZonedDateTime.toInstant()e Date.from()come descritto qui stackoverflow.com/a/32274725/5661065
Hayduke

16

Usando la nuova classe java.util.concurrent.TimeUnit puoi farlo in questo modo

    Date oldDate = new Date(); // oldDate == current time
    Date newDate = new Date(oldDate.getTime() + TimeUnit.HOURS.toMillis(2)); // Adds 2 hours


7

Questo è un altro pezzo di codice quando il tuo Dateoggetto è in formato Datetime. Il bello di questo codice è che, se dai più numero di ore, anche la data verrà aggiornata di conseguenza.

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

Ecco l'output:

    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
Puoi anche usare: 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 sei disposto a utilizzare java.time, ecco un metodo per aggiungere durate formattate 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, grazie, ma non puoi usare l'operatore +su LocalDateTime, potresti volerlo modificare. Ma .plus(...)funziona.
qlown,

Grazie @qlown, immagino che il + stia funzionando in modo groovy perché è così che lo sto usando ora. Modificherò la risposta di conseguenza.
Daniel,

La domanda riguarda un Dateoggetto, che rappresenta un momento specifico in UTC. L'uso di LocalDateTimenon riesce a rispondere alla domanda. LocalDateTimemanca di qualsiasi concetto di fuso orario o offset da UTC e quindi non può rappresentare un momento. Classe errata per questo problema. Vedi Qual è la differenza tra Instant e LocalDateTime?
Basil Bourque,

L' Dateoggetto @BasilBourque è obsoleto. La domanda è ambigua quando si tratta del fuso orario, quindi le mie risposte sono valide. Inoltre, si può solo scambiare LocalDateTimeper ZonedDateTime.
Daniel,

4

Puoi farlo con l'API Joda DateTime

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

Funzionando dopo che ho cambiato la prima riga in DateTime dateTime = new DateTime (dateObj);
Sundararaj Govindasamy,

1

usando le classi Java 8. possiamo manipolare la data e l'ora molto facilmente come di seguito.

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

La domanda riguarda un Dateoggetto, che rappresenta un momento specifico in UTC. L'uso di LocalDateTimenon riesce a rispondere alla domanda. LocalDateTimemanca di qualsiasi concetto di fuso orario o offset da UTC e quindi non può rappresentare un momento. Classe errata per questo problema. Vedi Qual è la differenza tra Instant e LocalDateTime?
Basil Bourque,

0

È possibile utilizzare la classe LocalDateTime da Java 8. Ad esempio:

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

La domanda riguarda un Dateoggetto, che rappresenta un momento specifico in UTC. L'uso di LocalDateTimenon riesce a rispondere alla domanda. LocalDateTimemanca di qualsiasi concetto di fuso orario o offset da UTC e quindi non può rappresentare un momento. Classe errata per questo problema. Vedi Qual è la differenza tra Instant e LocalDateTime?
Basil Bourque,

-1

È possibile utilizzare questo metodo, è facile da capire e implementare:

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

Questo approccio è già presentato in un'altra risposta pubblicata anni fa. Non vedo come questo aggiunga più valore.
Basil Bourque,

Il valore aggiunto della mia proposta è la semplicità e la facilità di implementazione, l'utente deve solo incollarlo e usarlo e aggiungere ore, minuti o secondi, come sai, il livello di Principianti differisce e se le risposte proposte si combinano tra risposte semplici e risposte avanzate sarà apprezzabile :)
Nimpo,
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.