Come sottrarre X giorno da un object Date in Java?

Voglio fare qualcosa come:

Date date = new Date(); // current date date = date - 300; // substract 300 days from current date and I want to use this "date" 

Come farlo?

Aggiornamento: con la modifica dell’ora della data di Java 8, utilizzare LocalDate

 LocalDate date = LocalDate.now().minusDays(300); 

Usa il metodo add() Calendar

 Calendar cal = Calendar.getInstance(); cal.setTime(dateInstance); cal.add(Calendar.DATE, -30); Date dateBefore30Days = cal.getTime(); 

Ti consiglio davvero di usare la libreria DateTime trovata qui: http://joda-time.sourceforge.net/

È una delle mie prime dipendenze che aggiungo a quasi ogni singolo progetto Java che costruisco.

Se hai un codice legacy che richiede date o calendari, puoi riconvertirlo da DateTimes.

Quindi sottrarre 300 giorni sarebbe facile come:

 Date date = new Date(); // Or where ever you get it from Date daysAgo = new DateTime(date).minusDays(300).toDate(); 

@JigarJoshi è la buona risposta, e ovviamente anche la raccomandazione @Tim da utilizzare. joda-time .

Voglio solo aggiungere più possibilità per sottrarre giorni da un java.util.Date .

Apache-commons

Una possibilità è usare apache-commons-lang . Puoi farlo usando DateUtils come segue:

 Date dateBefore30Days = DateUtils.addDays(new Date(),-30); 

Ovviamente aggiungere la dipendenza da commons-lang per fare solo la sottrazione della data, probabilmente non è una buona opzione, tuttavia se si sta già utilizzando commons-lang è una buona scelta. Ci sono anche metodi convenienti per addYears , addMonths , addWeeks e così via, addWeeks un’occhiata alla API qui .

Java 8

Un’altra possibilità è sfruttare il nuovo LocalDate da Java 8 usando il minusDays(long days) :

 LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30); 

Con Java 8 è molto semplice ora:

  LocalDate date = LocalDate.now().minusDays(300); 

Una grande guida alla nuova API può essere trovata qui .

API Java 8 Time:

 Instant now = Instant.now(); //current date Instant before = now.minus(Duration.ofDays(300)); Date dateBefore = Date.from(before); 

Come puoi vedere QUI c’è un sacco di manipolazioni che puoi fare. Ecco un esempio che mostra cosa potresti fare!

 DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); Calendar cal = Calendar.getInstance(); //Add one day to current date. cal.add(Calendar.DATE, 1); System.out.println(dateFormat.format(cal.getTime())); //Substract one day to current date. cal = Calendar.getInstance(); cal.add(Calendar.DATE, -1); System.out.println(dateFormat.format(cal.getTime())); /* Can be Calendar.DATE or * Calendar.MONTH, Calendar.YEAR, Calendar.HOUR, Calendar.SECOND */ 

Ho creato una funzione per semplificare il compito.

  • Per 7 giorni dopo dataString: dateCalculate(dateString,"yyyy-MM-dd",7);

  • Per ottenere 7 giorni aggiornatiString: dateCalculate(dateString,"yyyy-MM-dd",-7);


 public static String dateCalculate(String dateString, String dateFormat, int days) { Calendar cal = Calendar.getInstance(); SimpleDateFormat s = new SimpleDateFormat(dateFormat); try { cal.setTime(s.parse(dateString)); } catch (ParseException e) { e.printStackTrace(); } cal.add(Calendar.DATE, days); return s.format(cal.getTime()); } 

Puoi facilmente sottrarre con il calendario con SimpleDateFormat

  public static String subtractDate(String time,int subtractDay) throws ParseException { Calendar cal = Calendar.getInstance(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.ENGLISH); cal.setTime(sdf.parse(time)); cal.add(Calendar.DATE,-subtractDay); String wantedDate = sdf.format(cal.getTime()); Log.d("tag",wantedDate); return wantedDate; } 

Puoi semplicemente ottenere usando la libreria datetime di joda.

 DateTime date = new DateTime().minusDays(300); 
 c1.set(2017, 12 , 01); //Ex: 1999 jan 20 //System.out.println("Date is : " + sdf.format(c1.getTime())); c1.add(Calendar.MONTH, -2); // substract 1 month System.out.println ("Date minus 1 month : " + sdf.format(c1.getTime()));