Сравнение даты с использованием Java
У меня две даты:
-
toDate
(ввод пользователя в формате MM/dd/yyyy
)
-
currentDate
(полученный new Date()
)
Мне нужно сравнить currentDate
с toDate
. Я должен отображать отчет только тогда, когда toDate
равен или больше, чем currentDate
. Как я могу это сделать?
Ответы
Ответ 1
Сравнивать даты проще, используя 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
}
Ответ 2
Если вы используете Java Dates, а не JodaTime, используйте java.text.DateFormat
, чтобы преобразовать строку в Date, затем сравните два с использованием .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
}
Ответ 3
Date#equals()
и Date#after()
Если есть вероятность, что поля hour
и minute
равны!= 0, вам нужно установить их в 0.
Я не могу забыть упомянуть, что использование java.util.Date
считается плохой практикой, и большинство его методов устарели. Используйте java.util.Calendar
или JodaTime, если это возможно.
Ответ 4
Возможно, вы ищете:
!toDate.before(currentDate)
before() и after() проверяют, является ли дата строго до или после. Поэтому вы должны принять отрицание другого, чтобы получить не строгое поведение.
Ответ 5
Это один из способов:
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.");
}
Ответ 6
Дата long getTime()
возвращает количество миллисекунд с January 1, 1970, 00:00:00 GMT
, представленное этим объектом Date.
//test if date1 is before date2
if(date1.getTime() < date2.getTime()) {
....
}
Ответ 7
private boolean checkDateLimit() {
long CurrentDateInMilisecond = System.currentTimeMillis(); // Date 1
long Date1InMilisecond = Date1.getTimeInMillis(); //Date2
if (CurrentDateInMilisecond <= Date1InMilisecond) {
return true;
} else {
return false;
}
}
//Преобразовать обе даты в миллисекунды.
Ответ 8
Если по какой-то причине вы намерены использовать объекты 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
off new Date()
, а затем заходите в год, месяц, и день, например). Используйте Calendar
, как описано в другом месте.
Ответ 9
Используйте java.util.Calendar
, если у вас обширная обработка, связанная с датой.
Дата имеет методы before()
, after()
. вы также можете использовать их.