Come sottrarre X giorni da una data usando il calendario Java?
-
03-07-2019 - |
Domanda
Qualcuno conosce un modo semplice usando il calendario Java per sottrarre X giorni da una data?
Non sono stato in grado di trovare alcuna funzione che mi permetta di sottrarre direttamente X giorni da una data in Java. Qualcuno può indicarmi la giusta direzione?
Soluzione
Tratto da i documenti qui :
Aggiunge o sottrae il periodo di tempo specificato nel campo del calendario specificato, in base alle regole del calendario. Ad esempio, per sottrarre 5 giorni dall'ora corrente del calendario, puoi ottenerlo chiamando:
Calendar calendar = Calendar.getInstance(); // this would default to now calendar.add(Calendar.DAY_OF_MONTH, -5).
Altri suggerimenti
Puoi usare il metodo add
e passargli un numero negativo. Tuttavia, potresti anche scrivere un metodo più semplice che non utilizza la classe Calendar
come la seguente
public static void addDays(Date d, int days)
{
d.setTime( d.getTime() + (long)days*1000*60*60*24 );
}
Questo ottiene il valore data / ora della data (millisecondi dall'epoca) e aggiunge il numero corretto di millisecondi. È possibile passare un numero intero negativo per il parametro days per eseguire la sottrazione. Questo sarebbe più semplice del & Quot; proprio & Quot; soluzione di calendario:
public static void addDays(Date d, int days)
{
Calendar c = Calendar.getInstance();
c.setTime(d);
c.add(Calendar.DATE, days);
d.setTime( c.getTime().getTime() );
}
Nota che entrambe queste soluzioni cambiano l'oggetto Date
passato come parametro anziché restituire un <=> completamente nuovo. Entrambe le funzioni potrebbero essere facilmente modificate per farlo nell'altro modo, se lo si desidera.
La risposta di Anson funzionerà bene per il semplice caso, ma se hai intenzione di fare calcoli con date più complesse, ti consiglio di dare un'occhiata a Joda Time . Renderà la tua vita molto più semplice.
Cordiali saluti in Joda Time che potresti fare
DateTime dt = new DateTime();
DateTime fiveDaysEarlier = dt.minusDays(5);
tl; dr
LocalDate.now().minusDays( 10 )
Meglio specificare il fuso orario.
LocalDate.now( ZoneId.of( "America/Montreal" ) ).minusDays( 10 )
Dettagli
Le vecchie classi data-ora in bundle con le prime versioni di Java, come java.util.Date
/ .Calendar
, si sono rivelate problematiche, confuse e imperfette. Evitali.
java.time
Java 8 e versioni successive soppiantano quelle vecchie classi con il nuovo framework java.time. Vedi Tutorial . Definito da JSR 310 , ispirato a Joda-Time ed esteso da progetto ThreeTen-Extra . Il progetto ThreeTen-Backport esegue il back-port delle classi sull'amplificatore Java 6 &; 7; il progetto ThreeTenABP su Android.
La domanda è vaga, non chiara se richiede una sola data o una data-ora.
LocalDate
Per una sola data, senza ora del giorno, utilizzare la ZonedDateTime
classe. Si noti che un fuso orario è cruciale nel determinare una data come & Quot; oggi & Quot ;.
LocalDate today = LocalDate.now( ZoneId.of( "America/Montreal" ) );
LocalDate tenDaysAgo = today.minusDays( 10 );
Instant
Se intendevi una data-ora, usa Calendar
per ottenere un momento nella sequenza temporale in UTC . Da lì, regola un fuso orario per ottenere un < => oggetto.
Instant now = Instant.now(); // UTC.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
ZonedDateTime tenDaysAgo = zdt.minusDays( 10 );
Informazioni su java.time
Il java.time framework è integrato in Java 8 e versioni successive. Queste classi soppiantano le vecchie e problematiche legacy classi data-ora come SimpleDateFormat
, java.sql.*
, & amp; Interval
.
Il progetto Joda-Time , ora in < a href = "https://en.wikipedia.org/wiki/Maintenance_mode" rel = "nofollow noreferrer"> modalità di manutenzione , consiglia la migrazione alla classi java.time .
Per saperne di più, consulta Oracle Tutorial . 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 YearWeek
classi.
Dove ottenere le classi java.time?
- Java SE 8 , Java SE 9 , Java SE 10 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 ampli Java 6 &; 7 in ThreeTen-Backport .
- Android
- Versioni successive delle implementazioni di bundle Android delle classi java.time.
- Per Android precedente (< 26), ThreeTenABP il progetto adatta ThreeTen-Backport (menzionato sopra). Vedi Come usare ThreeTenABP & # 8230; .
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili aggiunte future a java.time. Puoi trovare alcune lezioni utili qui come YearQuarter
, <=> , <=> e altro .
int x = -1;
Calendar cal = ...;
cal.add(Calendar.DATE, x);
modifica: il parser non sembra gradire il collegamento a Javadoc, quindi eccolo in chiaro:
http: / /java.sun.com/j2se/1.4.2/docs/api/java/util/Calendar.html#add(int , int)
Invece di scrivere il mio addDays
come suggerito da Eli, preferirei usare DateUtils
da Apache . È utile soprattutto quando devi usarlo in più punti del tuo progetto.
L'API dice:
addDays(Date date, int amount)
Aggiunge un numero di giorni a una data che restituisce un nuovo oggetto.
Nota che restituisce un nuovo oggetto Date
e non apporta modifiche al precedente stesso.
Qualcuno ha consigliato Joda Time così - Ho usato questa CalendarDate classe http: // calendardate. sourceforge.net
È un progetto un po 'in competizione con Joda Time, ma molto più semplice in sole 2 classi. È molto utile e ha funzionato benissimo per ciò di cui avevo bisogno poiché non volevo usare un pacchetto più grande del mio progetto. A differenza delle controparti Java, la sua unità più piccola è il giorno, quindi è davvero una data (non averla in millisecondi o qualcosa del genere). Una volta creata la data, tutto ciò che fai per sottrarre è qualcosa come myDay.addDays (-5) per tornare indietro di 5 giorni. Puoi usarlo per trovare il giorno della settimana e cose del genere. Un altro esempio:
CalendarDate someDay = new CalendarDate(2011, 10, 27);
CalendarDate someLaterDay = today.addDays(77);
E
//print 4 previous days of the week and today
String dayLabel = "";
CalendarDate today = new CalendarDate(TimeZone.getDefault());
CalendarDateFormat cdf = new CalendarDateFormat("EEE");//day of the week like "Mon"
CalendarDate currDay = today.addDays(-4);
while(!currDay.isAfter(today)) {
dayLabel = cdf.format(currDay);
if (currDay.equals(today))
dayLabel = "Today";//print "Today" instead of the weekday name
System.out.println(dayLabel);
currDay = currDay.addDays(1);//go to next day
}
Può essere fatto facilmente con il seguente
Calendar calendar = Calendar.getInstance();
// from current time
long curTimeInMills = new Date().getTime();
long timeInMills = curTimeInMills - 5 * (24*60*60*1000); // `enter code here`subtract like 5 days
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
// from specific time like (08 05 2015)
calendar.set(Calendar.DAY_OF_MONTH, 8);
calendar.set(Calendar.MONTH, (5-1));
calendar.set(Calendar.YEAR, 2015);
timeInMills = calendar.getTimeInMillis() - 5 * (24*60*60*1000);
calendar.setTimeInMillis(timeInMills);
System.out.println(calendar.getTime());
La seconda soluzione di Eli Courtwright è sbagliata, dovrebbe essere:
Calendar c = Calendar.getInstance();
c.setTime(date);
c.add(Calendar.DATE, -days);
date.setTime(c.getTime().getTime());