web-dev-qa-db-fra.com

Date de comparaison en utilisant Java

J'ai deux dates:

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

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

31
minil

Il est plus facile de comparer les dates avec 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
}
18
Abdel Raoof

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

J'ai presque oublié: vous devez mettre à zéro les heures, les minutes, les secondes et les millisecondes de la date actuelle avant de les comparer. J'ai utilisé un Calendar object 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
    }
11
Powerlord

Date#equals() et Date#after()

S'il est possible que les champs hour et minute soient! = 0, vous devrez les définir sur 0.

Je ne peux pas oublier de mentionner que l'utilisation de Java.util.Date est considérée comme une mauvaise pratique et que la plupart de ses méthodes sont obsolètes. Utilisez Java.util.Calendar ou JodaTime , si possible.

6
Bozho

Vous recherchez probablement:

!toDate.before(currentDate)

before () et after () vérifient si la date est strictement antérieure ou postérieure. Donc, vous devez prendre la négation de l'autre pour obtenir un comportement non strict.

5
tkr

C'est l'un des moyens suivants:

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, la variante de JodaTime :

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.");
}
4
BalusC

Date long getTime() renvoie le nombre de millisecondes depuis January 1, 1970, 00:00:00 GMT représenté par cet objet Date.

//test if date1 is before date2
if(date1.getTime() < date2.getTime()) {
....
}
3
Mark Z

checkDateLimit booléen privé () {

    long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1
    long Date1InMilisecond = Date1.getTimeInMillis(); //Date2

    if (CurrentDateInMilisecond <= Date1InMilisecond) {
        return true;
    } else {
        return false;
    }

}

// Convertit les deux dates en millisecondes.

2
Viren Savaliya

Si, pour une raison quelconque, vous souhaitez utiliser des objets Date pour votre solution, vous devez procéder de la manière suivante:


    // Convert user input into year, month, and day integers
    Date toDate = new Date(year - 1900, month - 1, day + 1);
    Date currentDate = new Date();
    boolean runThatReport = toDate.after(currentDate);

En reportant la toDate avant minuit le lendemain, on s'attaquera au bogue sur lequel j'ai pleuré dans les commentaires, à d'autres réponses. Mais notez que cette approche utilise un constructeur déconseillé; toute approche reposant sur Date utilisera une méthode obsolète ou une autre, et en fonction de la façon dont vous le pratiquez, vous risquez également de rencontrer des problèmes de concurrence (si vous basez toDate sur new Date(), puis manipulez l'année, le mois et le jour, par exemple ). Utilisez Calendar, comme décrit ailleurs.

1
BlairHippo

Utilisez Java.util.Calendar si le traitement lié à la date est très long.

Date a before(), after() méthodes. vous pouvez aussi les utiliser.

0
Vaishak Suresh