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?

È stato utile?

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

 Tabella dei tipi di data e ora in Java, sia moderni che legacy.


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?

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());
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top