Как сравнить две даты в Java, а затем сравнить результат с другой датой? - PullRequest
2 голосов
/ 18 июня 2020

Нуб здесь! Сначала я пытаюсь сравнить dateOne и dateTwo друг с другом, а затем, если у вас самая последняя дата (> 0), возьмите ее и сравните с cutOffDate.

Если он находится после cutOffDate, установите его как FinalDate, иначе установите cutOffDate как FinalDate. Как я могу этого добиться?

Я не уверен, что я на правильном пути, я получаю следующую ошибку с dateOne.compareTo(dateTwo):

Метод compareTo (String) в типе String неприменимо для аргументов (Дата)

public DateServiceImpl process(final DateServiceImpl item) throws Exception {

    final Date dateOne = item.getDateOne();
    final Date dateTwo = item.getDateTwo();

    final BigDecimal amountOne= item.getAmountOne();
    final BigDecimal amountTwo= item.getAmountTwo();

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    String cutOffDate = "01/01/2020";

    Date cDate = sdf.parse(cutOffDate);
    if ((amountOne.compareTo(BigDecimal.ZERO) > 0) && (amountTwo.compareTo(BigDecimal.ZERO) > 0)){
        if (dateOne.compareTo(dateTwo) <= 0) {
             item.setFinalDate(cDate);
        }
        return null;
    }
}

Ответы [ 2 ]

5 голосов
/ 18 июня 2020

LocalDate из java .time и Collections.max ()

Используйте java .time, современный Java API даты и времени, для работы с датами. Во-первых, java .time позволяет раз и навсегда объявить средство форматирования:

private static final DateTimeFormatter DATE_FORMATTER
        = DateTimeFormatter.ofPattern("MM/dd/yyyy");

Я понимаю, что конечная дата должна быть последней из dateOne, dateTwo и даты отсечения . Учитывая, что DateServiceImpl использует LocalDate вместо Date, logi c можно упростить:

    LocalDate dateOne = item.getDateOne();
    LocalDate dateTwo = item.getDateTwo();

    String cutOffDate = "01/01/2020";

    LocalDate cDate = LocalDate.parse(cutOffDate, DATE_FORMATTER);

    LocalDate finalDate = Collections.max(Arrays.asList(dateOne, dateTwo, cDate));

    item.setFinalDate(finalDate);

Я пропустил объявления final и сумму logi c, поскольку они не имели отношения к заданному вопросу; вы можете вернуть их в себя.

A LocalDate - это дата без времени суток. Я думал, что это то, что вам нужно, проверьте себя.

Изменить: как предлагает в комментарии Бэзил Бурк, при использовании Java 9 или более поздней версии вы, вероятно, предпочтете List.of() вместо Arrays.asList():

    LocalDate finalDate = Collections.max(List.of(dateOne, dateTwo, cDate));

Для ситуаций, когда этого недостаточно, LocalDate также имеет методы isBefore и isAfter для сравнения.

Collections.max () также работает с Date

Если вы не можете позволить себе обновить DateServiceImpl до java .time прямо сейчас, вы можете использовать Collections.max() на трех старомодных объектах Date таким же образом.

Collections.max() также поставляется в перегруженной версии, которая принимает Comparator в качестве второго аргумента. Поскольку и LocalDate, и Date реализуют Comparable, нам это здесь не нужно.

Ссылки

3 голосов
/ 18 июня 2020

Вы на правильном пути. Вам просто нужно еще одно сравнение, и все будет хорошо.

if (dateOne.compareTo(dateTwo) > 0) {
    if (dateOne.compareTo(cDate) > 0) {
        item.setFinalDate(dateOne);
    } else {
        item.setFinalDate(cDate);
    }
} else {
    if (dateTwo.compareTo(cDate) > 0) {
        item.setFinalDate(dateTwo);
    } else {
        item.setFinalDate(cDate);
    }
}

Вам нужно было проверить каждый случай, в каком порядке приходят даты (проверьте, стоит ли dateOne перед dateTwo, и проверьте, dateOne идет после dateTwo). Затем для каждой из этих проверок вы должны проверить, наступает ли самая последняя дата до или после даты отсечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...