J'ai deux dates:
toDate
(entrée utilisateur au format MM/dd/yyyy
)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?
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
}
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
}
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.
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.
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.");
}
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()) {
....
}
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.
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.
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.