2017-10-03 2 views
1

Est-il possible de définir l'heure d'été d'un objet DateTime dans Php?Php DateTime sélectionne manuellement l'heure d'été (DST)

J'ai un problème avec les datetimes au moment exact du changement de DST. dans le fuseau horaire Europe/Paris, la date 2016-10-30 02:00:00 existe deux fois (comme cela est le moment exact du changement de l'heure d'été (à 3h du matin, il est 2 heures encore)

Considérons ce code:

$dateString = '2016-10-30 01:30:00'; 
$dateBefore = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTime('Europe/Paris')); 
$dateBefore->setTimeZone(new \DateTimeZone('UTC')); 

$dateString = '2016-10-30 02:30:00'; 
$dateAfter = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTime('Europe/Paris')); 
$dateAfter->setTimeZone(new \DateTimeZone('UTC')); 

$dateBefore est « 2016 -10-29 23:30:00 ' $dateAfter est' 2016-10-30 01:30:00 '

Alors, comment puis-je générer la date' 2016-10-30 00:30:00 'ici?

Est-il possible de faire quelque chose comme ça?

$winterTZ = new DateTime('Europe/Paris'); 
$winterTZ->setDST(false); 
$winterDate = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, $winterTZ); 

$summerTZ = new DateTime('Europe/Paris'); 
$summerTZ->setDST(true); 
$winterDate = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, $summerTZ); 

Merci!

Répondre

0

Comme j'imagine que vous avez vu de vos recherches à ce sujet, la gestion du fuseau horaire est un complicated matter, et même plus lorsque vous faites face à l'heure d'été. Votre cas d'utilisation n'est pas si clair, mais vous pouvez obtenir ce que vous demandez en ajoutant un intervalle d'une heure (ceci est important: pas seulement heures, mais un intervalle de temps) à l'heure. Ensuite, l'instance DateTime prendra en compte l'heure d'été et vous donner encore l'heure correcte (à savoir, pas « sauter » il):

<?php 
$dateString = '2016-10-30 01:30:00'; // start time 
$dateBefore = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTimeZone('Europe/Paris')); 
var_dump($dateBefore); 
$d = clone $dateBefore; 
$d->setTimeZone(new \DateTimeZone('UTC')); 
var_dump($d); // 23:30 

echo PHP_EOL."------".PHP_EOL; 

$dateBefore->add(new DateInterval('PT1H'))->format("Y-m-d H:i:s"); // add one hour without skipping 
var_dump($dateBefore); 
$d = clone $dateBefore; 
$d->setTimeZone(new \DateTimeZone('UTC')); 
var_dump($d); // 00:30 

echo PHP_EOL."------".PHP_EOL; 

$dateString = '2016-10-30 02:30:00'; 
$dateBefore = \DateTime::createFromFormat('Y-m-d H:i:s', $dateString, new DateTimeZone('Europe/Paris')); 
var_dump($dateBefore); 
$dateBefore->setTimeZone(new \DateTimeZone('UTC')); 
var_dump($dateBefore); // 01:30, uses DST 

Demo