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
Antworten:
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.
quelle
strftime
Format (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"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.
quelle
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.
quelle
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?
quelle
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 eine400 BAD_REQUEST
Antwort zurückgeben.