Sollte eine REST-API in der Lage sein, datetime in die entsprechende Client-Zeitzone zu konvertieren?


10

Bei der Implementierung unserer API trat das Problem von Datum / Uhrzeit und Zeitzonen auf.

Alle Daten werden in der Datenbank auf UTC normalisiert. Derzeit werden in der Nicht-API-Anwendung alle Datumszeiten basierend auf den Benutzereinstellungen konvertiert, bevor sie zuerst angezeigt werden.

Nun stellte sich für die API dieselbe Frage: Sollte die API in der Lage sein, die für eine Zeitzone geeignete Datumszeit basierend auf der Anforderungssemantik zurückzugeben?

ZB GET /posts?timezone=America/Sao_Paulo?

Oder sollte es immer noch auf jedem Client durchgeführt werden, der auf die API zugreift?

Update: da es ein paar Mal aufgetaucht ist: Derzeit werden Zeitstempel mit Zeitzone zurückgegeben (obwohl es immer TZ-Offset ist +00:00). Das Format ist das beliebte 8601:2015-10-29T23:00:49+00:00


Wenn Sie einen Zeitstempel mit einer Zeitzone zurückgeben, kann der Client ihn problemlos in die erforderliche Ortszeit konvertieren. Wie auch immer, diese Frage scheint überhaupt nicht mit REST zu tun zu haben. Es gibt zahlreiche Möglichkeiten, dies zu implementieren, die nicht gegen die Prinzipien von REST verstoßen. Bitte beachten Sie, dass das Anzeigen dieses Parameters mehr Arbeit für Sie bedeutet. In einer wirklich RESTful-Architektur müssen Sie diese Links irgendwie auffindbar machen. Es erscheint mir unnötig kompliziert, sowohl auf Client- als auch auf Serverseite zu implementieren.
toniedzwiedz

> Es erscheint mir unnötig kompliziert, sowohl auf Client- als auch auf Serverseite zu implementieren. Danke für die Eingabe!
Markieren Sie den

Antworten:


17

Sie sollten einen absoluten Zeitpunkt zurückgeben, dann kann jeder diesen Zeitstempel nach Bedarf lokalisieren. Mit "absoluter Zeitstempel" meine ich entweder einen UNIX-Zeitstempel oder einen von Menschen lesbaren Zeitstempel, der die Zeitzone in einem der standardisierten ISO-Formate enthält, z. B. "2007-04-05T14: 30Z". Dies kann vom Client bei Bedarf trivial in eine lokale Zeitzone konvertiert werden.

Wenn Sie einen Zeitzonenparameter akzeptieren und den Zeitstempel auf diese Zeitzone lokalisieren möchten, ist dies in Ordnung, aber Sie sollten trotzdem den absoluten Zeitstempel inkl. Zeitzone in Ihrer Antwort, z. B. "2007-04-05T16: 30-02: 00". Angesichts der Tatsache, dass dieser Wert mit dem vorherigen nicht lokalisierten Wert identisch ist, ist es ziemlich fraglich, warum Sie sich die Mühe machen würden, diesen Parameter anzubieten. Das genaue Anzeigeformat des Zeitstempels hängt letztendlich vom Frontend des Clients ab, sodass der Wert wahrscheinlich trotzdem nachbearbeitet wird.


4
"Es ist ziemlich fraglich, warum du den Ärger durchgemacht hast" - wenn nichts anderes, ist es das dünne Ende des Keils. Der nächste Client dieser API fordert Sie möglicherweise auf, ein strftimeFormat (plus Gebietsschema für Monats- / Tagesnamen) anzugeben , aus denselben Gründen, die der erste Client für die Angabe einer Zeitzone nützlich hielt. Selbst mit der Zeitzone als einzigem Zugeständnis haben Sie die Antwort Ihrer API komplexer gestaltet: Es ist nicht mehr nur "jedes Mal ein Zeitstempel im gleichen Format", sondern "ein Zeitstempel, der so ausgedrückt wird, wie ich ihn ausdrücken sollte"
Steve Jessop

3
Genau Komplexität. Komplexität ist böse. Dadurch arbeiten alle härter, ohne dass ein Mehrwert für das Produkt oder das Geschäft entsteht. Tod durch tausend Papierschnitte.
Brandon

2
> Sie sollten einen absoluten Zeitpunkt zurückgeben. Ich habe meine Frage geklärt, dass ich dies bereits tue. Vielen Dank für Ihren Einblick!
Markieren Sie den

4

Wenn Sie bereits über die Logik verfügen, Datums- / Uhrzeitwerte in die lokale Zeitzone des Benutzers zu konvertieren, können Sie beide Möglichkeiten in Ihrer API anbieten.

Wenn ein Client eine Anfrage wie macht GET /posts, erhält er alle Zeiten in der Standardzeitzone (UTC).
Wenn ein Client eine Anfrage wie macht GET /posts?timezone=America/Sao_Paul, werden alle Zeiten in der Antwort an die angegebene Zeitzone angepasst.

Es liegt dann an der Client-Implementierung, was sie mit Zeitzonen tun möchten.


2

Normalerweise würden Sie UTC von einer API erwarten.

Wenn Ihre 'REST-API' jedoch nur der serverseitige Teil einer Webseite ist, die ein Javascript-Framework verwendet. Ich würde argumentieren, dass Sie tatsächlich ein ViewModel zurückgeben und es daher lokalisierte Zeichenfolgen, Zahlen und Zeiten enthalten sollte.


2

Es ist eine schlechte, schlechte, schlechte Idee. Stellen Sie sich eine Situation vor, in der der Client Antworten vom Server speichert und der Benutzer dann in eine andere Zeitzone wechselt. Jetzt haben Sie eine Situation, in der diese "Funktion" Ihnen bestenfalls keinen Vorteil verschafft oder enorme Probleme verursacht.

Übrigens. Für wie viele Zeitzonen und wie viele Clients werden Sie dies testen? Wenn der Server die erwartete Antwort für America / Sao_Paul gibt, wie wird er dann für America / Sao_Paulo antworten?


Das war ein Fehler von meiner Seite, ich habe ihn korrigiert America/Sao_Paulo. Ich denke, es steht zur Diskussion, was passiert, wenn die Zeitzone nicht identifiziert werden kann. entweder weil es einfach falsch ist oder weil die TZ-Datenbank veraltet ist (letzteres finde ich für die tatsächlichen Namen unwahrscheinlich [aber nicht für Offset-Werte). In beiden Fällen würde ich jedoch wahrscheinlich eine 400 BAD_REQUESTAntwort zurückgeben.
Markieren Sie den
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.