2013-03-31 4 views
1

Début de l'apprentissage du php dateTime & dateTimezone objects. En supposant un serveur dans US/Eastern et en créant une heure dans un autre fuseau horaire, l'objectif est de convertir et de stocker l'heure (c'est-à-dire Londres) sur le serveur (US/Eastern), au moment du serveur. En utilisant ce code:Comment calculer le décalage correct?

$runTime = '2013-04-10 07:45:00'; 
$serverTimezone = new DateTimeZone ('US/Eastern'); 
$checkinTimezone = new DateTimeZone ('Europe/London'); 
$checkinTime = new DateTime ($runTime, $serverTimezone); 

$offset = $serverTimezone -> getOffset ($checkinTime); 

echo "<br/><pre>"; 
echo 'London: ' . date ('Y-m-d H:i', $checkinTime -> format ('U')) . "<br/>"; 
echo "<br/>offset: " . $offset . "<br/>"; 
echo 'Local: ' . date ('Y-m-d H:i', $checkinTime -> format ('U') + $offset); 

-14400 est toujours retourné, wether avant ou après aujourd'hui (l'Europe passe à l'heure d'été plus tôt aujourd'hui). Dans un aha moment, j'ai découvert la documentation pour getOffset dit Returns the timezone offset from GMT.

Existe-t-il un moyen simple de convertir cette heure en US/Eastern? Est-ce que je dois aller dans le getTransitions, trouver le jour DST commence et faire le calcul manuellement? Cela n'a d'importance que le premier jour de chaque changement de printemps/automne.

+2

Vous voulez presque toujours d'ignorer le fuseau horaire du serveur. Commencez à partir d'une heure UTC, puis convertissez dans votre fuseau horaire cible. Je ne suis pas un développeur PHP, donc je ne peux pas offrir une solution codée, mais ce sont les meilleures pratiques avec les fuseaux horaires en général. –

+0

@MattJohnson Excellente idée pour commencer avec UTC et convertir. C'est en grande partie la question ... – David

Répondre

0
$fromZone = new DateTimeZone('US/Eastern'); 
$toZone = new DateTimeZone('UTC'); // assuming the server is going to be UTC going forwards 

$dt = new DateTime('2013-04-02 10:00:00', $fromZone); 
$dt->setTimezone($toZone); 
echo $dt->format('Y-m-d H:i:s'); 

Sorties: 2013-04-02 14:00:00.

Modifiez les fuseaux horaires selon les besoins.


Si vous faites affaire avec seulement les horodateurs, vous pouvez simplifier les choses un peu:

$fromZone = new DateTimeZone('US/Eastern'); 
$dt = new DateTime('2013-04-02 10:00:00', $fromZone); 
echo $dt->getTimestamp(); 

Sorties: 1364911200

Questions connexes