2013-08-29 5 views
0

Tout d'abord, je me bats depuis deux jours sans arrêt pour comprendre ce dont j'ai besoin avec ce code et toujours coincé dans le carré. Donc, je reviens ici et j'espère que quelqu'un jettera une lumière sur cette question que ma tête est en train d'exploser.DateTime dans PHP renvoie la valeur incorrecte?

ce que je dois faire est de faire la différence entre deux valeurs en utilisant DateTime en PHP.

La première valeur est 00:00 qui est une valeur fixe et ne changera jamais.

la deuxième valeur est $ offset/3600 * 1, ce qui correspond à un décalage horaire entre deux fuseaux horaires.

le code J'utilise est le suivant:

<?php 
if (0 > $offset) 
{ 
// set an object with the current date 
$date = new DateTime(); 
$date->setTime(00, 00); 

// the second date 
$date2 = new DateTime($offset/3600 * 1); 

// apply the diff() method, getting a DateInterval object ($diDiff) 
$diDiff = $date->diff($date2) ; 
} 
echo $diDiff->format("H:i"); 
?> 

le code ci-dessus de l'écho ceci: H:i et rien d'autre!

qu'est-ce que je fais mal?

Merci d'avance.

EDIT:

Le décalage $ vient d'ici:

if(isset($_POST['submit'])) 
{ 
    //be sure to validate and clean your variables 
    $timezone1 = htmlentities($_POST['timezone1']); 
    $timezone2 = htmlentities($_POST['timezone2']); 

    //then you can use them in a PHP function. 
    function get_timezone_offset($origin_tz, $remote_tz) { 
    $timezone1 = new DateTimeZone($origin_tz); 
    $timezone2 = new DateTimeZone($remote_tz); 

    $datetime1 = new DateTime("now", $timezone1); 
    $datetime2 = new DateTime("now", $timezone2); 

    $offset = $timezone1->getOffset($datetime1) - $timezone2->getOffset($datetime2); 
    return $offset; 

} 

$offset = get_timezone_offset($timezone1, $timezone2); 

} 

?> 

timezone1 et timezone2 sont deux listes déroulantes avec php et les fuseaux horaires à l'intérieur, ils sont identiques.

comme ceci:

<select name="timezone2" id="timezone2" class="timezone2"> 
         <?php 
        foreach($options as $key => $value) 
        { 
         echo '<option value="'. $key .'" label="'. $value .'">'.$value.'</option>'; 
        } 
        ?> 
<option value="Africa/Abidjan" label="Abidjan">Abidjan</option> 
<option value="Africa/Accra" label="Accra">Accra</option> 
<option value="Africa/Addis_Ababa" label="Addis Ababa">Addis Ababa</option> 
<option value="Africa/Algiers" label="Algiers">Algiers</option> 
<option value="Africa/Asmara" label="Asmara">Asmara</option> 

</select> 
+0

Où définissez-vous $ offset? – Tchoupi

+0

le décalage $ est défini en haut de la page et lorsque l'utilisateur choisit deux emplacements/fuseaux horaires. –

+0

Au départ, vous avez 'if (0> $ offset)', voulez-vous dire si 'zero est supérieur à $ offset'? – Jason

Répondre

2

Avec l'objet DateInterval, vous have to prefix toutes les lettres de mise en forme avec le caractère "%". Donc, utilisez:

echo $diDiff->format("%H:%i"); 

Bonne chasse!

+0

Ok, Brian, ça a fonctionné d'une certaine façon mais la valeur que ça rapporte est fausse! c'est-à-dire la différence de temps (décalage en dollars) entre Londres et New York est de -5 heures. donc si Londres est 00:00, le New York devrait être 19:00 mais la valeur qui est montrée maintenant avec mon code est 20:35. est-ce à cause de l'heure d'été? –

+0

Eh bien, c'est peut-être à cause de la façon dont vous faites les fuseaux horaires. D'où vient le $ offset? –

+0

En général, ce que je fais est de tout convertir en temps Unix, faire tous les calculs dont j'ai besoin, et le sortir en format date() formaté pour le fuseau horaire. Mais alors au moins tous les calculs sont universels pour le serveur. –

Questions connexes