Сравнение двух дат в другом формате - PullRequest
1 голос
/ 16 мая 2019

Как сравнить эти две даты из другого формата, чтобы проверить, равны ли они

Date d1 = bean.fooDate; // >> from a post request
System.out.println(d1); // >> "Sat May 25 10:00:00 WET 2019"

Date d2 = fooEntity.getFooDate(); // >> from mysql database
System.out.println(d2); // >> "2019-05-25"

P.S. Я хочу просто сравнить это как дату, а не как дату и время (не нужно сравнивать минуты и секунды)

Ответы [ 3 ]

1 голос
/ 16 мая 2019

Используйте toLocalDate() из Java 8 раз, чтобы сравнить только часть даты

LocalDate localDate1=date1.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate localDate2=date2.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
localDate1.compareTo(localDate2)
1 голос
/ 16 мая 2019

Сказать, что ваши две даты имеют разный формат, не совсем точно. У Date нет формата. То, что вы видите, что вы печатаете даты, это возвращаемые значения их toString методов.

Скорее, ваши даты имеют разные типы времени выполнения . d1 является экземпляром java.util.Date, а его метод toString создает формат Sat May 25 10:00:00 WET 2019. d2 в свою очередь является экземпляром java.sql.Date. Это подкласс java.util.Date, поэтому его можно назначить переменной этого типа. java.sql.Date.toString() создает формат 2019-05-25. Однако отношения подкласса (наследования) - это хак, на который не следует полагаться в коде.

Хак наследования - лишь одна из многих проблем проектирования с этими двумя классами. К счастью, существует более новая и современная замена для обоих. Для java.util.Date современный Instant класс является наиболее соответствующим типом, но какой именно использовать, зависит от ваших более точных требований. Для java.sql.Date это проще, используйте LocalDate. И Instant, и LocalDate являются частью java.time, современного Java-API даты и времени.

Посмотрите, можете ли вы заменить bean.fooDate на Instant или другой подходящий современный тип из java.time. Точно так же посмотрите, можете ли вы получить fooEntity.getFooDate(), чтобы вернуть LocalDate. Hibernate должен быть рад обрабатывать для вас LocalDate, а не Date (если ваша версия Hibernate не очень старая).

В любом случае, Srinivasan Sekar является правильным, что вы должны конвертировать любой тип, который вы получаете от каждого, в LocalDate, чтобы сравнивать только даты, а не часы, минуты и секунды. LocalDate именно так: дата без времени суток.

Скажите, что вы получаете Instant от bean.fooDate. Тогда преобразование:

    LocalDate localDate1 = bean.fooDate.atZone(ZoneId.of("Africa/El_Aaiun")).toLocalDate();

Обязательно укажите подходящий часовой пояс.

Если вы не можете избежать старомодного Date, обращение в ответе Шринивасана Секара будет правильным:

    LocalDate localDate1 = bean.fooDate
            .toInstant()
            .atZone(ZoneId.of("Africa/El_Aaiun"))
            .toLocalDate();

В случае fooEntity.getFooDate(), если вы можете получить LocalDate, как уже упоминалось, все готово. Если вы можете получить только Date, сначала проверьте, объявлен ли метод для возврата java.util.Date или java.sql.Date. Вероятно, это зависит от импорта, используемого в файле, где объявлен метод. Случай java.sql.Date достаточно прост (хотя, к сожалению, не всегда даётся правильная дата):

    LocalDate localDate2 = fooEntity.getFooDate().toLocalDate();

Если объявленный тип возврата равен java.util.Date, вы можете просто добавить приведение к вышеприведенному, так как кажется, что фактически возвращаемый объект - java.sql.Date. Сначала было бы безопаснее проверить ваше предположение:

    LocalDate localDate2;
    Date d2 = fooEntity.getFooDate();
    if (d2 instanceof java.sql.Date) {
        localDate2 = ((java.sql.Date) fooEntity.getFooDate()).toLocalDate();
    } else {
        localDate2 = d2.toInstant()
                .atZone(ZoneId.of("Africa/El_Aaiun"))
                .toLocalDate();
    }

Вы поймете, что во втором случае я использую то же преобразование, что и выше.

Для сравнения результирующих LocalDate переменных:

    if (localDate1.isEqual(localDate2)) {
        System.out.println("Same date");
    } else {
        System.out.println("Different dates");
    }

LocalDate также имеет методы isBefore и isAfter на тот случай, если вам нужно определить, что раньше.

Ссылка: Обучающее руководство по Oracle: Дата и время , объясняющее, как использовать java.time.

1 голос
/ 16 мая 2019

Date объекты имеют метод getTime(), который возвращает количество миллисекунд с 1 января 1970 года ( см. Документы ).

Итак, для сравнения двух дат:

if (d1.getTime() == d2.getTime()) {
    // the dates represent the same point in time
} else {
    // they are different points in time
}

Вы также можете использовать эту технику, чтобы увидеть, является ли один до или после другого, используя < или >.

Редактировать : Если выЧтобы сравнить даты независимо от компонента времени, просто разделите каждое значение, возвращаемое из getTime(), на количество миллисекунд в дне (1000 * 60 * 60 * 24):

long millisInADay = 1000 * 60 * 60 * 24;
long m1 = d1.getTime() / millisInADay;
long m2 = d2.getTime() / millisInADay;

if (m1 == m2) {
    // the two dates (excluding time) are the same
} else {
    // they're not
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...