web-dev-qa-db-fra.com

Comparez deux dates en Java

Je dois comparer deux dates en Java. J'utilise le code comme ceci:

Date questionDate = question.getStartDate();
Date today = new Date();

if(today.equals(questionDate)){
    System.out.println("Both are equals");
}

Ceci ne fonctionne pas. Le contenu des variables est le suivant:

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

Comment puis-je résoudre ça?

25
Gnaniyar Zubair

L'égalité des dates dépend du fait que les deux dates sont égales à la milliseconde. La création d'un nouvel objet Date à l'aide de new Date() ne sera jamais égale à une date créée dans le passé. Les API de Joda Time simplifient le travail avec les dates; Cependant, en utilisant uniquement le SDK de 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(); 
}
42
Eric Hauser

Je voudrais utiliser JodaTime pour cela. Voici un exemple - supposons que vous souhaitiez trouver la différence de jours entre 2 dates.

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

JodaTime peut être téléchargé à partir de ici .

13
CoolBeans

Ce que je veux, ce n’est pas clair, mais je dirai que la classe Date a également une méthode compareTo , qui peut être utilisée pour déterminer avec un appel si deux objets Date sont égaux ou (si ils ne sont pas égaux), ce qui se produit plus tôt. Cela vous permet de faire quelque chose comme:

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

Il est à noter que les documents de l'API ne garantissent pas que les résultats soient -1, 0 et 1, vous pouvez donc utiliser if-elses plutôt qu'un commutateur dans un code de production. De plus, si la deuxième date est null, vous obtiendrez une exception NullPointerException. Il peut donc être utile de placer votre code dans un try-catch.

10
GreenMatt

Le moyen le plus simple de comparer deux dates consiste à les convertir en valeurs numériques (comme un horodatage Unix).

Vous pouvez utiliserDate.getTime()qui retourne l’heure unix.

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

Java.time

En Java 8, il n’est pas nécessaire d’utiliser Joda-Time car il est livré avec une nouvelle API similaire dans le package Java.time . Utilisez la classe LocalDate .

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

Boolean isToday = date.isEqual( today );

Vous pouvez demander l'intervalle de temps entre les dates avec Period class.

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

LocalDate est comparable avec equals et compareTo car il ne contient aucune information sur l'heure et le fuseau horaire.


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode maintenance , conseille de migrer vers les classes Java.time .

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time? 

  • Java SE 8 , Java SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android
    • Les versions ultérieures d'Android regroupent des implémentations des classes Java.time.
    • Pour les versions antérieures d'Android, le projet ThreeTenABP s'adapte ThreeTen-Backport (mentionné ci-dessus). Voir Comment utiliser ThreeTenABP… .

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

3
recke96

c'est esy en utilisant 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);

    }

}
3
harsha.kuruwita

Ce qui suit retournera true si deux variables de calendrier ont le même jour de l'année.

  public boolean isSameDay(Calendar c1, Calendar c2){
    final int DAY=1000*60*60*24;
    return ((c1.getTimeInMillis()/DAY)==(c2.getTimeInMillis()/DAY));
  } // end isSameDay
1
user569712
public long compareDates(Date exp, Date today){

        long b = (exp.getTime()-86400000)/86400000;
        long c = (today.getTime()-86400000)/86400000;
        return b-c;
    }

Cela fonctionne pour GregorianDates. 86400000 sont la quantité de millisecondes dans une journée, cela retournera le nombre de jours entre les deux dates.

0
PT_C
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);
}
0
yurin

Cela fonctionne mieux ....

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

dans mon cas, je devais faire quelque chose comme ceci: 

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

Et ça a marché!

0
Rafa Ayadi

Voici une autre réponse: Vous devez formater les dates de remorquage de manière à ce qu'elles soient identiques à partir de pour pouvoir les comparer en tant que chaîne.

    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");
    }
0
Jamal

Ceci est un très vieux post qui partage mon travail. Voici un petit truc pour le faire 

DateTime dtStart = new DateTime(Dateforcomparision); 
DateTime dtNow = new DateTime(); //current date

if(dtStart.getMillis() <= dtNow.getMillis())
{
   //to do
}

utiliser le comparateur selon vos besoins 

0