John Conde wykonuje wszelkie odpowiednie procedury w swojej metody, ale nie spełnia końcowy etap w swoim pytaniu, które ma sformatuj wynik zgodnie ze swoimi specyfikacjami.
Ten kod (Demo) pokaże różnicę surowe, wystawiać problemów z próby natychmiast formatować różnicę surowe, wyświetlać moje kroki przygotowawcze, a wreszcie przedstawić prawidłowo sformatowany wynik:
$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
wyjściowa:
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
teraz, aby wyjaśnić moje przygotowanie wartości datetime:
$details
trwa th e diff object i rzuca to jako tablicę. tworzy tablicę kluczy, które zostaną użyte do usunięcia wszystkich nieistotnych klawiszy z (array)$diff
przy użyciu array_intersect_key().
Następnie za pomocą array_map() moja metoda iteracje każdej wartości i kluczowe w $details
, klocki z lewej strony do odpowiedniej długości z 0
„s, a Łączy (wynik) łańcuch z niezbędnymi separatorów $r
za zgodne z wymaganym formacie datetime.
date() podaje ciągi znaków. Nie można obliczyć różnic z ciągami. – Misch