Значение 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

ONLINE DEMO

Вы можете преобразовать одно в другое

С использованием 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

ONLINE DEMO

Узнайте больше о современном API даты и времени из Trail: Date Time .

Другие вопросы по тегам