2009-05-19 30 views

Respuesta

90

Si no se conoce el orden del mínimo/máximo valores

Date a, b; // assume these are set to something 
Date d;  // the date in question 

return a.compareTo(d) * d.compareTo(b) > 0; 

Si desea que el rango para ser incluido

return a.compareTo(d) * d.compareTo(b) >= 0; 
+18

Funciona, pero no se puede leer. Gracias de cualquier manera. –

+1

@BrunoDeFreitasBarros ¿A qué te refieres con "no legible"? –

+1

@ Peter Lawrey Bruno significa que es difícil entender el código sin comentarios. – Mirimas

36

así:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.compareTo(min) >= 0 && d.compareTo(max) <= 0; 

Usted puede utilizar en lugar de >>=< y en lugar de <= para excluir a los criterios de valoración de la sensación de "entre".

+0

Gracias por su respuesta inmediata. –

+1

Esto no siempre funciona. He tenido problemas al usar los objetos compareTo on Date. El 1 de enero de 2006 aparentemente fue después del 1 de abril de 2006 en uno de mis programas. – KitsuneYMG

+0

@KitsuneYMG: Intenté con el siguiente código y estoy trabajando como esperaba: 'Date date1 = new Date (2006, 1, 1); // Jan 1,2006 Date date2 = new Date (2006, 4, 1); // 1 de abril de 2006 System.out.println (date1.compareTo (date2)); // -1 System.out.println (date2.compareTo (date1)); // 1'. ¿Puedes compartir aquí qué es eso * que no funciona * para ti? – Gnanam

212

Esto podría ser un poco más legible:

Date min, max; // assume these are set to something 
Date d;   // the date in question 

return d.after(min) && d.before(max); 
+1

Un muy saludable 9 segundos más rápido, señor. –

+42

entre puede incluir los puntos finales, en cuyo caso podría usar return! D.antes de (min) &&! D.after (max); –

+1

@Tetsujin no Oni, lo siento, es una buena cosa. No tengo un gran producto en un par de semanas que sea ayudado y herido por SO. :) –

2

puede utilizar getTime() y comparar los valores de tiempo UTC devueltos.

EDITAR si está seguro de que no tendrá que lidiar con fechas anteriores a 1970, no está seguro de cómo se comportará en ese caso.

8

Otra opción

min.getTime() <= d.getTime() && d.getTime() <= max.getTime() 
2

Es posible que desee echar un vistazo a Joda Time que es una muy buena API para tratar con fecha/hora. Aunque realmente no lo necesita para la solución a su pregunta actual, seguramente le ahorrará dolor en el futuro.

+1

Sí, mi pensamiento inmediato fue sugerir el momento Joda, pero no puedo ver nada en la API para apoyar una prueba "dentro del rango". ¿Alguien mas? – dukedave

+1

No estoy sugiriendo a Joda para este problema en particular, ya que ya tiene numerosas soluciones. – willcodejavaforfood

+1

Pero crearía un intervalo en Joda Time para hacer esto – willcodejavaforfood

2
import java.util.Date; 

public class IsDateBetween { 

public static void main (String[] args) { 

      IsDateBetween idb=new IsDateBetween("12/05/2010"); // passing your Date 
} 
public IsDateBetween(String dd) { 

     long from=Date.parse("01/01/2000"); // From some date 

     long to=Date.parse("12/12/2010");  // To Some Date 

     long check=Date.parse(dd); 

     int x=0; 

     if((check-from)>0 && (to-check)>0) 
     { 
      x=1; 
     } 

System.out.println ("From Date is greater Than ToDate : "+x); 
} 

} 
+1

Este es un hermoso código, esta es quizás una de las mejores funciones que he visto. Me ayudó mucho. ¡Gracias! – Bassiuz

1

Aquí van:

