Сравнение дат Java: даты в разных форматах - PullRequest
0 голосов
/ 30 августа 2018

У меня есть две даты в строковом формате: скажем String date1 = 2018-08-29 и в ISO-OFFSET_DATE_TIME формате как String date2 = 2018-08-30T00:00:00+10:00. Каков наилучший способ сравнить date1 и date2 на равенство? Меня не волнует время, важны только день, год и месяц. Должен ли я конвертировать их в мгновение и сравнить?

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

ТЛ; др

LocalDate
.parse( "2018-08-29" ) 
.isEqual(
    OffsetDateTime
    .parse( "2018-08-30T00:00:00+10:00" )
    .toLocalDate()
)

ложь

java.time

Разбор каждого ввода во время его соответствующего типа в java.time .

LocalDate ld = LocalDate.parse( "2018-08-29" ) ;
OffsetDateTime odt = OffsetDateTime.parse( "2018-08-30T00:00:00+10:00" ) ;

Сравните, извлекая LocalDate из OffsetDateTime.

Boolean sameDate = ld.isEqual( odt.toLocalDate() ) ;

ложь

Или, возможно, вы хотите отрегулировать это OffsetDateTime со смещения на десять часов впереди UTC до другого смещения или часового пояса. Например, давайте вернемся к UTC перед извлечением даты для сравнения.

LocalDate
.parse( "2018-08-29" ) 
.isEqual(
    OffsetDateTime
    .parse( "2018-08-30T00:00:00+10:00" )
    .withOffsetSameInstant( ZoneOffset.UTC )
    .toLocalDate()
)

Это меняет наши результаты с false, как видно из кода выше, на true.

правда

0 голосов
/ 30 августа 2018

Если это единственное, что вы когда-либо захотите узнать о двух строках:

    LocalDate ld1 = LocalDate.parse(date1);
    LocalDate ld2 = LocalDate.parse(date2, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    if (ld1.isEqual(ld2)) {
        System.out.println("They are the same date");
    } else {
        System.out.println("They are different dates");
    }

Вывод с использованием примеров строк из вопроса:

Это разные даты

Я просто писал код, похожий на , написанный Бэзилом Бурком , когда пришел его ответ. Я предпочитаю обрабатывать дату и время правильными объектами даты и времени, что он и делает. Анализируя date2 в OffsetDateTime, вы сохраняете всю информацию, и преобразование в LocalDate для сравнения легко. Для большинства целей я рекомендую этот способ.

Только если вы точно знаете, что вам никогда не понадобится время суток, вы можете воспользоваться ярлыком. Конечно, вы можете использовать быстрый способ JunJie Wang . Однако я предпочитаю свой собственный код выше по двум причинам: я четко говорю читателю, что строки - это даты и время, и корректно обрабатывает их как таковые. И тем самым он также обеспечивает проверку форматов строк. Если однажды случайно вы получите совершенно другую строку, вы получите уведомление через DateTimeParseException.

0 голосов
/ 30 августа 2018

самый быстрый способ;

String date1 = "2018-08-29";
String date2 = "2018-08-30T00:00:00+10:00";
boolean isEqual = date2.startsWith(date1);
...