Bagaimana cara menyimpan DateTime dalam format UTC dengan Java 8?

Oct 01 2020

Versi Spring Boot 2.3.1.

Saya memiliki kelas berikut:

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

Setelah menyimpan acara secara lokal, saya harus mengirimkannya ke backend. Untuk saat ini, pengiriman data terlihat seperti:

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

Namun, backend mengharapkan format data berikut:

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

Ide utama aplikasi ini adalah mengirim acara ke backend .
Jadi saya perlu mengirim data persis seperti yang mereka harapkan.

Setelah melihat jawaban berikut:

  • Apa format tanggal ini? 2011-08-12T20: 17: 46.384Z
  • Cara mengonversi LocalDateTime ke “yyyy-MM-dd'T'HH:mm:ss'Z'”format

Tidak mengerti bagaimana tepatnya saya harus menyimpan bidang ini secara lokal?

Apakah saya perlu pindah ke OffsetDateTimeatau ZonedDateTime?

Juga, saya ingin menggunakan Java 8 Date Time API .

Untuk mengontrol pengaturan waktu tanggal, gunakan kelas utilitas berikut:

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

Saya menggunakannya di mana saja di mana tanggal-waktu baru harus dibuat.

Apa strategi terbaik untuk menyimpan format waktu data ISO 8601 dengan Java 8 dan Spring Boot?

Jawaban

deHaar Oct 01 2020 at 22:08

Masalahnya di LocalDateTimesini adalah bahwa itu tidak menyimpan offset atau zona waktu, yang berarti Anda tidak dapat memformatnya ke Stringyang berisi Zuntuk UTC masing-masing sebagai offset +00:00.

Saya akan menggunakan ZonedDateTimeyang akan memiliki offset dan zona id dan format menggunakan spesifik DateTimeFormatter(tidak tahu persis bagaimana penjelasan Anda akan menangani ini).

Berikut adalah contoh Java sederhana:

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")));
}

Output dari contoh kecil ini adalah (beberapa detik yang lalu):

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

Saya pikir Anda dapat menggunakan pola seperti itu dalam @JSONFormatanotasi. Tidak sepenuhnya yakin, tetapi tidak dapat mencarinya sekarang.