Compare duas datas em Java

Eu preciso comparar duas datas em java. Eu estou usando o código como este:

Date questionDate = question.getStartDate(); Date today = new Date(); if(today.equals(questionDate)){ System.out.println("Both are equals"); } 

Isto não está a funcionar. O conteúdo das variables ​​é o seguinte:

  • questionDate contém 2010-06-30 00:31:40.0
  • today contém Wed Jun 30 01:41:25 IST 2010

Como posso resolver isto?

A igualdade de datas depende das duas datas serem iguais ao milissegundo. Criar um novo object Date usando new Date() nunca será igual a uma data criada no passado. As APIs da Joda Time simplificam o trabalho com datas; no entanto, usando apenas o SDK do Java:

 if (removeTime(questionDate).equals(removeTime(today)) ... public Date removeTime(Date date) { Calendar cal = Calendar.getInstance(); cal.setTime(date); cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); return cal.getTime(); } 

Eu usaria o JodaTime para isso. Aqui está um exemplo – digamos que você queira encontrar a diferença em dias entre duas datas.

 DateTime startDate = new DateTime(some_date); DateTime endDate = new DateTime(); //current date Days diff = Days.daysBetween(startDate, endDate); System.out.println(diff.getDays()); 

JodaTime pode ser baixado aqui .

Não está claro para mim o que você quer, mas vou mencionar que a class Date também tem um método compareTo , que pode ser usado para determinar com uma chamada se dois objects Date forem iguais ou (se não forem iguais) que ocorre mais cedo. Isso permite que você faça algo como:

 switch (today.compareTo(questionDate)) { case -1: System.out.println("today is sooner than questionDate"); break; case 0: System.out.println("today and questionDate are equal"); break; case 1: System.out.println("today is later than questionDate"); break; default: System.out.println("Invalid results from date comparison"); break; } 

Deve-se notar que os documentos da API não garantem que os resultados sejam -1, 0 e 1, portanto você pode querer usar ifs-elses em vez de um switch em qualquer código de produção. Além disso, se a segunda data for nula, você obterá um NullPointerException, portanto, envolver seu código em um try-catch poderá ser útil.

A maneira mais fácil de comparar duas datas é convertê-las em valor numérico (como timestamp unix).

Você pode usar o método Date.getTime() que retorna a hora do unix.

 Date questionDate = question.getStartDate(); Date today = new Date(); if((today.getTime() == questionDate.getTime())) { System.out.println("Both are equals"); } 

é time.compareTo(currentTime) < 0 usando time.compareTo(currentTime) < 0

 import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class MyTimerTask { static Timer singleTask = new Timer(); @SuppressWarnings("deprecation") public static void main(String args[]) { // set download schedule time Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 9); calendar.set(Calendar.MINUTE, 54); calendar.set(Calendar.SECOND, 0); Date time = (Date) calendar.getTime(); // get current time Date currentTime = new Date(); // if current time> time schedule set for next day if (time.compareTo(currentTime) < 0) { time.setDate(time.getDate() + 1); } else { // do nothing } singleTask.schedule(new TimerTask() { @Override public void run() { System.out.println("timer task is runing"); } }, time); } } 

java.time

No Java 8, não há necessidade de usar o Joda-Time, pois ele vem com uma nova API semelhante no pacote java.time . Use a class LocalDate .

 LocalDate date = LocalDate.of(2014, 3, 18); LocalDate today = LocalDate.now(); Boolean isToday = date.isEqual( today ); 

Você pode pedir o intervalo de tempo entre as datas com a class Period .

 Period difference = Period.between(date, today); 

LocalDate é comparável usando equals e compareTo pois não contém informações sobre Time e Timezone.


Sobre o java.time

O framework java.time está embutido no Java 8 e posterior. Essas classs substituem as antigas classs herdadas de data e hora legadas , como java.util.Date , Calendar e SimpleDateFormat .

O projeto Joda-Time , agora em modo de manutenção , aconselha a migration para as classs java.time .

Para saber mais, veja o Oracle Tutorial . E pesquise o Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .

Onde obter as classs java.time?

  • Java SE 8 , Java SE 9 e posterior
    • Construídas em.
    • Parte da API Java padrão com uma implementação integrada.
    • O Java 9 adiciona alguns resources e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade java.time é transferida para o Java 6 e 7 no ThreeTen-Backport .
  • Android
    • Versões posteriores das implementações do pacote Android das classs java.time.
    • Para o Android anterior, o projeto ThreeTenABP adapta o ThreeTen-Backport (mencionado acima). Veja Como usar o ThreeTenABP… .

O projeto ThreeTen-Extra estende java.time com classs adicionais. Este projeto é um campo de testes para possíveis futuras adições ao java.time. Você pode encontrar algumas classs úteis aqui como Interval , YearWeek , YearQuarter e muito mais .

O seguinte retornará verdadeiro se duas variables ​​do Calendário tiverem o mesmo dia do ano.

  public boolean isSameDay(Calendar c1, Calendar c2){ final int DAY=1000*60*60*24; return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY)); } // end isSameDay 

Aqui está uma outra resposta: você precisa formatar as datas de reboque para ajustar-se ao mesmo modelo para poder compará-las como string.

  Date questionDate = question.getStartDate(); Date today = new Date(); SimpleDateFormat dateFormatter = new SimpleDateFormat ("yyyy/MM/dd"); String questionDateStr = dateFormatter.format(questionDate); String todayStr = dateFormatter.format(today); if(questionDateStr.equals(todayStr)) { System.out.println("Both are equals"); } 
 public static double periodOfTimeInMillis(Date date1, Date date2) { return (date2.getTime() - date1.getTime()); } public static double periodOfTimeInSec(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / 1000; } public static double periodOfTimeInMin(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / (60 * 1000); } public static double periodOfTimeInHours(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / (60 * 60 * 1000); } public static double periodOfTimeInDays(Date date1, Date date2) { return (date2.getTime() - date1.getTime()) / (24 * 60 * 60 * 1000L); } 
 public long compareDates(Date exp, Date today){ long b = (exp.getTime()-86400000)/86400000; long c = (today.getTime()-86400000)/86400000; return bc; } 

Isso funciona para GregorianDates. 86400000 é a quantidade de milissegundos em um dia, isso retornará o número de dias entre as duas datas.

Este é um post muito antigo embora compartilhando meu trabalho. Aqui está um pequeno truque para fazer isso

 DateTime dtStart = new DateTime(Dateforcomparision); DateTime dtNow = new DateTime(); //current date if(dtStart.getMillis() <= dtNow.getMillis()) { //to do } 

Use comparador como por sua exigência

no meu caso, eu só tinha que fazer algo assim:

 date1.toString().equals(date2.toString()) 

E funcionou!

Isso funciona melhor ….

 Calendar cal1 = Calendar.getInstance(); Calendar cal2 = Calendar.getInstance(); cal1.setTime(date1); cal2.setTime(date2); boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) && cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR); 

Veja o que você pode fazer por comparação yyyy-mm-dd:

 GregorianCalendar gc= new GregorianCalendar(); gc.setTimeInMillis(System.currentTimeMillis()); gc.roll(GregorianCalendar.DAY_OF_MONTH, true); Date d1 = new Date(); Date d2 = gc.getTime(); SimpleDateFormat sf= new SimpleDateFormat("yyyy-MM-dd"); if(sf.format(d2).hashCode() < sf.format(d1).hashCode()) { System.out.println("date 2 is less than date 1"); } else { System.out.println("date 2 is equal or greater than date 1"); }