public static void main(String[] args) throws ParseException { 

     SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 

     String oeStartDateStr = "04/01/"; 
     String oeEndDateStr = "11/14/"; 

     Calendar cal = Calendar.getInstance(); 
     Integer year = cal.get(Calendar.YEAR); 

     oeStartDateStr = oeStartDateStr.concat(year.toString()); 
     oeEndDateStr = oeEndDateStr.concat(year.toString()); 

     Date startDate = sdf.parse(oeStartDateStr); 
     Date endDate = sdf.parse(oeEndDateStr); 
     Date d = new Date(); 
     String currDt = sdf.format(d); 


     if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){ 
      System.out.println("Date is between 1st april to 14th nov..."); 
     } 
     else{ 
      System.out.println("Date is not between 1st april to 14th nov..."); 
     } 
    } 
10

Aquí hay un par de maneras de hacerlo usando el Joda-Time 2.3 biblioteca.

Una forma es utilizar los métodos simples isBefore y isAfter en instancias DateTime. Por cierto, DateTime en Joda-Time es similar en concepto a java.util.Date (un momento en el tiempo en la línea de tiempo del universo) pero incluye una zona horaria.

Otra forma es crear un intervalo en Joda-Time. El método contains prueba si un DateTime dado ocurre dentro del lapso de tiempo cubierto por el Intervalo. El comienzo del intervalo es inclusivo, pero el punto final es exclusivo. Este enfoque se conoce como "Medio abierto", simbólicamente [).

Vea ambas formas en el siguiente ejemplo de código.

Convierta las instancias de java.util.Date a instancias de Joda-Time DateTime. Simplemente pase la instancia de Date al constructor de DateTime. En la práctica, también debe pasar un objeto específico DateTimeZone en lugar de confiar en la zona horaria predeterminada de JVM.

DateTime dateTime1 = new DateTime(new java.util.Date()).minusWeeks(1); 
DateTime dateTime2 = new DateTime(new java.util.Date()); 
DateTime dateTime3 = new DateTime(new java.util.Date()).plusWeeks(1); 

Comparación de pruebas para antes/después ...

boolean is1After2 = dateTime1.isAfter(dateTime2); 
boolean is2Before3 = dateTime2.isBefore(dateTime3); 

boolean is2Between1And3 = ((dateTime2.isAfter(dateTime1)) && (dateTime2.isBefore(dateTime3))); 

Utilizando el enfoque de intervalo en lugar de isAfter/isBefore ...

Interval interval = new Interval(dateTime1, dateTime3); 
boolean intervalContainsDateTime2 = interval.contains(dateTime2); 

volcado a la consola ...

System.out.println("DateTimes: " + dateTime1 + " " + dateTime1 + " " + dateTime1); 
System.out.println("is1After2 " + is1After2); 
System.out.println("is2Before3 " + is2Before3); 
System.out.println("is2Between1And3 " + is2Between1And3); 
System.out.println("intervalContainsDateTime2 " + intervalContainsDateTime2); 

Cuando se ejecuta ...

DateTimes: 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 2014-01-22T20:26:14.955-08:00 
is1After2 false 
is2Before3 true 
is2Between1And3 true 
intervalContainsDateTime2 true 
2

Así es como para saber si hoy es entre 2 meses:

private boolean isTodayBetween(int from, int to) { 
    if (from < 0 || to < 0 || from > Calendar.DECEMBER || to > Calendar.DECEMBER) { 
     throw new IllegalArgumentException("Invalid month provided: from = " + from + " to = " + to); 
    } 
    Date now = new Date(); 
    GregorianCalendar cal = new GregorianCalendar(); 
    cal.setTime(now); 
    int thisMonth = cal.get(Calendar.MONTH); 
    if (from > to) { 
     to = to + Calendar.DECEMBER; 
     thisMonth = thisMonth + Calendar.DECEMBER; 
    } 
    if (thisMonth >= from && thisMonth <= to) { 
     return true; 
    } 
    return false; 
} 

y llamar así:

isTodayBetween(Calendar.OCTOBER, Calendar.MARCH) 
1

Entre fechas Incluyendo los criterios de valoración se puede escribir como

public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){ 
    return !(date.before(min) || date.after(max)); 
} 
Cuestiones relacionadas