Como posso determinar se uma data é entre duas datas em Java?

votos
77

Como posso verificar se uma data é entre duas outras datas, no caso em que todas as três datas são representados por instâncias java.util.Date?

Publicado 19/05/2009 em 15:17
fonte usuário
Em outras línguas...                            


11 respostas

votos
216

Este pode ser um pouco mais legível:

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

return d.after(min) && d.before(max);
Respondeu 19/05/2009 em 15:22
fonte usuário

votos
93

Se você não sabe a ordem dos valores min / max

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

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

Se quiser que o intervalo para ser inclusivo

return a.compareTo(d) * d.compareTo(b) >= 0;
Respondeu 19/05/2009 em 20:28
fonte usuário

votos
37

Igual a:

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

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

Você pode usar >em vez de >=e <em vez de <=excluir os pontos finais do sentido de "entre".

Respondeu 19/05/2009 em 15:19
fonte usuário

votos
11

Aqui está um par de maneiras de fazer isso usando o Joda-Time 2.3 biblioteca.

Uma maneira é usar o simples isBeforee isAftermétodos de DateTime casos. By the way, DateTime em Joda-Time é similar em conceito a um java.util.Date (um momento no tempo na linha do tempo do universo), mas inclui um fuso horário.

Outra maneira é construir um intervalo no Joda-Time. Os containstestes de método, se um dado datetime ocorre dentro do espaço de tempo coberto pelo intervalo. O início do intervalo é inclusivo, mas o ponto final é exclusiva. Esta abordagem é conhecida como "Half-Open", simbolicamente [).

Veja os dois lados em seguinte exemplo de código.

Converter as instâncias java.util.Date para Joda-Time DateTimecasos. Simplesmente passar a instância Data de construtor de DateTime. Na prática, você também deve passar por um determinado DateTimeZoneobjeto em vez de confiar no fuso horário padrão do 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 );

Compare testando antes / depois ...

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

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

Usando a abordagem de intervalo em vez de isAfter / isBefore ...

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

Despejar para consolar ...

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

Quando executado ...

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
Respondeu 31/01/2014 em 08:27
fonte usuário

votos
8

Outra opção

min.getTime() <= d.getTime() && d.getTime() <= max.getTime()
Respondeu 19/05/2009 em 15:37
fonte usuário

votos
4

Entre as datas, incluindo os pontos finais podem ser escrito como

public static boolean isDateInBetweenIncludingEndPoints(final Date min, final Date max, final Date date){
    return !(date.before(min) || date.after(max));
}
Respondeu 09/02/2016 em 07:27
fonte usuário

votos
2

Veja como descobrir se hoje é 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;
}

e chamá-lo assim:

isTodayBetween(Calendar.OCTOBER, Calendar.MARCH)
Respondeu 14/04/2015 em 07:46
fonte usuário

votos
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);
}   

}
Respondeu 13/08/2010 em 02:40
fonte usuário

votos
2

Você pode querer dar uma olhada em Joda Tempo que é realmente uma boa API para lidar com data / hora. Mesmo que se você realmente não precisa dele para a solução para sua pergunta atual é obrigado a poupar dor no futuro.

Respondeu 19/05/2009 em 15:38
fonte usuário

votos
2

você pode usar getTime()e comparar os valores de longo UTC devolvidos.

EDIT se tiver certeza de que você não terá que lidar com datas antes de 1970, não sei como ele irá se comportar nesse caso.

Respondeu 19/05/2009 em 15:33
fonte usuário

votos
1

Aqui está:

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...");
        }
    }
Respondeu 29/01/2014 em 12:15
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more