Avatar billede coolzone Nybegynder
20. november 2004 - 12:24 Der er 20 kommentarer og
2 løsninger

Tid subtraktion

Hej :-)

Hvis man har to variabler, hver med sin 'datetime' f.eks.
$tid1="2004-11-02 15:30:00"
$tid2="2004-11-02 16:45:00"

Og man ønsker at trække din sidste tid fra den første $tid2-$tid1

Hvordan formattere man så man for det rigtige resultat? Og resultatet skal være formatteret tilbage til "01:15:00"

Jeg har bokset med det og googlet med jeg har ikke lige kunnet finde et eksempel der passer med mit.
Avatar billede googolplex Novice
20. november 2004 - 12:41 #1
Avatar billede hmortensen Nybegynder
20. november 2004 - 12:41 #2
Vil tro den her kan klare det:

$tid1="2004-11-02 13:00:00";
list ($date1, $time1) = explode(' ', $tid1);
list ($Y1, $m1, $d1)  = explode('-', $date1);
list ($H1, $i1, $s1)  = explode(':', $time1);

$tid2="2004-11-02 16:45:00";
list ($date2, $time2) = explode(' ', $tid2);
list ($Y2, $m2, $d2)  = explode('-', $date2);
list ($H2, $i2, $s2)  = explode(':', $time2);

$diff = (mktime($H2, $i2, $s2, $m2, $d2, $Y2) - mktime($H1, $i1, $s1, $m1, $d1, $Y1)) - 3600;
echo date("H:i:s", $diff);
Avatar billede hmortensen Nybegynder
20. november 2004 - 12:42 #3
Men hvis det kommer fra en database, kan det klares direkte der, meget lettere.
Avatar billede dennismp Nybegynder
20. november 2004 - 12:48 #4
Hvis der er under 24 timers forskel, så tror jeg at:

SELECT date_format(tid2-tid1,'H:i:s') as duration .. FROM ...

hvis der kan være mere end 24 timer

SELECT UNIX_TIMESTAMP(tid2) - UNIX_TIMESTAMP(tid1) as duration FROM ..

Så får du det i sekunder.. Så skal det bare formatteres - det kan gøres på et par linjer - eller du kan nuppe min rutine:

http://dennis.moellegaard.dk/php/sec2text.php?source=1 (brug source=2 - hvis du bliver træt af linjenummerne)
Avatar billede dennismp Nybegynder
20. november 2004 - 12:49 #5
Damn - bare fordi man henter mogenmad, så er ens svar for sent :)
Avatar billede hmortensen Nybegynder
20. november 2004 - 12:50 #6
Men du skrev det jeg ville skrive, hvis det kom fra en mysql database, så nu skulle den være sikker :)
Avatar billede dennismp Nybegynder
20. november 2004 - 12:53 #7
Ja, det er klart det nemmeste at lade MySQL om den slags.  Beklager hvis jeg stjal din svar :).

Han skriver jo "datetime"-felter, så jeg antog der betød at det var fra en MySQL database.
Avatar billede hmortensen Nybegynder
20. november 2004 - 12:55 #8
Ja, havde jeg bare ik lige forstået sådan.
Avatar billede googolplex Novice
20. november 2004 - 13:00 #9
<?php

$time1 = '2004-11-02 15:30:00';
$time2 = '2004-11-02 16:45:00';
$tmp = split('[- :]', $time1);
$timestamp1 = mktime($tmp[3], $tmp[4], $tmp[5], $tmp[1], $tmp[2], $tmp[0]);
$tmp = split('[- :]', $time2);
$timestamp2 = mktime($tmp[3], $tmp[4], $tmp[5], $tmp[1], $tmp[2], $tmp[0]);
$diff = $timestamp2 - $timestamp1;
$newdate = date('H:i:s', $diff - 3600);
echo $newdate;

