2010-06-09 23 views
33

In questo momento sto usando questo codiceCome verificare se una data è uguale a ieri?

Calendar cal = Calendar.getInstance(); 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE) - 1, 12, 0, 0); //Sets Calendar to "yeserday, 12am" 
if(sdf.format(getDateFromLine(line)).equals(sdf.format(cal.getTime())))       //getDateFromLine() returns a Date Object that is always at 12pm 
{...CODE 

Ci deve essere un modo più agevole per verificare se la data restituita dalla getdateFromLine() è la data di ieri. Solo la data conta, non il tempo. Ecco perché ho usato SimpleDateFormat. Grazie per il vostro aiuto in anticipo!

risposta

66
Calendar c1 = Calendar.getInstance(); // today 
c1.add(Calendar.DAY_OF_YEAR, -1); // yesterday 

Calendar c2 = Calendar.getInstance(); 
c2.setTime(getDateFromLine(line)); // your date 

if (c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR) 
    && c1.get(Calendar.DAY_OF_YEAR) == c2.get(Calendar.DAY_OF_YEAR)) { 

Ciò funzionerà anche per date come 1 gennaio.

+3

Perché funziona per il 1 ° gennaio? L'anno non sarà diverso per il 31 dicembre? – ebi

+4

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. –

+1

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

2

Invece di impostare il calendario provare questo:

public static void main(String[] args) { 
    int DAY_IN_MILLIS = 1000 * 60 * 60 * 24; 
    Date date = new Date(); 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yy"); 
    String prevDate = dateFormat.format(date.getTime() - DAY_IN_MILLIS); 
    String currDate = dateFormat.format(date.getTime()); 
    String nextDate = dateFormat.format(date.getTime() + DAY_IN_MILLIS); 
    System.out.println("Previous date: " + prevDate); 
    System.out.println("Current date: " + currDate); 
    System.out.println("Next date: " + nextDate); 
    } 

Ciò dovrebbe consentire di spostare avanti e indietro lungo il calendario

Poi si può semplicemente confrontare la getDateFromLine (linea) al valore prevDate o qualunque cosa ti piaccia

1

Si consiglia di considerare l'utilizzo di Joda-Time. È decisamente migliore delle offerte JDK.

0

Qualcosa di simile o meno:

  Calendar c1 = Calendar.getInstance(); 
     Date d1 = new Date(/* control time */); 
     c1.setTime(d1); 

     //current date 
     Calendar c2 = Calendar.getInstance(); 

     int day1=c1.get(Calendar.DAY_OF_YEAR); 
     int day2=c2.get(Calendar.DAY_OF_YEAR); 

     //day2==day1+1 
+0

Dovrebbe anche confrontare i valori dell'anno. –

+0

oh sì mi sono dimenticato dell'anno. – Inv3r53

11

Sono d'accordo con Ash Kim che la libreria Joda-Time è la strada da percorrere se si desidera preservare la sanità mentale.

import org.joda.time.DateTime; 

public static boolean dayIsYesterday(DateTime day) { 
    DateTime yesterday = new DateTime().withTimeAtStartOfDay().minusDays(1); 
    DateTime inputDay = day.withTimeAtStartOfDay(); 

    return inputDay.isEqual(yesterday); 
} 

In questo esempio, se il DateTime day è da ieri allora dayIsYesterday(day) sarà tornare true.

+0

Le classi e i metodi relativi alla mezzanotte in Joda-Time erano basati su un'idea errata. Ora sono deprecati da Joda-Time 2.3. Usa invece il metodo ['withTimeAtStartOfDay'] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTime.html#withTimeAtStartOfDay()). –

+0

Inoltre, dovresti generalmente [specificare il fuso orario] (http://www.joda.org/joda-time/apidocs/org/joda/time/DateTimeZone.html) piuttosto che fare affidamento sull'impostazione predefinita di JVM poiché è fondamentale per determinare "oggi" e "ieri". –

+0

ora = "1/07/2016". precedente = "12/06/1980". Il tuo precedenteFromYesteray verrà impostato su true, mentre il topic starter chiede come puoi verificare se una data è "ieri". – Dogcat

7

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.

0

ho trovato un po 'confuso quando uso questo modo di testare questo metodo

Calendar now = new GregorianCalendar(2000, 1, 1); 
now.add(Calendar.DATE, -1); 

SimpleDateFormat format= new SimpleDateFormat("yyyy-MM-dd"); 
System.out.println(format.format(now.getTime())); 

il mio si aspettano è di stampare 1999-12-31, ma il reale è 2001/01/31 Immagino che Calendar.add() si occupi solo di giorno in mese.

Ma l'errore effettivo è il modo in cui creo l'oggetto Calendario. Nel calendario, il mese inizia con , il valore della variabile ora è 2001-2-1, ero così presuntuoso da non stamparlo. Quando ho trovato qualcosa era sbagliato. corretto modo per creare un calendario è:

Calendar now = new GregorianCalendar(2000, Calendar.JANUARY, 1); 

Il calendario è stato così strano per un ex programmatore C# :(

10

java.time

Utilizzando java.time framework integrato in Java 8

LocalDate now = LocalDate.now(); //2015-11-24 
LocalDate yesterday = LocalDate.now().minusDays(1); //2015-11-23 

yesterday.equals(now); //false 
yesterday.equals(yesterday); //true 

Oracle ufficiale LocalDatetutorial stati

Il metodo di uguale deve essere utilizzato per i confronti.

Se si lavora con oggetti come LocalDateTime, ZonedDateTime o OffsetDateTime, si può convertire in LocalDate.

LocalDateTime.now().toLocalDate(); # 2015-11-24 
+0

Suggerisco sempre di passare l'opzione ['ZoneId'] (http://docs.oracle.com/javase/8/docs/api/java/time/ZoneId.html) a [' LocalDate.now'] (http: //docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html#now-java.time.ZoneId-) anziché affidarsi implicitamente al fuso orario predefinito corrente della JVM. Questo valore predefinito può cambiare in qualsiasi momento anche durante il runtime. In questo modo: 'LocalDate.now (ZoneId.of (" America/Montreal "))' –