2012-12-07 6 views
25

Desidero confrontare due date, tuttavia mi trovo nei guai. 1 data viene creata da un oggetto java.util.date e l'altra viene creata manualmente. Il codice seguente è un esempio:Confronto tra due date utilizzando l'ora di Joda

Date ds = new Date(); 
DateTime d = new DateTime(ds); 

DateTime e = new DateTime(2012,12,07, 0, 0); 
System.out.println(d.isEqual(e)); 

Tuttavia il test risulta false. Immagino che sia per via del tempo. Come posso verificare se queste due date sono uguali tra loro (intendo l'anno, il mese, la data sono identici)?

+0

Cordiali saluti, il [Joda-Time] (http://www.joda.org/joda-time/) il progetto è ora in [modalità manutenzione] (https://en.wikipedia.org/wiki/Maintenance_mode), con il team che consiglia la migrazione al [java.time] (http : //docs.oracle.com/javase/9/docs/api/java/time/package-summary.html) classi. Vedi [Tutorial di Oracle] (https://docs.oracle.com/javase/tutorial/datetime/TOC.html). –

risposta

44
System.out.println(d.toDateMidnight().isEqual(e.toDateMidnight())); 

o

System.out.println(d.withTimeAtStartOfDay().isEqual(e.withTimeAtStartOfDay())); 
+5

toDateMidnight() è deprecato e non dovrebbe essere utilizzato.Invece, withTimeAtStartOfDay() può essere usato, ma non è ancora ottimale perché non rimuove il fuso orario, quindi se le due date hanno fusi orari diversi, non saranno mai uguali. – Stan

+3

Uso 'toLocalDate()', che presumo abbia lo stesso problema. Per evitare ciò, suppongo che si possa concatenare 'withZone()', ad esempio 'd.toLocalDate(). IsEqual (e.withZone (d.zone) .toLocalDate())'. Si noti che questo non è testato. –

+1

Questo non funzionerà se d ed e sono diversi fusi orari. La risposta di Charles Wood sopra è più affidabile –

1

Poiché si tratta di oggetti DateTime, le loro parti temporali vengono prese in considerazione anche durante il confronto. Provare a impostare le parti di tempo del primo appuntamento a 0, come:

d = d.withTime(0, 0, 0, 0); 
-5

Scrivi la tua metodo

public boolean checkEqual(DateTime first,DateTime second){ 
    if(first.<getterforyear> == second.<getterforyear> && first.<getterformonth> == second.<getterformonth> && first.<getterforday> == second.<getterforday>){ 
     return true; 
    } 
return false; 
} 
+0

I tipi sono gli stessi, leggi attentamente la domanda. Entrambi sono DateTime. –

+2

Questo è completamente inutile in quanto Joda Time ha un numero di metodi di utilità che fanno esattamente questo genere di cose. –

3

Se si desidera ignorare i componenti di tempo (cioè vuoi confrontare solo le date) puoi usare la classe DateMidnight invece di Date Time. Così il vostro esempio sarà simile a questo:

Date ds = new Date(); 
DateMidnight d = new DateMidnight(ds); 

DateMidnight e = new DateMidnight(2012, 12, 7); 
System.out.println(d.isEqual(e)); 

Ma attenzione, verrà stampata "vero" solo oggi :)

Si noti inoltre che per default JDK Data e tutte le classi di instant Joda-Time (DateTime e DateMidnight incluso) sono costruiti utilizzando il fuso orario predefinito. Pertanto, se crei una data per confrontare il codice, ma ne recuperi un'altra dal DB che probabilmente memorizza le date in UTC, potresti riscontrare incongruenze presumendo che non ci si trovi nel fuso orario UTC.

+0

DateMidnight in package time suggerisce di utilizzare localDate –

+0

Tutte le classi e metodi e metodi relativi alla mezzanotte sono deprecati, soppiantati dal concetto e dai metodi del "primo momento della giornata". –

15

Si dovrebbe usare toLocalDate():

date1.toLocalDate().isEqual(date2.toLocalDate()) 

Questo permetterà di eliminare la parte di tempo del DateTime.

C'è un altro approccio, ma non tiene conto per il caso in cui le due date hanno un fuso orario differente, quindi è meno affidabile:

date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()) 
0

Si tratta di un metodo statico che funziona per me.

public static boolean isSameDay(DateTime date1, DateTime date2){ 
    return date1.withTimeAtStartOfDay().isEqual(date2.withTimeAtStartOfDay()); 
} 
+0

Non vedo il vantaggio della [risposta esistente] (https://stackoverflow.com/a/21553438/642706) usando 'toLocalDate'. Tranne che questo fallisce se gli oggetti 'DateTime' hanno fusi orari diversi, mentre l'altro approccio di Answer non lo farebbe. Se questo è buono o cattivo dipende dal problema aziendale. –

-1
DateTimeComparator.getDateOnlyInstance().compare(obj1, obj2); 

obj1 e obj2 può essere una stringa, Lungo, Data (java.util) ... Per i dettagli vedi http://www.joda.org/joda-time/apidocs/index.html?org/joda/time/DateTimeComparator.html

+1

Benvenuto in Stack Overflow! Prima di rispondere a una domanda, leggi sempre le risposte esistenti. Questa risposta è già stata fornita. Invece di ripetere la risposta, vota la risposta esistente. Alcune linee guida per scrivere buone risposte possono essere trovate [qui] (https://stackoverflow.com/help/how-to-answer). – dferenc