Evitare java.util.Date & .Calendar
Il accepted answer è tecnicamente corretta ma non ottimali. Le classi java.util.Date e .Calendar sono notoriamente problematiche. Evitalo. Utilizzare Joda-Time o il nuovo java.time package (in Java 8).
Time Zone
fuso orario è fondamentale nel lavoro di data-ora. Se ignori il problema, verrà applicato il fuso orario predefinito della JVM. Una pratica migliore è specificare sempre piuttosto che fare affidamento sul valore predefinito. Anche quando si desidera l'impostazione predefinita, chiamare esplicitamente getDefault
.
L'inizio della giornata è definito dal fuso orario. Un nuovo giorno sorge prima a Berlino che a Montréal. Quindi la definizione di "oggi" e "ieri" richiede un fuso orario.
Joda Time
codice di esempio nella Joda-Time 2.3.
DateTimeZone timeZone = DateTimeZone.forID("Europe/Berlin");
DateTime today = DateTime.now(timeZone);
Un modo per determinare ieri è la conversione in oggetti LocalDate. Un altro modo, mostrato qui, è rappresentare "ieri" come un arco di tempo. Definiamo tale intervallo dal primo momento di ieri fino a ma non incluso il primo momento di oggi. Questo approccio è chiamato "semiaperto" dove l'inizio è compreso e il finale è esclusivo.
Sottrarre un giorno per arrivare a ieri (o al giorno prima).
DateTime yesterdayStartOfDay = today.minusDays(1).withTimeAtStartOfDay();
Interval yesterdayInterval = new Interval(yesterdayStartOfDay, today.withTimeAtStartOfDay());
Converti l'oggetto java.util.Date di destinazione in un oggetto DateTime di Joda-Time. Applica un fuso orario a quel nuovo oggetto, invece di fare affidamento sull'applicazione del fuso orario predefinito di JVM. Tecnicamente il fuso orario qui in questo caso è irrilevante, ma includere un fuso orario è una buona abitudine.
DateTime target = new DateTime(myJUDate, timeZone);
Verificare se il bersaglio finisce entro l'intervallo di ieri.
boolean isYesterday = yesterdayInterval.contains(target);
Ovviamente questo approccio con la portata semiaperta di tempo collabora con più di un semplice "ieri", come "questa settimana", "il mese scorso", e così via.
Aggiornamento: Il progetto Joda-Time è ora in modalità di manutenzione. Il team consiglia la migrazione alle classi java.time. Vedere la soluzione java.time in correct Answer by Przemek.
Perché funziona per il 1 ° gennaio? L'anno non sarà diverso per il 31 dicembre? – ebi
Funziona perché Calendar.add modifica il timestamp della data in base a un offset calcolato dal tipo di campo e dalla quantità immessa.Quindi, indipendentemente dalla data originale, utilizza solo il timestamp (millisecondi dal 1 ° gennaio 1970) e calcola la nuova data in base a quel più/meno la differenza calcolata per l'input. Questo in effetti cambierà anche l'anno, anche se il campo è DAY_OF_YEAR. –
chiunque veda questo thread dovrebbe fare riferimento alla risposta di @ Przemek, che usa 'java.time', che dovrebbe essere usato preferibilmente a joda-time,' java.util.Date' e 'java.util.Calendar': http: //stackoverflow.com/a/33893147/1322243 – liltitus27