32 votes

Comparaison de dates avec Java

J'ai deux rendez-vous :

  1. toDate (entrée utilisateur dans MM/dd/yyyy format)
  2. currentDate (obtenu par new Date() )

J'ai besoin de comparer les currentDate avec toDate . Je dois afficher un rapport uniquement lorsque le toDate est égal ou supérieur à currentDate . Comment puis-je le faire ?

0 votes

Votre question initiale était honnêtement dite terrible. Je l'ai améliorée. À l'avenir, essayez d'être aussi clair que possible. Ne répétez pas les choses 3 fois et/ou ne mettez pas les choses en gras inutilement :)

3 votes

Cela pourrait vous aider si vous envisagez d'utiliser la bibliothèque Joda. stackoverflow.com/questions/1439779/

0 votes

JodaTime offre bien plus que l'API de date de Java... joda-time.sourceforge.net . Cela faciliterait grandement cette tâche et les autres tâches liées aux dates.

20voto

Abdel Olakara Points 11016

Il est plus facile de comparer des dates en utilisant le java.util.Calendar . Voici ce que vous pourriez faire :

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 votes

Question : faut-il effacer explicitement les champs heure/minute/etc. de nowDate, ou le fait qu'ils ne soient pas définis dans toDate signifie-t-il qu'ils n'ont pas d'importance ?

2 votes

+1 pour l'utilisation du calendrier. Si vous ne comparez pas au niveau de la milliseconde, vous voulez généralement effacer() le calendrier immédiatement après l'avoir créé, puis appeler la méthode set.

0 votes

@Ophidian Merci pour le conseil clear()

11voto

Powerlord Points 43989

Si vous souhaitez utiliser les dates Java plutôt que, par exemple, JodaTime, utilisez une balise java.text.DateFormat pour convertir la chaîne de caractères en date, puis comparez les deux en utilisant .equals :

J'allais oublier : vous devez remettre à zéro les heures, les minutes, les secondes et les millisecondes de la date actuelle avant de les comparer. J'ai utilisé un Calendar l'objet ci-dessous pour le faire.

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 votes

J'ai corrigé quelques bugs... j'ai oublié d'attraper la ParseException dans la version originale.

6voto

Bozho Points 273663

Date#equals() et Date#after()

S'il y a une possibilité que le hour et minute sont != 0, vous devez les mettre à 0.

Je ne peux pas oublier de mentionner qu'en utilisant java.util.Date est considéré comme une mauvaise pratique, et la plupart de ses méthodes sont dépréciées. Utilisez java.util.Calendar ou JodaTime si possible.

0 votes

Étant donné que Date.equals() compare les millisecondes et qu'il compare la date actuelle à la saisie utilisateur MM/dd/yyyy, ce n'est pas vraiment une approche productive.

0 votes

Il veut comparer et non vérifier l'égalité.

0 votes

Oui, merci, j'ai ajouté le after méthode

5voto

tkr Points 767

Vous êtes probablement à la recherche de :

!toDate.before(currentDate)

before() et after() testent si la date est strictement avant ou après. Vous devez donc prendre la négation de l'autre pour obtenir un comportement non strict.

0 votes

Corrigez-moi si je me trompe, mais cela ne risque-t-il pas d'échouer si l'utilisateur saisit la date du jour ? La fonction "new Date()" définira l'heure à la date à laquelle elle est appelée, et un objet Date basé sur MM/dd/yyyy sera effectivement à 0:00 ce matin-là. Ou bien Date.before() et Date.after() ne sont-elles pas basées sur les millisecondes comme l'est Date.equals() ?

0 votes

C'est vrai. En fait, vous devez utiliser Calendar ou un DateFormatter pour vous débarrasser du temps dans java.util.Date.

4voto

BalusC Points 498232

C'est l'une des façons de le faire :

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 peu plus facile à interpréter :

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, en bonus, le JodaTime La variante de l'entreprise :

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 votes

Le premier exemple a parfaitement répondu à mes besoins :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X