2

我正在使用MS SQL数据库中的一个表并开发了一个GET APIusingSpring 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

4

2 回答 2

1

现在,当我收到 API 响应时,我看到 updatedDate 值 (2021-06-17T05:37:40.1938687+05:30) 与实际数据库值 (2021-06-16 19:07:40.1938687 -05:00) 不同)。

不,两个日期时间都代表相同的瞬间/时刻。

演示:

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

从Trail: Date Time了解有关现代日期时间 API 的更多信息。

于 2021-07-10T17:27:45.700 回答
1

这两个值代表时间线上的完全相同的点。它们只是在不同的时区中表示:数据库使用ESTSpring应用程序使用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”。

于 2021-07-10T17:01:32.443 回答