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.
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.
Risposte:
Controlla la classe del calendario. Ha add
metodo (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ù.
Calendar.add()
si occupa di questo automaticamente.
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
ora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle .
Se usi Apache Commons / Lang , puoi farlo in un solo passaggio usando DateUtils.addHours()
:
Date newDate = DateUtils.addHours(oldDate, 3);
(L'oggetto originale è invariato)
DateUtils.addHours(oldDate, -1);
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;
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.
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 toInstant
metodo 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 Instant
passando un TemporalAmount
tale 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 Instant
fuso orario desiderato / previsto creando un ZonedDateTime
.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
In alternativa, puoi chiamare plusHours
per 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.Date
e .Calendar
. Ma se hai davvero bisogno java.util.Date
di un'interoperabilità con classi non ancora aggiornate per i tipi java.time, converti da ZonedDateTime
via 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"? .
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?
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
, YearQuarter
e altro .
Con Joda-Time
DateTime dt = new DateTime();
DateTime added = dt.plusHours(6);
ClassNotDefinedException
ZonedDateTime
anziché 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.
java.util.Date
oggetto come richiedente ci aveva chiesto ZonedDateTime.toInstant()
e Date.from()
come descritto qui stackoverflow.com/a/32274725/5661065
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
Qualcosa di simile a:
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
ora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e Java 9. Vedi Tutorial di Oracle .
Questo è un altro pezzo di codice quando il tuo Date
oggetto è 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
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 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.
Duration.parse(iso8601duration)
è interessante, grazie, ma non puoi usare l'operatore +
su LocalDateTime
, potresti volerlo modificare. Ma .plus(...)
funziona.
Date
oggetto, che rappresenta un momento specifico in UTC. L'uso di LocalDateTime
non riesce a rispondere alla domanda. LocalDateTime
manca 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?
Date
oggetto @BasilBourque è obsoleto. La domanda è ambigua quando si tratta del fuso orario, quindi le mie risposte sono valide. Inoltre, si può solo scambiare LocalDateTime
per ZonedDateTime
.
Puoi farlo con l'API Joda DateTime
DateTime date= new DateTime(dateObj);
date = date.plusHours(1);
dateObj = date.toDate();
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);
Date
oggetto, che rappresenta un momento specifico in UTC. L'uso di LocalDateTime
non riesce a rispondere alla domanda. LocalDateTime
manca 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?
È possibile utilizzare la classe LocalDateTime da Java 8. Ad esempio:
long n = 4;
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime.plusHours(n));
Date
oggetto, che rappresenta un momento specifico in UTC. L'uso di LocalDateTime
non riesce a rispondere alla domanda. LocalDateTime
manca 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?
È 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();
}