如何使用 Java 8 以 UTC 格式存储 DateTime?

How to store DateTime at UTC format with Java 8?

Spring 引导版本 2.3.1.

我有以下 class:

@Data
@Entity
@NoArgsConstructor
public class CarParkEvent implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Enumerated(EnumType.STRING)
    private EventType eventType;

    @Column(columnDefinition = "TIMESTAMP")
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createdAt;

在本地存储事件后,我必须将它发送到后端。 目前,发送数据如下:

"createdAt" : "2020-10-01T17:15:23.481"

但是,后端需要以下数据格式:

"createdAt" : "2020-10-01T17:15:23Z"

该应用程序的主要思想是将事件发送到后端
所以我需要发送他们期望的准确数据。

看了下面的回答后:

无法理解我必须如何在本地存储该字段?

我需要换到 OffsetDateTimeZonedDateTime 吗?

此外,我想使用 Java 8 日期时间 API.

要控制日期时间设置,请使用以下实用程序 class:

@Slf4j
@UtilityClass
public class TimeClock {

    private LocalDateTime dateTime;

    public LocalDateTime getCurrentDateTime() {
        return (dateTime == null ? LocalDateTime.now() : dateTime);
    }

    public void setDateTime(LocalDateTime date) {
        log.info("Set current date for application to: {}", date);
        TimeClock.dateTime = date;
    }

    public void resetDateTime() {
        log.info("Reset date for the application");
        TimeClock.dateTime = LocalDateTime.now();
    }

    /**
     * Different formats for current dateTime.
     */
    public LocalDate getCurrentDate() {
        return getCurrentDateTime().toLocalDate();
    }

    public LocalTime getCurrentTime() {
        return getCurrentDateTime().toLocalTime();
    }
}

我在任何应该创建新日期时间的地方使用它。

使用Java8和Spring引导存储ISO 8601数据时间格式的最佳策略是什么?

此处 LocalDateTime 的问题在于它根本不存储偏移量或时区,这意味着您无法将其格式化为包含 ZString对于 UTC 分别是 +00:00.

的偏移量

我会使用一个 ZonedDateTime,它将有一个偏移量和一个区域 ID,格式使用特定的 DateTimeFormatter(不完全知道你的注释将如何处理这个)。

这是一个简单的小 Java 示例:

public static void main(String[] args) {
    // get an example time (the current moment) in UTC
    ZonedDateTime now = ZonedDateTime.now(ZoneOffset.UTC);
    // print its toString (implicitly)
    System.out.println(now);
    // format it using a built-in formatter
    System.out.println(now.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
    // or define a formatter yourself and print the ZonedDateTime using that
    System.out.println(now.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssz")));
}

这个小例子的输出是(几秒钟前):

2020-10-01T15:06:16.705916600Z
2020-10-01T15:06:16.7059166Z
2020-10-01T15:06:16Z

我认为您可以在 @JSONFormat 注释中使用这样的模式。不完全确定,但现在无法查询。