Сравнение дат как строк в Java - PullRequest
0 голосов
/ 05 сентября 2018

У меня проблемы со сравнением дат в виде строк. Мне необходимо перебрать коллекцию и сравнить значение даты каждого объекта с 2 датами, переданными в качестве параметров. Все даты хранятся в виде строк, и я обязан хранить их в таком виде.

Известно, что все даты будут отформатированы YYYY-MM-DD. Ниже приведен быстрый пример того, что я имею в виду. Спасибо всем!

public ArrayList<Object> compareDates(String dateOne, String dateTwo) {
    for(Object object : objectCollection) {
        String objectDate = object.getDate();
        if(objectDate.equals(dateOne) || objectDate.equals(dateTwo)) { // Unsure of how to determine if the objects date is inbetween the two given dates
            //add object to collection
        }
    }
return  collection;
}

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Если dateOne предшествует dateTwo, вы можете использовать следующее сравнение, если вы хотите иметь промежуточную дату.

    public ArrayList<Object> compareDates(List<Object> objectCollection, String start, String end) {
        ArrayList<Object> dateBetween = new ArrayList<>();
        for(Object object : objectCollection) {
            LocalDate objectDate = parseDate(object.getDate());
            if( !objectDate.isBefore(parseDate(start)) && !objectDate.isAfter(parseDate(end))) {
                dateBetween.add(object);
            }
        }
        return dateBetween;
    }

    private LocalDate parseDate(String date) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-DD");
        return LocalDate.parse(date, formatter);
    }
0 голосов
/ 05 сентября 2018

Поскольку ваши даты в формате YYYY-MM-DD, можно использовать лексикографическое сравнение для определения порядка между двумя датами. Таким образом, вы можете просто использовать метод String.compareTo() для сравнения строк:

int c1 = objectDate.compareTo(dateOne);
int c2 = objectDate.compareTo(dateTwo);
if ((c1 >= 0 && c2 <= 0) || (c1 <= 0 && c2 >= 0)) {
    // objectDate between dateOne and dateTwo (inclusive)
}

Если гарантировано, что dateOne < dateTwo, то вы можете просто использовать (c1 >= 0 && c2 <= 0). Чтобы исключить границы дат, используйте строгие неравенства (> и <).

0 голосов
/ 05 сентября 2018

Поскольку ваши даты в формате yyyy-MM-dd, то строка compareTo должна возвращать согласованные результаты:

if(objectDate.compareTo(dateOne) >= 0 && objectDate.compareTo(dateTwo) <= 0)

Это примерно проверяет (концептуально): objectDate >= dateOne && objectdate <= dateTwo

Это просто если нужно использовать строковые методы. Однако лучшим подходом было бы преобразовать строки в объекты даты и выполнить сравнения на основе даты.

0 голосов
/ 05 сентября 2018

Вот процедура, которой вы должны следовать:

  1. Конвертировать обе строки: дата-дата, строка-дата-два в java.time.LocalDate
  2. Переберите свой ArrayList и преобразуйте проиндексированную строку в java.time.LocalDate

    Примечание: Вам необходимо принять ArrayList<String>, чтобы разобрать строку в LocalDate, а не ArrayList<Object>

  3. Сделай сравнение

См. Документацию для реализации логики сравнения.

Вы можете обратиться к по этой ссылке для получения дополнительной помощи .

...