Мы не знаем. Строки не дают одинаковую информацию, поэтому информация из них не легко сопоставима. Если вы знаете, какой часовой пояс предполагается во второй строке, мы конвертируем каждый в определенный момент времени и сравниваем их.
Первая строка является более простой, поскольку в дополнение к дате и времени дня она также сообщает смещение от UT C (смещение часового пояса). Таким образом, с помощью этой строки мы можем определить момент времени. Кроме того, строка в формате ISO 8601. Классы java .time, современный Java API даты и времени, анализируют формат ISO 8601 (или его наиболее распространенные варианты) в качестве значений по умолчанию, то есть без какого-либо явного средства форматирования.
String responseFromWs = "2020-01-07T17:15:00-08:00";
OffsetDateTime odtFromWs = OffsetDateTime.parse(responseFromWs);
System.out.println(odtFromWs);
Вывод этого значения:
2020-01-07T17:15-08:00
Очень похоже на вход (пропущены только 00
секунды). Это связано с тем, что OffsetDateTime
также печатает обратно формат ISO 8601 (и секунды необязательны в соответствии с этим форматом). Важно то, что у нас есть объект даты и времени, который мы можем использовать для дальнейшей обработки, например, для сравнения с другими объектами даты и времени.
Проблема со второй строкой, той из базы данных, заключается в мы не знаем подразумеваемое смещение. Общие рекомендации включают хранение даты и времени в формате UT C в вашей базе данных, а также не для извлечения ее в виде строки из базы данных, а в качестве правильного объекта даты и времени, например OFfsetDateTime
, подобного тому, который мы использовали ранее.
Если вы знаете, что строка в UT C, и мы пока полагаемся на строку:
DateTimeFormatter dbFormatter = new DateTimeFormatterBuilder()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.appendLiteral(' ')
.append(DateTimeFormatter.ISO_LOCAL_TIME)
.toFormatter();
String responseFromDatabase = "2020-01-08 01:15:00.0";
OffsetDateTime odtFromDb = LocalDateTime
.parse(responseFromDatabase, dbFormatter)
.atOffset(ZoneOffset.UTC);
System.out.println(odtFromDb);
2020-01-08T01:15Z
Теперь у нас есть два OffsetDateTime
объектов. У них есть методы для сравнения:
System.out.println("Before: " + odtFromWs.isBefore(odtFromDb));
System.out.println("After: " + odtFromWs.isAfter(odtFromDb));
System.out.println("Same time: " + odtFromWs.isEqual(odtFromDb));
System.out.println("Equal: " + odtFromWs.equals(odtFromDb));
Before: false
After: false
Same time: true
Equal: false
Вы можете быть удивлены, что isEqual()
возвращает true и equals()
false. Это связано с тем, что isEqual()
проверяет, обозначают ли два объекта одну и ту же точку во времени, что они и делают, в то время как equals()
требуется одна и та же точка во времени и одинаковое смещение , прежде чем он выдаст значение true. Поскольку два объекта имеют разные смещения, в этом случае он возвращает false.
Ваш драйвер JDB C или реализация JPA, вероятно, будут рады получить объект даты-времени из базы данных, а не строку, которая Как я уже сказал, рекомендуется. Детали зависят от типа данных, используемого в базе данных, но вы можете прочитать больше в моем ответе на другие вопросы, см. Ссылку внизу.
Ссылки