Этот вопрос уже имеет ответ здесь:
У меня есть две даты:
toDate
(ввод данных пользователем в MM/dd/yyyy
формат)currentDate
(полученный new Date()
) Я должен выдержать сравнение currentDate
с toDate
. Я должен отобразить отчет только когда toDate
равно или больше, чем currentDate
. Как я могу сделать это?
Дата # равно ()
и Дата # после ()
Если есть вероятность, что поля час
и минута
равны! = 0 , вам придется установить их в 0.
Я не могу забыть упомянуть, что использование java.util.Date
считается плохой практикой, и большинство его методов устарели. По возможности используйте java.util.Calendar
или JodaTime .
Проще сравнивать даты, используя java.util.Calendar
.
Вот что вы можете сделать:
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
}
Если вы намерены использовать Java Dates, а не, скажем, JodaTime, используйте java.text.DateFormat
для преобразования строки в дату, а затем сравните их с помощью .equals:
Чуть не забыл: перед сравнением нужно обнулить часы, минуты, секунды и миллисекунды текущей даты. Для этого я использовал объект Calendar
ниже.
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
}
Вы, вероятно, ищете:
!toDate.before(currentDate)
before () и after () проверяют, является ли дата строго до или после. Таким образом, вы должны принять отрицание другого, чтобы добиться нестрогого поведения.
Это один из способов:
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.");
}
Немного проще интерпретировать:
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.");
}
О, в качестве бонуса 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
, вам необходимо сделать что-то вроде этого:
// 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);
Сдвиг toDate
на полночь. на следующий день займется ошибкой, о которой я жаловался в комментариях к другим ответам. Но обратите внимание, что этот подход использует устаревший конструктор; любой подход, основанный на Date
, будет использовать тот или иной устаревший метод, и в зависимости от того, как вы это делаете, также может привести к условиям гонки (если вы основываете toDate
на new Date ()
, а затем поиграйте, например, с годом, месяцем и днем). Используйте Календарь
, как описано в другом месте.
Используйте java.util.Calendar
, если у вас есть обширная обработка, связанная с датой.
Date имеет методы before ()
, after ()
. вы тоже можете их использовать.