4 Stimmen

Zeitstempelvergleich in MySQL und PHP ( UTC, +0000, Zeitzonen )

Ich versuche festzustellen, ob eine Zeichenkette, die das Datum und die Uhrzeit darstellt, die in einem JSON-Twitter-Feed angegeben sind, innerhalb eines Bereichs von Zeitstempelspalten in MySQL liegt.

Hier ist die Beispielzeichenkette:

'Sat, 31 Oct 2009 23:48:37 +0000',

El +0000 nach der API ( created_at ) zeigt, dass es sich tatsächlich um UTC . Jetzt verwende ich strtotime y date nur um die Uhrzeit zu bestätigen. Mit:

$t = 'Sat, 31 Oct 2009 23:48:37 +0000';
$timestamp = strtotime($t);

echo date('M d Y H:m:s', $timestamp);

Ich bekomme Oct 31 2009 19:10:37 . Wenn ich die +0000 Ich bekomme Oct 31 2009 23:10:37 . Der Unterschied zwischen einer +0000 und ohne sie 4 Stunden. Ich vermute, dass es an meiner lokalen Zeitzone liegt (Maryland, USA = America/New_York ) und das weicht natürlich von der UTC ab.

Ich bin mir nicht ganz sicher, ob ich die +0000 oder sie zu verwenden, wenn ich versuche zu bestimmen, ob dieser Zeitstempel innerhalb des Bereichs der beiden in meiner Datenbank gespeicherten Zeitstempel liegt, die sind 2009-10-30 23:16:38 y 2009-11-25 12:00:00 . Ich fühle mich dumm und ein wenig verwirrt jetzt, wenn ich diese Zeitstempel die JJJJ-MM-TT H:M:S kam von einem Javascript Datum Zeit Picker, ein Beispiel Format ist 10/31/2009 11:40 am und ich verwende STR_TO_DATE wie folgt:

STR_TO_DATE("10/31/2009 11:40 am", "%m/%d/%Y %l:%i %p")'),

Sollte ich die +0000 oder sie abnehmen? Gedanklich aussteigt

5voto

deceze Punkte 489288

Sie sollten natürlich die Zeitzoneninformationen beibehalten, vorausgesetzt, Sie sind auch richtig Einstellung der Serverzeitzone . Was nützt es sonst, wenn alle Zeitvergleiche 4 Stunden daneben liegen :o)

Um die Zeit zu vergleichen, sollten Sie sie als UNIX-Zeitstempel belassen, d.h. das Ergebnis von strtotime .

$twitterTS    = strtotime('Sat, 31 Oct 2009 23:48:37 +0000');
$localStartTS = strtotime('Sat, 31 Oct 2009 19:00:00'); // timezone is -0400 implicitly
$localEndTS   = strtotime('Sat, 31 Oct 2009 20:00:00');

if ($localStartTS <= $twitterTS && $twitterTS <= $localEndTS) {
    // twitter timestamp is within range
}

Zur Klarstellung: Bevor Sie Zeiten aus verschiedenen Zeitzonen vergleichen, stellen Sie sicher, dass sie alle in dieselbe Zeitzone umgerechnet werden. Ein Vergleich der Londoner Zeit 20:00 Uhr mit der New Yorker Zeit 20:00 Uhr ohne Zeitzoneninformation führt zu falschen Ergebnissen. strtotime konvertiert alle Zeiten in Ihre lokale Zeitzone; wenn die Zeitzoneninformation in der Eingabe vorhanden ist, wird sie beachtet und die Zeit entsprechend konvertiert, andernfalls wird angenommen, dass die Zeit bereits lokalisiert ist. Wenn alle Zeiten in Ihrer Datenbank lokal sind, sollten Sie unbedingt sicherstellen, dass Sie alle Zeitstempel, die Sie mit ihnen vergleichen wollen, lokalisieren.
Eine alternative Strategie wäre, alle Zeiten vor dem Speichern oder Vergleichen immer in UTC umzurechnen.

Suchen Sie sich etwas aus, aber tun Sie es konsequent.

0voto

UJ. Punkte 149

In PHP können Sie einfach die substring-Funktion verwenden, um die json-Twitter-Zeit in ihre Bestandteile zu zerlegen, und zwar so

//'Sat, 31 Oct 2009 23:48:37 +0000'
$hour = substring($jsontime,18,2);
$minute = substring($jsontime,22,2);
...

$phpDatetime mktime($hour,$minute,$second,$month,$day,$year);

Von daher denke ich, dass Sie es bereits haben. Vergessen Sie nicht, für GMT Unterschiede anzupassen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X