วิธีจัดเก็บ DateTime ในรูปแบบ UTC ด้วย Java 8

Oct 01 2020

2.3.1รุ่นฤดูใบไม้ผลิ Boot

ฉันมีคลาสต่อไปนี้:

@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"

แนวคิดหลักของการประยุกต์ใช้คือการส่งกิจกรรมเพื่อแบ็กเอนด์
ดังนั้นฉันต้องส่งข้อมูลที่แน่นอนซึ่งพวกเขาคาดหวัง

หลังจากดูคำตอบต่อไปนี้:

  • รูปแบบวันที่นี้คืออะไร? 2011-08-12T20: 17: 46.384Z
  • วิธีแปลง LocalDateTime เป็น“yyyy-MM-dd'T'HH:mm:ss'Z'”ฟอร์แมต

ไม่เข้าใจว่าฉันต้องจัดเก็บฟิลด์นี้ในเครื่องอย่างไร?

ฉันต้องเปลี่ยนOffsetDateTimeหรือZonedDateTime?

นอกจากนี้ผมต้องการที่จะใช้Java 8 วันที่เวลา API

สำหรับการควบคุมการตั้งค่าวันเวลาให้ใช้ยูทิลิตี้คลาสต่อไปนี้:

@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();
    }
}

ฉันใช้ที่ใดก็ได้ที่ควรสร้างวันที่ - เวลาใหม่

กลยุทธ์ที่ดีที่สุดในการจัดเก็บรูปแบบเวลาข้อมูลISO 8601ด้วย Java 8 และ Spring Boot คืออะไร

คำตอบ

deHaar Oct 01 2020 at 22:08

มีปัญหากับLocalDateTimeที่นี่ก็คือว่ามันก็ไม่ได้เก็บชดเชยหรือเขตเวลาซึ่งหมายความว่าคุณไม่สามารถจัดรูปแบบไปยังStringที่มีZสำหรับ UTC +00:00ตามลำดับชดเชย

ฉันจะใช้ZonedDateTimeซึ่งจะมีออฟเซ็ตและรหัสโซนและรูปแบบใช้เฉพาะ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คำอธิบายประกอบได้ ไม่แน่ใจทั้งหมด แต่ไม่สามารถค้นหาได้ในขณะนี้