Um das Kunden-timezone offset in ExpressJS
Ich bin auf der Suche nach einem Weg, um Kunden timezone offset in ExpressJS (mit req-Objekt, zum Beispiel, wäre das wirklich Super).
- Ich bin auch versucht, herauszufinden, wie man browser timezone in server side node-Datei, die für das Szenario, in denen der client direkt einen URL anfordert (z.B. in einem Neuladen der Seite) - ich brauche zum generieren von HTML-Seiten (mit Datum-Werte enthalten), aber die Datumsangaben sind falsch, weil es mit dem server-Standort. Ich bin mit den Datum-fns.
- Update: ich denke ich werde füllen Sie den HTML-raw-ISO-Zeichenfolge, und führen Sie dann
date-fns
client-Seite auf Dokument bereit (Iteration über die entsprechenden CSS-Klassen).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du kontrollierst, können Sie den client tun Sie dies mit client-side JavaScript.
Wenn Sie nicht (z.B. du baust eine serverseitige Komponente wie eine API), dann kann man nicht ziehen Sie es aus der HTTP-Anfrage (es sei denn, du bist mit sessions, aber auch das ist nicht unbedingt zuverlässig).
Auf dem Kopf, wenn es nur server-Seite, Sie sollten sich keine sorgen machen, können Sie entweder: legen Sie alle Ihre date-Objekte werden als UTC oder einen Unix-timestamp und lassen Sie es auf der client-Entwickler zu behandeln Zeitzonen.
Die Sache ist auch wenn Sie haben das timezone-offset, es bedeutet nicht, Sie haben die die richtige Zeit auf der client-Seite, unter Berücksichtigung einer Bereich haben "daylight saving time".
Aber Sie konnten "Schätze" die Zeitzone des Benutzers ist, unter Berücksichtigung der folgenden Daten:
Schließlich durch die Berechnung des obigen Ergebnis, Ihre Vermutung sollte fast da. Die Zeitzone speichern sollte im string wie 'America/New_York' aber nicht Zeitzonen-offset-Nummer.
http://momentjs.com/timezone/ sollte ein gutes tool, um deal mit timezone.
Nach dem speichern der "fast richtig," timezone, vergessen Sie nicht zu verlassen, ein Ort, wo Benutzer können es ändern .
Wie andere erwähnt haben, immer die client-Seite browser - /OS-timezone-offset ist nicht verfügbar über HTTP, so müssen Sie zum senden dieser Daten von der client-Seite.
In meinem Fall habe ich eine app, die ein login benötigt...also kann ich das speichern Benutzer-Einstellungen. Der Standard ist, verwenden Sie den browser, timezone, aber die Benutzer können auch konfigurieren, dass eine bestimmte Zeitzone zu bedienen die ganze Zeit, anstatt gespeichert in Ihrem Benutzer-Profil (z.B.
America/Dallas
oderEurope/Amsterdam
).Traue ich nicht, browser Zeit, um korrekt zu sein. Der Benutzer kann auch eingeschraubt, bis Ihr Betriebssystem-Zeitzone-Einstellung...so timezone offset kann auch nicht richtig sein. Aber die meisten modernen Betriebssysteme set Zeitzone automatisch anhand der Geo-IP-stillschweigend Lage...also für viele Nutzer die Bequemlichkeit des seins in der Lage zu Reisen rund um die Welt und login für die app und sehen Sie Datum/Zeit in welchem lokalen Zeitzone, die Sie geschehen zu sein lohnt sich der Aufwand für die user experience. Benutzer, die wollen immer sehen, eine bestimmte Zeitzone konfigurieren können und werden wir verwenden, dass die Präferenz statt.
Die Art und Weise ich dies Tue, ist Folgendes... auf das login-Formular ein hidden-Feld und stellen Sie den Wert mit javascript. Wenn der Benutzer sich anmeldet, speichern diese timezone offset in der Sitzung. Wenn der Benutzer hat nicht die bevorzugte Zeitzone, dann verwenden wir diesen offset beim Rendern von Datum/Zeit. Dies bedeutet, dass wenn Sie lange Sitzungen und ein Benutzer kann, um Reisen zwischen den Ländern,...Sie zeigen immer noch die alten timezone offset bis zum nächsten logout/login. Natürlich können Sie diese Daten abrufen, häufiger oder sogar auf jede Anfrage, wenn Sie wollen...aber für meine Zwecke immer auf dieser Anmeldung ist ausreichend. Meine Sitzungen sind abgelaufen auf IP-Adresse sowieso ändern...also ja. Natürlich, wenn Sie Ihre Sitzung über eine Sommerzeit Umschalten, dann ist der offset nicht richtig bis die nächste Anmeldung (vorausgesetzt, dass Ihre OS - /browser-TZ ist richtig in den ersten Platz).
Client-Seite
Hinweis, dass ich mehrere es durch
-1
da werde ich verwenden moment.js für die Formatierung auf die express Ende und der Versatz nach hinten (utc-offset von local vs local offset von utc). Sie könnte dies auch tun, auf dem server-Ende. Sollten Sie vielleicht überprüfen Sie diese Nummer, bevor Sie es...nur minimal-Beispiel-code hier.Server-Seite
Dann auf der server-Seite (express) ist eine erfolgreiche Anmeldung, ich bleibe dabei, dass tzOffset Wert in der session.
Dann bei der Formatierung von Daten in express
moment-timezone
ich etwas tun kann, wie die folgenden:Den
ZZ
- format ist für das zeigen von timezone in numerischen offset format (wichtig, wenn wir eine Feste numerische offset vom client.Den
zz
- format ist für das zeigen von timezone in Zeichen format (z.B. PDT, PST, EST, etc.), die relevant sind, wenn wir eine Zeitzone Europa/Berlin statt eines festen numerischen offset.Ein weiterer Ansatz
Push-raw-Daten auf client-und clientseitige Formatierung. Nachteil: weniger Kontrolle und Konsistenz und mehr js zu drücken, um den browser. moment laufen auch client-Seite, wenn Sie mögen.
Ich habe gerade bei der Konfiguration meines formatter server-Seite auf Basis von user locale und user prefs und dann entlarven die Formatierungshilfen für meine Mops-Vorlagen im express. So weit es funktioniert sehr gut für mich.
Lustige Geschichte
Hatte ich einen co-Arbeiter, der manuell die falsche Zeitzone auf Ihrem computer, und so ist die Zeit falsch war. Statt der Festsetzung der Zeitzone Sie deaktiviert die Netzwerk-Zeit und die Zeit manuell einstellen, um die "richtige" Zeit.
Dann bekam Sie mürrisch, wenn alle von denen bis zu Versammlungen, die Sie geplant eine Stunde zu spät.
Also ja...keine Garantien für die client-Seite der Zeit oder Zeitzone offset zu korrigieren.
Einige Leute mögen mit der Bibliothek momentJS für alles, was den Umgang mit der Zeit, aber ich glaube, die Datum - Objekt in Javascript genügt, was Sie suchen und nicht verlangen, eine Bibliothek. Die getTimezoneOffset ist, was Sie brauchen. Ich hoffe, das hilft! Lassen Sie mich wissen, wenn Sie weitere Fragen haben!