2016-09-02 13 views
0

Ich habe ein Admin-Panel, wo eingegebene Elemente eine time_posted und eine Ablaufzeit haben. Diese Zeiten verwenden einen Zeitstempel (time()) bei der Eingabe.PHP-Daten und Zeitzonen

Ich möchte die Eingabe der Ablaufzeit einen ausgefallenen Datum/Uhrzeit-Selektor verwenden, aber der Selektor verwendet JavaScript Client-Zeit statt Serverzeit.

Eine Möglichkeit, dies zu beheben, wäre, die Zeitzone zu speichern, in der sich ein Benutzer befindet, und diese dann als Offset für die eingegebenen Daten zu verwenden, aber es muss zu 100% korrekt sein.

Gibt es einen "richtigen" Weg, dies zu erreichen? Ich habe gesehen, dass einige PHP-Funktionen die Zeitzone Einstellung verwenden, andere nicht, zum Beispiel die tatsächliche time() Funktion nicht und auch wenn ich ein DateTime Objekt erstellen, den aktuellen Zeitstempel ausgeben, ändern Sie die Zeitzone und geben Sie den Zeitstempel erneut es nur zurück der gleiche Zeitstempel zweimal.

würde Alle Zeiger schöne

+1

'time()' gibt einen Unix-Zeitstempel zurück und dieser Zeitstempel ist unabhängig von Zeitzonen. –

+0

Das ist nicht meine Frage, meine Frage ist über Offsets serverseitig verwenden, um den richtigen Unix-Zeitstempel aus dem lokalen Timestamp der Client sendet basierend auf der gespeicherten Zeitzone des Kontos – Ieuan

+0

Holen Sie sich die ausgefallene Datumsauswahl, um Ihnen einen UNIX-Zeitstempel/Javascript "Date" -Objekt, von dem Sie den zeitzonenunabhängigen UNIX-Zeitstempel erhalten können. – deceze

Antwort

2

ich sein davon aus, dass der tatsächliche Zeitmarkenwert noch korrekt (unabhängig), unabhängig davon, welche Einstellungen/Zeitzone Benutzer das Ende sein würde.

Probleme können auftreten, wenn/wenn Sie serverseitig Datumstrings generieren und somit Zeiten mit Offsets zurückgeben möchten.

Entweder 1. datierte nicht Strings Server-Seite generieren, wenn Sie sich nicht sicher über die Zeitzone Offsets oder 2. Benutzer warnen und stellen Sie sicher, dass sie ihre Zeitzone angeben und dann die Zeitzone erzwingen, wenn Sie die Ausgabe Datum Zeichenfolge aus Zeitstempel

+0

Das Problem ist meistens, dass der gespeicherte Wert ein Unix-Zeitstempel sein muss (offensichtlich). Ich brauche einen Weg, um von der Client-Zeit in einen Unix-Zeitstempel umzuwandeln, und von einem Unix-Zeitstempel muss ich die Zeit in der Zeitzone des Benutzers anzeigen. Ist es wirklich so einfach, nur den Unix-Zeitstempel zu speichern und dann ein DateTime-Objekt zur Anzeige zu verwenden? – Ieuan

+0

yep, es ist so einfach. Wenn Sie Zeiten abhängig von der Computerzeit des Endbenutzers anzeigen möchten, tun Sie es einfach in Javascript. Ich kenne die Details nicht, aber ich würde annehmen, dass es sicherer wäre, die benutzerdefinierte Zeitzone einzustellen/zu speichern. Wenn sich derselbe Benutzer oder jemand anderes von einem Computer mit einer anderen Zeitzone anmeldet, stimmen die angezeigten Zeiten immer noch mit der ursprünglichen Eingabe überein. – kitaps

1

Ein paar Dinge:

  • Sie wahrscheinlich nicht brauchen die Zeitzone des Benutzers zu identifizieren, für das Szenario, das Sie beschreiben, aber wenn man dann haben Sie wieder erkennen, dass eine Zeitzone und ein Offset zwei verschiedene Dinge sind. Siehe "Zeitzone! = Offset" in the timezone tag wiki. Wenn Sie tatsächlich der Meinung sind, dass Sie die Zeitzone des Benutzers benötigen (z. B. "America/Los_Angeles"), wenden Sie sich an this answer.

  • Wenn das eingegebene Datum relativ zur lokalen Zeitzone des Kunden sein soll, müssen Sie entweder ein Objekt Date oder eine Bibliothek wie moment.js in JavaScript verwenden. Verwenden Sie die einzelnen Datums-/Uhrzeitkomponenten aus der Datumsauswahl, um entweder einen Unix-Zeitstempel oder eine nach ISO8601 formatierte Datums-/Uhrzeitzeichenfolge in UTC zu erhalten. Beispiel: "2016-09-02T01:23:45Z"

  • Wenn das eingegebene Datum relativ zu einer anderen Zeitzone sein soll, müssen Sie die tatsächlichen Werte übertragen, die der Kunde ohne Änderung eingegeben hat. Der beste Weg ist im ISO8601-Format ohne Offset. Zum Beispiel "2016-09-02T08:00:00". Analysieren Sie auf der Serverseite diesen Wert und wenden Sie die Zeitzone an, die anwendbar ist.

  • Wenn Sie nur ein Datum auswählen, und nicht eine Zeit, dann sollten Sie wirklich darüber nachdenken, ob eine Zeit anwendbar ist oder nicht. Ist 00:00 wirklich anwendbar? Oder sollte es 24:00 oder 23:59:59.999 sein? Wenn Sie sich nicht um die Zeitzone des Benutzers kümmern, sollten Sie eigentlich keinen Zeitwert zuweisen. Übergeben Sie einfach das Datum.Zum Beispiel: "2016-09-02"

  • Verlassen Sie sich nicht auf die Zeitzoneneinstellung des Servers, um etwas Bestimmtes zu sein. Obwohl PHP Funktionen zum Einstellen einer "Standard" -Zeitzone bietet, sollten Sie versuchen, sie zu vermeiden. Es ist viel sicherer, Zeitzonen für jede Operation explizit anzugeben. Verwenden Sie die Klasse DateTime in PHP, nicht time().

Seien Sie sicher, Daylight saving time and time zone best practices, zu lesen und gründlich für weitere Fragen auf Stackoverflow zu suchen, wie viel von diesem bereits in verschiedenen anderen Fragen beantwortet wurde.

+0

Ich brauche auf jeden Fall Offset- und keine Zeitzonen, um den Benutzern die Zeitzonen anzuzeigen, aber die Wahl des Offsets durch Auswahl ihrer Zeitzone in ihren Profileinstellungen ist viel einfacher für sie, als wenn sie einen Offset eingeben. Danke für die anderen Hinweise. – Ieuan

+0

Seien Sie vorsichtig - Sie können den aktuellen Offset nicht erhalten und annehmen, dass er für alle Zeitpunkte gilt. Viele machen diesen Fehler. Sommerzeit wird in die Quere kommen. –

+0

Aber wenn ich DateTimeZone/DateTime zum Formatieren der Daten verwenden, die in Ordnung sein sollen, richtig? Stellen Sie den Zeitstempel ein, stellen Sie die Zeitzone ein und formatieren Sie? – Ieuan