Значение OffsetDateTime изменяется при извлечении из базы данных
Я использую таблицу из базы данных MS SQL и разработал GET API с помощью Spring Boot, чтобы получить все данные из этой таблицы.
Здесь таблица содержит столбец типа
datetimeoffset(7)
.
У меня есть член данных
OffsetDateTime updatedDate
внутри моей сущности, используется для отображения
datetimeoffset
столбец из БД
Теперь, когда я получаю ответ API, я вижу
updatedDate
значение ( 2021-06-17T05:37:40.1938687+05:30) отличается от фактического значения базы данных (2021-06-16 19:07:40.1938687 -05:00).
Я исследовал Интернет, чтобы найти некоторую помощь, и попробовал несколько решений, подобных Solution, однако я не увидел никаких положительных результатов.
Любая помощь будет действительно заметна, спасибо!
PS. Версия Spring Boot: 2.3.1.RELEASE
2 ответа
Эти два значения представляют собой одну и ту же точку на временной шкале. Просто они представлены в разных часовых поясах: база данных использует EST и
Spring
приложение использует IST Indian . Когда мы конвертируем их в GMT, они будут выглядеть так же:
String[] dates = {"2021-06-17T05:37:40.1938687 +05:30", "2021-06-16T19:07:40.1938687 -05:00"};
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.n XXX")
.withZone(ZoneId.of("GMT"));
Arrays.stream(dates)
.map(date -> formatter.format(OffsetDateTime.parse(date, formatter)))
.forEach(System.out::println);
Над кодом печатается:
2021-06-17T00:07:40.1938687 Z
2021-06-17T00:07:40.1938687 Z
Если вы хотите сохранить исходное представление, вам необходимо указать, как использовать
EST
часовой пояс вместо стандартного или системного. Попробуйте установить : свойствоspring.jackson.time-zone в файле конфигурации:
Часовой пояс, используемый при форматировании дат. Например, «Америка / Лос-Анджелес» или «GMT + 10».
Теперь, когда я получаю ответ API, я вижу, что значение updatedDate (2021-06-17T05:37:40.1938687+05:30) отличается от фактического значения базы данных (2021-06-16 19:07:40.1938687 -05:00).
Нет, оба Date-Time представляют один и тот же момент / момент.
Демо:
import java.time.Instant;
public class Main {
public static void main(String[] args) {
System.out.println(Instant.parse("2021-06-17T05:37:40.1938687+05:30"));
System.out.println(Instant.parse("2021-06-16T19:07:40.1938687-05:00"));
}
}
Выход:
2021-06-17T00:07:40.193868700Z
2021-06-17T00:07:40.193868700Z
Вы можете преобразовать одно в другое
С использованием OffsetDateTime#withOffsetSameInstant
, вы можете преобразовать одно в другое.
Демо:
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
public class Main {
public static void main(String[] args) {
OffsetDateTime odtFromResponse = OffsetDateTime.parse("2021-06-17T05:37:40.1938687+05:30");
OffsetDateTime odtDesired = odtFromResponse.withOffsetSameInstant(ZoneOffset.of("-05:00"));
System.out.println(odtDesired);
}
}
Выход:
2021-06-16T19:07:40.193868700-05:00
Узнайте больше о современном API даты и времени из Trail: Date Time .