2010-05-11 12 views
28

Ho due date: (input dell'utente in formato MM/dd/yyyy)Data Confronto utilizzando Java

  1. toDate
  2. currentDate (ottenuto dalla new Date())

ho bisogno di confrontare il currentDate con toDate. Devo visualizzare un rapporto solo quando lo toDate è uguale o superiore a currentDate. Come lo posso fare?

+0

La tua domanda iniziale è stata onestamente detta terribile. L'ho migliorato In futuro cerca di essere il più chiaro possibile. Non ripetere le cose 3 volte e/o cose inutilmente in grassetto :) – BalusC

+3

questo potrebbe aiutare se si considera l'uso della libreria joda http://stackoverflow.com/questions/1439779/how-to-compare-two-dates-without- the time-portion – ukanth

+0

JodaTime offre molto più dell'API Date di Java ... http://joda-time.sourceforge.net/. Ciò renderebbe molto più semplice questo e gli altri compiti con le date. – harschware

risposta

6

Date#equals() e Date#after()

Se c'è una possibilità che i campi hour e minute sono! = 0, si avrebbe dovuto metterli a 0.

non posso dimenticare di menzionare che l'utilizzo java.util.Date è considerato una cattiva pratica e la maggior parte dei suoi metodi sono deprecati. Utilizzare java.util.Calendar o JodaTime, se possibile.

+0

Dato che Date.equals() sarà confrontato in millisecondi e sta confrontando la data corrente con MM/gg/aaaa input dell'utente, non si tratta di un approccio produttivo. – BlairHippo

+0

Vuole confrontare non controllare l'uguaglianza. – tkr

+0

sì, grazie, ho aggiunto il metodo 'after' – Bozho

0

Utilizzare java.util.Calendar se si dispone di un'elaborazione relativa alla data estesa.

Data ha before(), after() metodi. potresti usarli anche tu.

5

Probabilmente si sta cercando:

!toDate.before(currentDate) 

prima() e dopo() verificare se la data è rigorosamente prima o dopo. Quindi devi prendere la negazione dell'altro per ottenere un comportamento non rigoroso.

+0

Per favore correggimi se ho torto, ma non fallirà se l'utente inserisce la data odierna? "new Date()" imposterà il tempo a quando viene chiamato, e un oggetto Date basato su gg/gg/aaaa sarà effettivamente 0:00 quella mattina. O sono Date.before() e Data.after() non basato su millisecondi come è Date.equals()? – BlairHippo

+0

Esatto. In realtà devi usare Calendar o un DateFormatter per sbarazzarti del tempo in java.util.Date. – tkr

17

È più facile confrontare le date utilizzando lo java.util.Calendar. Ecco cosa si potrebbe fare:

Calendar toDate = Calendar.getInstance(); 
Calendar nowDate = Calendar.getInstance(); 
toDate.set(<set-year>,<set-month>,<set-day>); 
if(!toDate.before(nowDate)) { 
    //display your report 
} else { 
    // don't display the report 
} 
+0

Domanda: è necessario cancellare esplicitamente l'ora/minuto/ecc. campi fuori da nowDate, o il fatto che non siano impostati su toDate significa che non hanno importanza? – BlairHippo

+1

+1 per l'utilizzo del calendario. Se non stai eseguendo il confronto in prossimità del livello di millisecondo, di solito vuoi cancellare() il calendario immediatamente dopo averlo creato, quindi chiamare il metodo set. – Ophidian

+0

@Ophidian Grazie per il chiaro() consiglio –

11

Se si sta insieme sull'utilizzo di Java Date piuttosto che, diciamo, JodaTime, utilizzare un java.text.DateFormat per convertire la stringa in una data, quindi confrontare i due utilizzando .equals:

Ho quasi dimenticato: è necessario azzerare le ore, i minuti, i secondi e i millisecondi della data corrente prima di confrontarli. Ho usato un oggetto Calendar qui sotto per farlo.

import java.text.DateFormat; 
import java.util.Calendar; 
import java.util.Date; 

// Other code here 
    String toDate; 
    //toDate = "05/11/2010"; 

    // Value assigned to toDate somewhere in here 

    DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT); 
    Calendar currDtCal = Calendar.getInstance(); 

    // Zero out the hour, minute, second, and millisecond 
    currDtCal.set(Calendar.HOUR_OF_DAY, 0); 
    currDtCal.set(Calendar.MINUTE, 0); 
    currDtCal.set(Calendar.SECOND, 0); 
    currDtCal.set(Calendar.MILLISECOND, 0); 

    Date currDt = currDtCal.getTime(); 

    Date toDt; 
    try { 
     toDt = df.parse(toDate); 
    } catch (ParseException e) { 
     toDt = null; 
     // Print some error message back to the user 
    } 

    if (currDt.equals(toDt)) { 
     // They're the same date 
    } 
