Voglio fare qualcosa del tipo:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
Come farlo?
java.util.Date
ora sono legacy , soppiantate dalle classi java.time .
Voglio fare qualcosa del tipo:
Date date = new Date(); // current date
date = date - 300; // substract 300 days from current date and I want to use this "date"
Come farlo?
java.util.Date
ora sono legacy , soppiantate dalle classi java.time .
Risposte:
Con la modifica dell'API di data e ora di Java 8, Usa LocalDate
LocalDate date = LocalDate.now().minusDays(300);
Allo stesso modo puoi avere
LocalDate date = someLocalDateInstance.minusDays(300);
Fare riferimento a https://stackoverflow.com/a/23885950/260990 per la traduzione tra java.util.Date <--> java.time.LocalDateTime
Date in = new Date();
LocalDateTime ldt = LocalDateTime.ofInstant(in.toInstant(), ZoneId.systemDefault());
Date out = Date.from(ldt.atZone(ZoneId.systemDefault()).toInstant());
Calendar cal = Calendar.getInstance();
cal.setTime(dateInstance);
cal.add(Calendar.DATE, -30);
Date dateBefore30Days = cal.getTime();
java.util.Date
, java.util.Calendar
e java.text.SimpleTextFormat
ora sono l'eredità , soppiantato dai java.time classi. Vedi Tutorial di Oracle .
@JigarJoshi è la buona risposta, e ovviamente anche la raccomandazione @Tim da usare. tempo di joda .
Voglio solo aggiungere più possibilità per sottrarre giorni da a java.util.Date
.
Una possibilità è usare apache-commons-lang . Puoi farlo usando DateUtils
come segue:
Date dateBefore30Days = DateUtils.addDays(new Date(),-30);
Naturalmente aggiungi la commons-lang
dipendenza per fare solo la sottrazione della data, probabilmente non è una buona opzione, tuttavia se stai già usando commons-lang
è una buona scelta. Ci sono anche convenienti metodi per addYears
, addMonths
, addWeeks
e così via, date un'occhiata al api qui .
Un'altra possibilità è quella di sfruttare le novità LocalDate
di Java 8 usando il minusDays(long days)
metodo:
LocalDate dateBefore30Days = LocalDate.now(ZoneId.of("Europe/Paris")).minusDays(30);
LocalDateTime
come tale classe intenzionalmente non ha alcun concetto di fuso orario né offset da UTC. Usalo solo quando la zona / offset è sconosciuta o non pertinente. Invece usa LocalDate
e passa a ZoneId
quando chiami il suo now
metodo. Vedi la risposta corretta di Jacob van Lingen.
Basta usare questo per ottenere la data prima di 300 giorni, sostituire 300 con i giorni:
Date date = new Date(); // Or where ever you get it from
Date daysAgo = new DateTime(date).minusDays(300).toDate();
Qui,
DateTime
è org.joda.time.DateTime;
Date
è java.util.Date
API Java 8 Time:
Instant now = Instant.now(); //current date
Instant before = now.minus(Duration.ofDays(300));
Date dateBefore = Date.from(before);
java.time
potrebbe aiutare. Inoltre, ci si aspetta una discussione / spiegazione su Stack Overflow piuttosto che su un semplice frammento di codice. Dovresti assolutamente spiegare Duration
perché questo è il valore aggiunto della tua risposta rispetto a quella esistente di van Lingen .
Come puoi vedere QUI c'è molta manipolazione 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
*/
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
ora sono legacy , soppiantate dalle classi java.time integrate in Java 8 e versioni successive. Vedi Tutorial di Oracle .
Con Java 8 è davvero semplice ora:
LocalDate date = LocalDate.now().minusDays(300);
Una grande guida alla nuova API può essere trovata qui .
now
metodo. Se omesso, l'attuale fuso orario predefinito della JVM viene applicato in modo implicito e silenzioso. Tale impostazione predefinita è al di fuori del tuo controllo e può cambiare in qualsiasi momento, anche durante il runtime. Esempio: LocalDate.now( ZoneId.of( "America/Montreal" )
.
Ho creato una funzione per semplificare l'attività.
Per 7 giorni dopo la data dateCalculate(dateString,"yyyy-MM-dd",7);
Per ottenere 7 giorni aggiornati String: 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());
}
java.util.Date
, java.util.Calendar
e java.text.SimpleDateFormat
che ora sono l'eredità , soppiantato dai java.time classi. Vedi Tutorial di Oracle .
LocalDate.parse( "2017-01-23").plusWeeks( 1 )
è più semplice che scrivere il tuo metodo ed è più auto-documentante.
Puoi sottrarre facilmente 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;
}
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()));