Question

J'essaie de calculer le nombre de jours entre deux jours, mais je rencontre des problèmes avec l'heure d'été. Voici mon code:

function date_diff($old_date, $new_date) {
    $offset = strtotime($new_date) - strtotime($old_date);
    return $offset/60/60/24;
}

Fonctionne correctement tant que les jours correspondent à la même période d'heure d'été:

echo date_diff('3/15/09', '3/18/09'); // 3

Mais pas s'ils sont plus éloignés l'un de l'autre:

echo date_diff('11/15/08', '3/18/09'); // 122.95833333333

Je veux un nombre pair de jours et ne me soucie pas de l'heure d'été. Je suppose que je pourrais arrondir le résultat, mais cela semble kludgy. Y a-t-il un meilleur moyen (facile)? Je ne veux pas avoir à écrire toute une journée d'analyse et de calcul, d'éviter les années bissextiles si je peux l'éviter.

(Remarque: cela doit fonctionner sous php 5.1.6, donc certaines fonctionnalités de date dans 5.3 pourraient ne pas être disponibles.)

Plus d'infos: je vais prendre l'offset et l'ajouter à d'autres dates figurant dans une base de données, et je souhaite que seule la partie jour change, et non la partie heure. Quoi qu'il en soit, l'arrondir ne fonctionnera pas, de toute façon, car lorsque je le fais, l'ajouter disparaît d'une heure dans l'autre sens. Peut-être y at-il une meilleure approche de l’ensemble du problème ...

Était-ce utile?

La solution

vous pouvez utiliser http://ca3.php.net/date_default_timezone_set pour définir le fuseau horaire GMT donc il n'y aura pas de décalage.

Vous pouvez également ajouter manuellement un décalage à l'aide de la date('I',$timetamp)

.
if ( date("I") == 1 ) {      // "WE ARE MDT";  
        $timeZone = "MDT";  
} else {  
        $timeZone = "MST";  
}  

Autres conseils

Forcer les dates à vivre dans un fuseau horaire sans heure d'été, GMT / UTC:

function date_diff($old_date, $new_date) {
  $offset = strtotime($new_date . " UTC") - strtotime($old_date . " UTC");
  return $offset/60/60/24;
}

echo date_diff('3/15/09', '3/18/09'); // 3
echo date_diff('11/15/08', '3/18/09'); // 123

Vous pouvez forcer l'arrondissement dans une direction spécifique en utilisant floor() ou ceil() .

J'ai essayé le code 'UTC' ci-dessus. Cela n'a pas fonctionné pour moi. Je vais avoir des valeurs décimales.

Lorsque la date et l'heure d'été sont comprises dans l'intervalle de dates, la partie décimale en série de différence est inférieure ou égale à 0,5. lorsque la plage de dates a l'heure d'été 3/15, la valeur décimale est > .5 à la tombée de la nuit décimale & Lt; .5. je viens donc de mettre la différence série dans une fonction round () et d’obtenir tous les nombres dont j'ai besoin pour le nombre de jours.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top