2013-03-28 19 views
9

Próbuję uzyskać różnicę między dwoma datetimes i zwrócić go jako datetime. Znalazłem przykłady przy użyciu diff, ale nie mogę tego naprawić.PHP znaleźć różnicę między dwoma datetimes

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

Jednak $ totalTime dzienniki "0000-00-00 00:00:00" do mojego DB. Czy to dlatego, że nie formatuję zmiennej totaltime?

+0

date() podaje ciągi znaków. Nie można obliczyć różnic z ciągami. – Misch

Odpowiedz

35

Nie jestem pewien, jaki format szukasz w swojej różnicy, ale oto jak to zrobić za pomocą 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; 
+0

zgłasza błąd "Błąd krytyczny: wywołanie niezdefiniowanej metody DateTime :: diff()" – Staleyr

+0

Jaką wersję PHP używasz? –

+0

5.4, w netbeans – Staleyr

1

można po prostu użyć diff i format datetime do obliczenia różnicy.

<?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'); 
?> 

Aby uzyskać więcej informacji o formacie DATETIME, patrz: here
Można zmienić interwał formatu w sposób chcesz.

Here jest przykładem pracy

PS: Te cechy ( diff() i format()) pracować z PHP> = 5.3.0 tylko

+1

Łącze kodeków jest zerwane. – pal4life

+0

Dochód.Nie zapewnia to wyniku w formacie wymaganym przez PO. – mickmackusa

-1
<?php 
$val1 = '2014-04-10 11:34:09'; 
$val2 = '2015-04-10 10:56:15'; 
$result1 = (explode(' ', $val1)) ; 
$result2 = (explode(' ', $val2)) ; 
$date1= new DateTime($result1[0]); 
$date2=new DateTime($result2[0]); 
$diffdate=date_diff($date1,$date2); 
$difftime = strtotime($result1[1]) - strtotime($result2[1]); 
$dates=$diffdate->format("%R%a days"); 
echo $dates; 
echo $difftime; 
?> 
+0

Podczas gdy ten fragment kodu może rozwiązać pytanie, [w tym wyjaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) z kodu naprawdę pomaga poprawić jakość twojego postu. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – Rizier123

+0

kod, aby znaleźć różnicę między datetime –

+1

Downvote. Ta nowsza odpowiedź nie jest lepsza od obecnie akceptowanej odpowiedzi i nie zawiera żadnego wyjaśnienia w samej odpowiedzi. Nie zapewnia wyniku, o który pyta. Jest to odpowiedź o niskich kwalifikacjach i wymaga edycji lub usunięcia. – mickmackusa

-1
<?php 
$value='20140203113405'; 
$val='20150203113410'; 

$val1=str_split($val,2); 
$dateval1=$val1[0].$val1[1]."-".$val1[2]."-".$val1[3]; 
$timeval1=$val1[4].":".$val1[5].":".$val1[6]; 

$val2=str_split($value,2); 
$dateval2=$val2[0].$val2[1]."-".$val2[2]."-".$val2[3]; 
$timeval2=$val2[4].":".$val2[5].":".$val2[6]; 

$date1=new DateTime($dateval1); 
$date2=new DateTime($dateval2); 
$diffdate=date_diff($date1,$date2); 
$dates=$diffdate->format("%a days"); 
$difftime = strtotime($timeval1) - strtotime($timeval2); 
echo $dates; 
echo $difftime."seconds"; 
?> 
+2

Ten fragment kodu może rozwiązać pytanie, [w tym objaśnienie] (http://meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) poza kodem naprawdę pomaga poprawić jakość twojego postu. Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. Proszę również starać się nie tłumić kodu za pomocą komentarzy wyjaśniających, co zmniejsza czytelność zarówno kodu, jak i objaśnień! – Rizier123

+0

Próbuję uzyskać różnicę datetime w tym formacie –

+0

Downvote. Ta nowsza odpowiedź nie jest lepsza od obecnie akceptowanej odpowiedzi i nie zawiera żadnego wyjaśnienia w samej odpowiedzi. Nie zapewnia wyniku, o który pyta. Jest to odpowiedź o niskich kwalifikacjach i wymaga edycji lub usunięcia. Zamiast zaśmiecać stronę z wieloma odpowiedziami niskiej jakości, opublikuj tylko jedną odpowiedź (najlepiej) i usuń resztę. – mickmackusa

0

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.

Powiązane problemy