2010-05-11 21 views
28

que tiene dos fechas: (entrada del usuario en MM/dd/yyyy formato)Comparación de fechas utilizando Java

  1. toDate
  2. currentDate (obtenido por new Date())

necesito para comparar la currentDate con toDate. Tengo que mostrar un informe solo cuando el toDate es igual o superior a currentDate. ¿Cómo puedo hacer eso?

+0

Su pregunta inicial fue honestamente dicha terrible. Lo he mejorado En el futuro trata de ser lo más claro posible. No repita las cosas 3 veces y/o innecesariamente audaz cosas :) – BalusC

+3

esto podría ayudar si considera usar la biblioteca joda http://stackoverflow.com/questions/1439779/how-to-compare-two-dates-without- la porción de tiempo – ukanth

+0

JodaTime ofrece mucho más que la API de fecha de Java ... http://joda-time.sourceforge.net/. Haría que esta y otras tareas de tu cita fueran mucho más fáciles. – harschware

Respuesta

6

Date#equals() y Date#after()

Si hay una posibilidad de que los hour y minute campos son! = 0, que tendría que dejarlos a 0.

No puedo dejar de mencionar que el uso de java.util.Date se considera una mala práctica, y la mayoría de sus métodos están en desuso. Use java.util.Calendar o JodaTime, si es posible.

+0

Dado que Date.equals() comparará milisegundos y está comparando la fecha actual con la entrada de usuario MM/dd/aaaa, eso no es realmente un enfoque productivo. – BlairHippo

+0

Él quiere comparar, no verifica la igualdad. – tkr

+0

sí, gracias, agregué el método 'after' – Bozho

0

Use java.util.Calendar si tiene un procesamiento extenso relacionado con la fecha.

Fecha tiene before(), after() métodos. podrías usarlos también.

5

Usted probablemente está buscando:

!toDate.before(currentDate) 

antes() y después de la prueba() si la fecha es estrictamente antes o después. Entonces debes tomar la negación del otro para obtener un comportamiento no estricto.

+0

Corrígeme si me equivoco, pero ¿esto no fallará si el usuario ingresa la fecha de hoy? "new Date()" establecerá la hora a cada vez que se llame, y un objeto Date basado en MM/dd/aaaa será efectivamente 0:00 esa mañana. O son Date.before() y Date.after() no basado en milisegundos de la forma en que Date.equals() es? – BlairHippo

+0

Eso es correcto. En realidad, debes usar Calendar o DateFormatter para deshacerte del tiempo en java.util.Date. – tkr

17

Es más fácil comparar fechas usando el java.util.Calendar. Esto es lo que podría hacer:

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

Pregunta: ¿debería borrar explícitamente la hora/minuto/etc. campos de nowDate, o el hecho de que no estén configurados en Date significa que no importan? – BlairHippo

+1

+1 para usar el calendario. Si no está comparando por debajo del nivel de milisegundos, generalmente desea borrar() el calendario inmediatamente después de crearlo, luego llamar al método de configuración. – Ophidian

+0

@Ophidian Gracias por el consejo claro() –

11

Si se fijan en el uso de Java fechas en lugar de, digamos, JodaTime, utilice un java.text.DateFormat para convertir la cadena a una fecha y después comparar los dos utilizando .equals:

Casi lo olvido: debe poner a cero las horas, los minutos, los segundos y los milisegundos en la fecha actual antes de compararlos. Usé un objeto Calendar a continuación para hacerlo.

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

Se corrigieron algunos errores en esto ... se olvidó de atrapar el 'ParseException' en la versión original. – Powerlord

4

Ésta es una de las maneras:

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 poco más fácil de interpretar:

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, como un bono, variante de la JodaTime 's:

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

El primer ejemplo funcionó perfectamente para mis necesidades :) – atwright147

1

Si por alguna razón eres la intención de utilizar Date objetos para su solución, tendrá que hacer algo como esto:


    // 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); 

Desplazamiento de la toDate antes de la medianoche del día siguiente se hará cargo del error que he quejé en los comentarios a otras respuestas. Pero, tenga en cuenta que este enfoque utiliza un constructor obsoleto; cualquier enfoque que se base en Date usará uno u otro método obsoleto, y dependiendo de cómo lo haga puede conducir también a condiciones de carrera (si basa toDate fuera de new Date() y luego juguetea con el año, el mes y el día, por ejemplo) Use Calendar, como se describe en otra parte.

3

Fecha long getTime() devuelve el número de milisegundos desde January 1, 1970, 00:00:00 GMT representado por este objeto Date.

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

checkDateLimit private boolean() {

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

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

} 

// Convertir la fecha tanto en valor milisegundo.