?>
Avatar billede hmortensen Nybegynder
20. november 2004 - 13:02 #10
Hmm, det var squ smart:
split('[- :]'
Avatar billede coolzone Nybegynder
20. november 2004 - 17:36 #11
Tak for svarene. Tiderne kommer fra en MySQL database og jeg ville helst holde mig til eksemplet fra denismp.

Jeg kan imidlertid ikke få det til at virke.

Der er ikke mere en 24 timer imellem tiderne, der hver især er en login tid og en logout tid.

Med følgende: SELECT *,date_format(last_logout-last_login,'%k.%i:%s') as duration FROM

Får jeg ikke noget resultat, hvis tiden er f.eks.

Login 12.36:33
Logout 12.57.11

Svaret er blankt.
Avatar billede dennismp Nybegynder
20. november 2004 - 17:40 #12
hvordan ser tabellen ud?
Avatar billede coolzone Nybegynder
20. november 2004 - 17:51 #13
Tabellen indeholder tre 4 felter

ID
USERNAME
LAST_LOGIN
LAST_LOGOUT

LAST_LOGIN og LAST_LOGOUT er datetime

Googolplex's løsning virker perfekt, men jeg kunne godt tænke mig at løse det uden en formel. Om ikke andet så for at få det lært også.

Bagefter fordeller jeg points.
Avatar billede coolzone Nybegynder
20. november 2004 - 17:53 #14
Googolplex hvordan fandt du frem til ovenstående "formel"? Var det en du lige smed ud af ærmet efter morgenmaden? Kan du ikke forklare trin for trin, hvad den gør? Jeg kan forstå noget af det, men ikke det hele.
Avatar billede dennismp Nybegynder
20. november 2004 - 18:13 #15
Prøv med:
SELECT sec_to_time( unix_timestamp( last_logout ) - unix_timestamp( last_login ) )
FROM ..
Avatar billede dennismp Nybegynder
20. november 2004 - 18:17 #16
Det googleplex gør, er at han tager din tekst-streng og splitter den op (så han får en variable med dag, måned, år, time, osv.. så han kan bruge mktime til at lave det om til et timestamp, som bare er antal sekunder siden 1970.. Og med de to værdier kan man trække dem fra hinanden og derved få hvor mange sekunder vedkommende har været online. Så er det sidste bare at lave det om til timer/min/sec..

Dog trække han 3600 fra. Jeg ved ikke helt hvorfor, men tror det er pga tidszonen (et unixtimestamp er i GMT - vi bor i GMT+1 - så han regner 1 time forkert - som han så trækker fra. Det vil give problemer (den vil regne to timer for meget til den tid - men kun trække den ene fra), når vi gå i sommertid - tror jeg :)
Avatar billede coolzone Nybegynder
20. november 2004 - 18:20 #17
Det virker dennismp!

Tusind tak til begge to! Point er fordelt.

Jeg kunne dog stadig tænke mig at få forklaret, hvordan googolplex's formel virker.
Avatar billede dennismp Nybegynder
20. november 2004 - 18:45 #18
Æv - jeg troede jeg havde forklaret det :-)
Avatar billede googolplex Novice
20. november 2004 - 18:49 #19
Jep, den med de 3600 er jeg ikke helt sikker på, men det virkede :P

Kan se at hmortensen har gjort det samme, måske han ved hvorfor :)

Takker for point.
Avatar billede dennismp Nybegynder
20. november 2004 - 18:57 #20
Jeg tror det er pga tidszonen - er faktisk ved at være ret overbevist selv :)

unix timestap 0, er jo 19
Unix epoch er jo "00:00:00 GMT, January 1, 1970".

Men det svarer til

00:01:00 GMT+1, da vi ligger en time forskudt. Så enten skal du tage højde for sommertid, eller også skal du bruge gmdate() istedet. Jeg tror gmdate er lagnt nemmest :)
Avatar billede coolzone Nybegynder
20. november 2004 - 20:04 #21
Ok, tak for forklaringen.

"Æv - jeg troede jeg havde forklaret det :-)" - det havde du også :-) mens jeg sad og skrev så det stod ikke på min skærm :-))
Avatar billede googolplex Novice
21. november 2004 - 12:46 #22
Jep, gmdate() virker perfekt :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester