Skip to content

angular json zeitzonen

andrewinkler edited this page Oct 10, 2019 · 7 revisions

Angular, JSON und das Zeitzonenproblem

Eine immer wieder kehrende Frage innerhalb einer REST-Anwendung. Wie übergebe ich Datum und Zeitstempel an das Frontend? Es gibt folgende Spielarten:

  • Als vorformatierter String. Dann eröffnet sich die Frage, welches Format soll angewendet. Soll gleich das Ausgabeformat verwendet werden? Oder eher Javascript freundlich?
  • Als Unix Timestamp in Millisekunden.

Das Beispiel Projekt findet sich auf Github: Springboot Demo. Die Anwendung mit git clonegit@github.com:gluehloch/springboot-demo.git und mvn clean package bauen. Im Anschluss das gepackte Jar mit java -jar ./target/restdemo-1.0.jar starten. Unter der Adresse http://localhost:8080/demo/ping findet sich die Response mit den verschiedenen Datumsformaten wieder. Die Anwendung verwendet Spring-Boot bzw. das eingebaute Jackson für die Serialisierung/Deserialisierung von Objekten.

RestController:

@RestController
@RequestMapping("/demo")
public class DateTimeController {

    @GetMapping("/ping")
    public PingDateTime ping() {
        PingDateTime pdt = new PingDateTime();
        pdt.setDateTime(new Date());
        return pdt;
    }

}

Mit der Annotation @JsonFormat wird der Serialisierungsprozess gesteuert. Out-of-the-box funktioniert die Annotation nur mit den Java Datentyp java.util.Date und java.time.LocalDate bzw. java.time.LocalDateTime. Für den Joda org.joda.time.DateTime Datentyp gibt es auf GitHub eine Extension für Jackson.

Fehlt die Annotation, versucht der Serialisierer Jackson eine Dekonstruktion. Im Falle von java.util.Date werden die Millisekunden (Unix-Timestamp) zurück geliefert. Das Joda DateTime Objekt erfährt bei der Serialisierung eine detailreiche Auflösung.

JSON Objekt

public class DateTimeJson {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy HH:mm", locale = "de_DE", timezone = "Europe/Berlin")
    private Date dateTimeBerlin;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy HH:mm", locale = "de_DE", timezone = "UTC")
    private Date dateTimeUTC;

    private DateTime jodaDateTime;
    
    private Date dateTimeMillies;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy HH:mm", locale = "de_DE", timezone = "UTC")
    private LocalDateTime localDateTimeUTC;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd.MM.yyyy HH:mm", locale = "de_DE", timezone = "Europe/Berlin")
    private LocalDateTime localDateTimeBerlin;

    private LocalDateTime localDateTime;

    // getter and setters...
}
{{tippModel.round.dateTime | date: 'dd.MM.yyyy HH:mm': '+0000'}}

Information über den Unix Zeitstempel:

Clone this wiki locally