Wie speichere ich DateTime im UTC-Format mit Java 8?

Oct 01 2020

Spring Boot Version 2.3.1.

Ich habe folgende Klasse:

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

Nachdem ich das Ereignis lokal gespeichert habe, muss ich es an das Backend senden. Im Moment sieht das Senden von Daten folgendermaßen aus:

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

Das Backend erwartet jedoch das folgende Datenformat:

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

Die Hauptidee der Anwendung besteht darin , Ereignisse an das Backend zu senden .
Ich muss also genaue Daten senden, die sie erwarten.

Nach dem Betrachten der folgenden Antworten:

  • Was ist dieses Datumsformat? 2011-08-12T20: 17: 46.384Z
  • So konvertieren Sie LocalDateTime in ein “yyyy-MM-dd'T'HH:mm:ss'Z'”Format

Konnte nicht verstehen, wie genau ich dieses Feld lokal speichern muss?

Muss ich zu OffsetDateTimeoder wechseln ZonedDateTime?

Außerdem möchte ich die Java 8 Date Time API verwenden .

Verwenden Sie zur Steuerung der Datums- und Uhrzeiteinstellung die folgende Dienstprogrammklasse:

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

Ich benutze es überall dort, wo das neue Datum und die neue Uhrzeit erstellt werden sollen.

Was ist die beste Strategie zum Speichern des ISO 8601- Datenzeitformats mit Java 8 und Spring Boot?

Antworten

deHaar Oct 01 2020 at 22:08

Das Problem LocalDateTimedabei ist, dass es einfach keinen Versatz oder keine Zeitzone speichert, was bedeutet, dass Sie es nicht auf einen formatieren können String, der einen Zfür UTC bzw. einen Versatz von enthält +00:00.

Ich würde eine verwenden, ZonedDateTimedie einen Versatz hat und eine Zonen-ID und ein Format verwenden eine bestimmte DateTimeFormatter(ich weiß nicht genau, wie Ihre Anmerkung damit umgehen wird).

Hier ist ein kleines einfaches Java-Beispiel:

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

Die Ausgabe dieses kleinen Beispiels war (vor einigen Sekunden):

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

Ich denke, Sie können ein solches Muster in der @JSONFormatAnmerkung verwenden. Ich bin mir nicht ganz sicher, kann es aber jetzt nicht nachschlagen.