2010-11-28 11 views
4

Mir wird gesagt, dass diese unten Methode der Berechnung der lokalen Zeit des Benutzers manchmal nicht funktioniert. Was ist der beste Weg, dies in PHP zu tun? Wie geht's?Wie gehen Sie mit der Zeitzonen-Differenzberechnung in PHP um?

public function getTimeOffset ($time) { 
    $this->_cacheTimeOffset(); 
    if ($this->timeOffsetExecuted) { 
     $d = date("O"); 
     $neg = 1; 

     if (substr($d, 0, 1) == "-") { 
      $neg = -1; 
      $d = substr($d, 1); 
     } 

     $h = substr($d, 0, 2)*3600; 
     $m = substr($d, 2)*60; 

     return $time + ($neg * ($h + $m) * -1) + (($this->timeOffset + $this->getDstInUse()) * 3600); 
    } 
    return $time; 
} 

Antwort

2

Verwenden Sie die Datetime-Erweiterung wie DateTime::getOffset,
oder DateTimeZone::getOffset

Einige Länder haben könnten mehrere Zeitzone-Update durchführen,
diese Methode DateTimeZone::getTransitions der Übergang Geschichte

+0

Ich erlaube derzeit einem Benutzer, ihre Zeitzone in ihrem Profil anzugeben. Willst du damit sagen, dass ich es nur dynamisch über PHP ziehen kann und nicht ihre Zeitzone fragen muss? – Webnet

+1

@Webnet - Sie müssen noch Benutzer, um ihre aktuelle Zeitzone in ihrem Profil zu platzieren. Wahrscheinlich können Sie eine Liste der Zeitzone angeben und den Benutzer auswählen lassen. 'DateTimeZone :: listIdentifiers' kann eine vollständige Liste der unterstützten Zeitzonen bereitstellen, Details - http://www.php.net/manual/en/datetimezone.listidentifiers.php – ajreal

-1

Eine schnelle Lösung offenbaren:

<?php echo date('g:i a', strtotime("now + 10 hours 30 minutes")); ?> 
+0

Dies setzt nur die Zeitformatierung und bezieht sich nicht auf die Zeit Zonen überhaupt. – Webnet

0

Gerade beantwortet eine sehr ähnliche Frage over here. Ich empfehle Ihnen, das herauszufinden; Ich erklärte die zwei bevorzugten Möglichkeiten, Zeitzonen-Offset-Berechnung (mit einfachen Mathematik, und dann die Klassen datetimezone und datetime) ziemlich gründlich zu tun.

wäre der erste Weg der einfachste (und logischste) seinen Weg, und das zu Speichern ist ihre Offset (wenn Sie bereits es haben, das ist) und multiplizieren Sie diese mit 3600 (1 Stunde in Sekunden), und fügen Sie dann den Wert dem aktuellen Unix-Zeitstempel hinzu, um die letzte Zeit von zu erhalten.

Eine weitere Möglichkeit ist die Verwendung der Klassen DateTime und DateTimeZone. Wie diese beiden Klassen arbeiten, wie here gezeigt, ist, dass Sie zwei DateTimeZone Objekte, mit Zeitzone und eine mit ihnen; Erstellen zwei DateTime Objekte mit den ersten Parameter "now" und die zweite ist ist, um die Bezugnahme auf die DateTimeZone Objekte über (jeweils); und rufen dann die getOffset Methode auf Ihre Zeitzone Objekt übergeben ihre Zeitzone Objekt als ersten Parameter, schließlich bekommen Sie den Offset in Sekunden, die kann auf den aktuellen Unix- Zeitstempel hinzugefügt werden, um die Zeit zu erhalten, Ihr Job muss ausgeführt werden.

1
date('Z'); 

gibt die in Sekunden Offset UTC.

Verwandte Themen