web-dev-qa-db-fra.com

PHP trouver la différence entre deux dates

J'essaie d'obtenir la différence entre deux dates-temps et de la renvoyer sous la forme d'une variable datetime. J'ai trouvé des exemples en utilisant diff mais je n'arrive pas à réussir.

$timein = date("Y-m-d H:i:s");
$timeout = date("Y-m-d 20:00:00");
$totaltime = $timein->diff($timeout);

Cependant $totaltime enregistre 0000-00-00 00:00:00 dans ma base de données. Est-ce parce que je ne formate pas ma variable totaltime?

17
Staleyr

Je ne suis pas sûr du format que vous recherchez dans votre différence mais voici comment le faire en utilisant DateTime

$datetime1 = new DateTime();
$datetime2 = new DateTime('2011-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years %m months %a days %h hours %i minutes %s seconds');
echo $elapsed;
50
John Conde

Vous pouvez simplement utiliser le diff et le format datetime pour calculer la différence.

<?php
$datetime1 = new DateTime('2009-10-11 12:12:00');
$datetime2 = new DateTime('2009-10-13 10:12:00');
$interval = $datetime1->diff($datetime2);
echo $interval->format('%Y-%m-%d %H:%i:%s');
?>

Pour plus d’informations sur le format DATETIME, voir: ici
Vous pouvez modifier le format d'intervalle comme vous le souhaitez.

Ici est l'exemple de travail

P.S. Ces fonctionnalités ( diff () et format () ) fonctionnent avec> = PHP 5.3.0 uniquement

3
Nishu Tayal

John Conde applique toutes les procédures appropriées dans sa méthode, mais ne satisfait pas la dernière étape de votre question, qui consiste à formater le résultat selon vos spécifications.

Ce code ( Demo ) affichera la différence brute, exposera le problème pour essayer de formater immédiatement la différence brute, affichera mes étapes de préparation et présentera enfin le résultat correctement formaté:

$datetime1 = new DateTime('2017-04-26 18:13:06');
$datetime2 = new DateTime('2011-01-17 17:13:00');  // change the millenium to see output difference
$diff = $datetime1->diff($datetime2);

// this will get you very close, but it will not pad the digits to conform with your expected format
echo "Raw Difference: ",$diff->format('%y years %m months %d days %h hours %i minutes %s seconds'),"\n";

// Notice the impact when you change $datetime2's millenium from '1' to '2'
echo "Invalid format: ",$diff->format('%Y-%m-%d %H:%i:%s'),"\n";  // only H does it right

$details=array_intersect_key((array)$diff,array_flip(['y','m','d','h','i','s']));

echo '$detail array: ';
var_export($details);
echo "\n";

array_map(function($v,$k)
    use(&$r)
    {
        $r.=($k=='y'?str_pad($v,4,"0",STR_PAD_LEFT):str_pad($v,2,"0",STR_PAD_LEFT));
        if($k=='y' || $k=='m'){$r.="-";}
        elseif($k=='d'){$r.=" ";}
        elseif($k=='h' || $k=='i'){$r.=":";}
    },$details,array_keys($details)
);
echo "Valid format: ",$r; // now all components of datetime are properly padded

Sortie:

Raw Difference: 6 years 3 months 9 days 1 hours 0 minutes 6 seconds
Invalid format: 06-3-9 01:0:6
$detail array: array (
  'y' => 6,
  'm' => 3,
  'd' => 9,
  'h' => 1,
  'i' => 0,
  's' => 6,
)
Valid format: 0006-03-09 01:00:06

Maintenant, pour expliquer ma préparation de valeur datetime:

$details prend l'objet diff et le transforme en tableau . array_flip (['y', 'm', 'd', 'h', 'i', 's']) crée un tableau de clés qui sera utilisé pour supprimer toutes les clés non pertinentes de (array)$diff en utilisant array_intersect_key () .

Ensuite, l’utilisation de array_map () my met fin à chaque valeur et clé dans $details, compense son côté gauche à la longueur appropriée avec 0 et concatène la chaîne $r (résultat) avec les séparateurs nécessaires pour se conformer au format datetime demandé.

0
mickmackusa