Just nu i M3-nätverket
Gå till innehåll

Jämför två tider i PHP från MySQL


Niss3

Rekommendera Poster

Hej!

 

Jag hämtar två tider från min MySQL databas:

 

$starttime har värdet: 2015-02-28 12:38:46.

$time har värdet 2015-03-01 12:38:54.

 

Hur kan jag få ut "förfluten" tid emellan dessa två tider?

 

Jag har lekt lite med DateTime och Date_Diff, men det har mestadels resulterat i "FatalErrors" som jag misstänker beror på att formatet från MySQL inte kan hanteras av PHP direkt?

 

När jag ändå har uppe frågan. Hur skulle jag kunna jämföra $time1, $time2 och $time3 för att få ut den tid som är "först" av de tre tiderna?

(Alltså, inte vilken förfluten tid som är minst, utan helt enkelt vilken av time1,2,3 som är först i tiden)

Länk till kommentar
Dela på andra webbplatser

Jag misstänker att det första problemet är hur jag konverterar MySQL tiden till ett format PHP klarar av.

 

Provade precis:

$dtime = new DateTime($time);
print $dtime->format("Y-m-d H:i:s");

Fick detta:

Fatal error: Uncaught exception 'Exception' with message 'DateTime::__construct(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.'

-edit-

 

date_default_timezone_set('Europe/Stockholm');

Fixade det problemet.

Länk till kommentar
Dela på andra webbplatser

Jag har lyckats få ut skillnaden hyffsat:
 
date_default_timezone_set('Europe/Stockholm');
$stime = new DateTime($starttime);
$etime = new DateTime($time);
$interval = date_diff($stime, $etime);


echo $interval->format('%y-%m-%d %h:%m:%s');
 
f36792bcb6.png
 
Nu funderar jag på hur jag kan snygga till Time Elapsed så att alla noller försvinner.. undrar om jag måste göra if-satser som kollar varje..
 
Har ni förslag på hur jag kan förbättra detta och ta reda på vilken av tiderna som var färdig först, eller ännu bättre, organisera dem som 1:a plats, 2:a plars osv, hade det varit väldigt uppskattat!
 
Provade nyss att hoppa över att räkna ut differensen mellan daturm och istället räkna ut skillnaden i minuter direkt;
echo round(abs(strtotime('$stime') - strtotime('$etime')) / 60,2);

Det fungerade inte :(

Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Ser bra ut. Som tips kan jag tillägga att du har direkt tillgång till de olika delarna i tiden.

 

Exempelvis:

echo "Dagar: ".$interval->d."<br>";
echo "Timmar: ".$interval->h."<br>";
echo "Minuter: ".$interval->i."<br>";
echo "Sekunder: ".$interval->s."<br>";
Länk till kommentar
Dela på andra webbplatser

Jag provade precis:

$datetime1 = strtotime("2011-10-10 10:00:00");
$datetime2 = strtotime("2011-10-10 10:45:00");
$interval  = abs($datetime2 - $datetime1);
$minutes   = round($interval / 60);
echo 'Diff. in minutes is: '.$minutes; 

Men när jag applicerar det till min kod larmar det på "Warning: strtotime() expects parameter 1 to be string";

$stime = new DateTime($starttime);
$etime = new DateTime($time);
$stimeb = strtotime($stime);
$etimeb = strtotime($etime);
$intervalb  = abs($stimeb - $etimeb);
$minutes   = round($intervalb / 60);
Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Tid/datum-hanteringen i php är lite förvirrande. Det finns två sätt att hantera detta.

 

1. Enligt unix-format, tidsvariablen är då ett långt heltal (antal sekunder sedan 1970 eller nåt sånt). strtotime arbetar på det sättet. Det ser du om du kör en var_dump($datetime1), i mitt fall blir det 1318233600.

 

2. Med tiddatum-objekt. DateTime() arbetar på det sättet. Då kommer man åt varje del av tiden/datumen direkt som attribut, tex $tiden->i . 

 

Det du försöker i din kod, är att ta ett tidsobjekt ($stime) som parameter till strtotime(), men den funktionen vill ha datum som sträng och returnerar unix-format. 

 

 

Detta borde funka:

$stimeb = strtotime($starttime);
$etimeb = strtotime($time);
$intervalb  = abs($stimeb - $etimeb);
$minutes   = round($intervalb / 60);
Länk till kommentar
Dela på andra webbplatser

Tack Mr Andersson! Nu har jag två metoder som fungerar lika bra :)

Metod 2 var dock mycket snyggare!!

 

Metod 1:

 

$stime = new DateTime($starttime);
$etime = new DateTime($time);
$interval = date_diff($stime, $etime);
$hours   = $interval->format('%h'); 
$minutes = $interval->format('%m');
$secounds = $interval->format('%s');
$days = $interval->format('%d');
echo ($days * 86400 + $hours * 3600 + $minutes * 60 + $secounds);
 
Metod 2:
 
$stimeb = strtotime($starttime);
$etimeb = strtotime($time);
$intervalb  = abs($stimeb - $etimeb);
$minutesb  = round($intervalb);
echo $minutesb;
Länk till kommentar
Dela på andra webbplatser

Mr Andersson

Japp. Beroende på vad man ska göra med datum/tid så är de olika sätten bra sitt sätt, bara man är medveten om skillnaden.

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...