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.
Annonceindlæg tema
Offentlig digitalisering
Fra effektivisering til digital suverænitet. Hvordan skaber det offentlige en digital fremtid med AI, sikkerhed og kontrol i centrum?
20. november 2004 - 12:41
#1
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);
20. november 2004 - 12:42
#3
Men hvis det kommer fra en database, kan det klares direkte der, meget lettere.
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)
20. november 2004 - 12:49
#5
Damn - bare fordi man henter mogenmad, så er ens svar for sent :)
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 :)
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.
20. november 2004 - 12:55
#8
Ja, havde jeg bare ik lige forstået sådan.
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; ?>
20. november 2004 - 13:02
#10
Hmm, det var squ smart: split('[- :]'
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.
20. november 2004 - 17:40
#12
hvordan ser tabellen ud?
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.
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.
20. november 2004 - 18:13
#15
Prøv med: SELECT sec_to_time( unix_timestamp( last_logout ) - unix_timestamp( last_login ) ) FROM ..
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 :)
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.
20. november 2004 - 18:45
#18
Æv - jeg troede jeg havde forklaret det :-)
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.
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 :)
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 :-))
21. november 2004 - 12:46
#22
Jep, gmdate() virker perfekt :)
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.