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?
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;
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
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é.