Подтвердить что ты не робот

Сравнение даты с использованием Java

У меня две даты:

  • toDate (ввод пользователя в формате MM/dd/yyyy)
  • currentDate (полученный new Date())

Мне нужно сравнить currentDate с toDate. Я должен отображать отчет только тогда, когда toDate равен или больше, чем currentDate. Как я могу это сделать?

4b9b3361

Ответ 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(). вы также можете использовать их.