+0

Risolti alcuni bug in questo ... dimenticato di catturare il 'ParseException' nella versione originale. – Powerlord

4

Questo è uno dei modi:

String toDate = "05/11/2010"; 

if (new SimpleDateFormat("MM/dd/yyyy").parse(toDate).getTime()/(1000 * 60 * 60 * 24) >= System.currentTimeMillis()/(1000 * 60 * 60 * 24)) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 

Un po 'più facile interpretabile:

String toDateAsString = "05/11/2010"; 
Date toDate = new SimpleDateFormat("MM/dd/yyyy").parse(toDateAsString); 
long toDateAsTimestamp = toDate.getTime(); 
long currentTimestamp = System.currentTimeMillis(); 
long getRidOfTime = 1000 * 60 * 60 * 24; 
long toDateAsTimestampWithoutTime = toDateAsTimestamp/getRidOfTime; 
long currentTimestampWithoutTime = currentTimestamp/getRidOfTime; 

if (toDateAsTimestampWithoutTime >= currentTimestampWithoutTime) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 

Oh, come bonus, la variante 's il JodaTime:

String toDateAsString = "05/11/2010"; 
DateTime toDate = DateTimeFormat.forPattern("MM/dd/yyyy").parseDateTime(toDateAsString); 
DateTime now = new DateTime(); 

if (!toDate.toLocalDate().isBefore(now.toLocalDate())) { 
    System.out.println("Display report."); 
} else { 
    System.out.println("Don't display report."); 
} 
+0

Il primo esempio ha funzionato perfettamente per le mie esigenze :) – atwright147

1

Se per qualche motivo sei intenti a utilizzare Date oggetti per la soluzione, è necessario fare qualcosa di simile:


    // Convert user input into year, month, and day integers 
    Date toDate = new Date(year - 1900, month - 1, day + 1); 
    Date currentDate = new Date(); 
    boolean runThatReport = toDate.after(currentDate); 

Spostando l'toDate avanti per la mezzanotte del giorno successivo si prenderà cura del bug che ho lamentai su nei commenti ad altre risposte. Tuttavia, si noti che questo approccio utilizza un costruttore deprecato; qualsiasi approccio basato su Date userà un metodo deprecato o un altro, e in base a come lo si può portare anche alle condizioni di gara (se si basa toDate su new Date() e poi si gingilla intorno all'anno, mese e giorno, ad esempio). Utilizzare Calendar, come descritto altrove.

3

Data long getTime() restituisce il numero di millisecondi dal January 1, 1970, 00:00:00 GMT rappresentato da questo oggetto Date.

//test if date1 is before date2 
if(date1.getTime() < date2.getTime()) { 
.... 
} 
2

checkDateLimit privato booleano() {

long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1 
    long Date1InMilisecond = Date1.getTimeInMillis(); //Date2 

    if (CurrentDateInMilisecond <= Date1InMilisecond) { 
     return true; 
    } else { 
     return false; 
    } 

} 

// convertire sia data in valore milisecond.