2017-06-05 3 views
0

Ich muss erkennen, wenn ein Zeitstempel Sommerzeit ist oder nicht.Wie funktioniert die Sommerzeit in php (Unterschied zwischen php und hhvm)?

ich diesen Code bin mit der Funktionalität zu testen:

<?php 
date_default_timezone_set('Europe/Berlin'); 

$timestamp = $baseTimestamp = 1509234900; // Sunday, 29 October of 2017 1:55:00 GMT+02:00 DST 
$date = (new DateTime)->setTimestamp($baseTimestamp); 

echo "DateTime\t\t| Is in summer \t| Minutes passed\n"; 

for($i = 0; $i < 70; $i++) { 
    $date = (new DateTime)->setTimestamp($timestamp); 
    echo $date->format("Y-m-d H:i:s \t|I") . "\t\t| " . ($timestamp - $baseTimestamp)/60 . "\n"; 
    $timestamp = $timestamp + 60; 
} 

https://3v4l.org/dqNlK

Arbeiten mit Europe/Berlin, ich habe, dass im März gesehen, als um 2.00 wir von Winter passieren bis Sommer, php löst es richtig, aber dann im Oktober, wenn es von Sommer zu Winter um 3.00 Uhr zurückkommen soll, funktioniert es nicht wie erwartet.

In diesem Fall haben wir zwei Zeitstempel, die der gleichen Stunde entsprechen (bei 3 ist wieder 2), aber der Zeitstempel ist einzigartig, also für 2,00 muss es einen Zeitstempel in der Sommerzeit und einen anderen in der Winterzeit geben .

Mit hhvm, zeigt es den richtigen Wert, aber normale PHP-Interpreter zeigen, dass nicht im Sommer für beide 2.00 (der erste, der 2 Uhr morgens ist und der zweite, wenn um 3 Uhr ist wieder 2 Uhr. Dies ist die eine, die sagen sollte, ist nicht im Sommer mehr)

+1

tun wird ... das sieht eigentlich wie ein Bug zu mir. – CD001

+0

Ja, ich denke es ist. Versuchen Sie Folgendes: echo (neue DateTime) -> setTimestamp (1509235200) -> getTimestamp(); Und Sie werden sehen, dass es einen anderen Zeitstempel ausgibt. HHVM tut es nicht. – Noogic

Antwort

0
function isSummer($timestamp) { 
    $date = (new DateTime)->setTimestamp($timestamp); 

    if ($date->format('I') == 1) { 
     return true; 
    } 

    return ($date->getTimestamp() > $timestamp); 
} 

Ich denke, das den Trick

+0

Dies funktioniert nur, wenn der Zeitstempel niemals ein DateTime-Objekt durchlaufen hat – Noogic

Verwandte Themen