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

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

Rekommendera Poster

Postad (redigerade)

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)

Redigerad av Niss3

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)

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.

Redigerad av Niss3

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)
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 :(

Redigerad av Niss3

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

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>";

Dela detta inlägg


Länk till inlägg
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);

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser
Postad (redigerade)

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);
Redigerad av Mr Andersson

Dela detta inlägg


Länk till inlägg
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;

Dela detta inlägg


Länk till inlägg
Dela på andra webbplatser

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Skapa ett nytt konto på vårt forum. Det är lätt!

Registrera ett nytt konto

Logga in

Redan medlem? Logga in här.

Logga in nu



×
×
  • Skapa nytt...