Сравнение даты с помощью Java [дубликат]

Этот вопрос уже имеет ответ здесь:

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

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

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

31
задан Jason S 11 May 2010 в 14:11
поделиться

7 ответов

Дата # равно () и Дата # после ()

Если есть вероятность, что поля час и минута равны! = 0 , вам придется установить их в 0.

Я не могу забыть упомянуть, что использование java.util.Date считается плохой практикой, и большинство его методов устарели. По возможности используйте java.util.Calendar или JodaTime .

6
ответ дан 27 November 2019 в 22:24
поделиться

Проще сравнивать даты, используя 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
}
18
ответ дан 27 November 2019 в 22:24
поделиться

Если вы намерены использовать 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
    }
11
ответ дан 27 November 2019 в 22:24
поделиться

Вы, вероятно, ищете:

!toDate.before(currentDate)

before () и after () проверяют, является ли дата строго до или после. Таким образом, вы должны принять отрицание другого, чтобы добиться нестрогого поведения.

5
ответ дан 27 November 2019 в 22:24
поделиться

Это один из способов:

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.");
}
4
ответ дан 27 November 2019 в 22:24
поделиться

Если по какой-то причине вы намерены использовать в своем решении объекты 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 () , а затем поиграйте, например, с годом, месяцем и днем). Используйте Календарь , как описано в другом месте.

1
ответ дан 27 November 2019 в 22:24
поделиться

Используйте java.util.Calendar , если у вас есть обширная обработка, связанная с датой.

Date имеет методы before () , after () . вы тоже можете их использовать.

0
ответ дан 27 November 2019 в 22:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: