Avatar billede jespera Nybegynder
28. maj 2006 - 20:51 Der er 41 kommentarer og
2 løsninger

Dato og tid - lig xx minutter til til nuværende tid

Hej Alle.

Jeg sidder og fedter med noget tidsbehandling.

F.eks. har jeg en dato som ser sådan her ud yyyy-mm-dd hh:mm:00

Hvis nu jeg har en dato 2006-06-01 20:00:00 og jeg gerne vil ligge 45 minutter til så tiden bliver 2006-06-01 20:45:00.

Hvordan gøres det?

På forhånd tak.
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:01 #1
Hvad med noget i retning af:

$tstamp = strtotime("2006-06-01 20:00:00");
$tstamp += (60*45);
echo date("d/m/y h:i:s");

Altså først konvertere tiden til timetamp med strtotime() og så lægge 45 minutter til, og så tilbage igen.

Ved ikke lige om man kan gøre det lettere (eller overhovedet om strtotime kan læse det format du har angivet).
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:02 #2
hov... echo date("d/m/y h:i:s", $tstamp); selvfølgelig
Avatar billede jespera Nybegynder
28. maj 2006 - 21:05 #3
Okay men det er en dato jeg hiver ud fra MySQL. Feltet er af typen date/time.
Avatar billede jespera Nybegynder
28. maj 2006 - 21:08 #4
Hmm. Når jeg kører denne:

$tstamp = strtotime("2006-06-01 20:00:00");
$tstamp += (60*45);
echo date("d/m/y h:i:s", $tstamp);

Får jeg 01/06/06 08:45:00

Hvordan kan det være ?
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:10 #5
Det ser vel ud til at passe okay, er det ikke bare formatet der skal laves om?
Avatar billede jespera Nybegynder
28. maj 2006 - 21:19 #6
Jo men når jeg trækker en dato ud fra MySQL af typen datetime ser det så ikke ud sådan her YYYY-MM-DD HH:MM:SS?

Tiden 0845 hvordan laver jeg den om til 2045?

Tak for din hjælp så langt

Jesper
Avatar billede jespera Nybegynder
28. maj 2006 - 21:27 #7
Arhhh det skal bare være et stort H. Så giver den 2045.

Hvis nu jeg skal sammenligne to tidspunkter findes der så en func til det?
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:28 #8
Prøv evt. med:
Y-m-d H:i:s
i stedet for
d/m/y h:i:s

I date() funktionen.

Hvis du hiver en timestamp ud fra databasen, så kan du egentlig konvertere den til timestamp direkte uden at bruge strtotime, ved at sige noget i retning af: SELECT UNIX_TIMESTAMP(mindato) AS dato
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:28 #9
ups... jeg skrev "hvis du hiver en timestamp", der skulle selvfølgelig have stået "hvis du hiver en datetime"
Avatar billede jespera Nybegynder
28. maj 2006 - 21:35 #10
Ok super med UNIX_TIMESTAMP, det vidste jeg ikke ;-)

Mht sammenligning af dato/tid hviken func findes der i php til det?

Tak for din super hjælp, det er bare fedt...
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:39 #11
Velbekomme, hehe :-)

Nu ved jeg ikke hvad du tænker på specifikt med sammenligning, men ved at konvertere til timestamp formatet (altså sekunder siden 1 januar 1970), så får du et format der er ret nemt at arbejde med (sammenligne, trække fra, lægge til, konvertere...).
Avatar billede jespera Nybegynder
28. maj 2006 - 21:42 #12
Jeg skal nemlig sammenligne nogle tider. F.eks om nogle er lig med hinnaden,størrer og mindre end. Har du mulighed for at give nogle eksempler på det?

Jeg smider lige nogle flere point i. Det er bare super det her...
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:45 #13
Ej, så mange points er slet ikke nødvendigt, 30-60 stykker er passende :)

Hvis det er i forbindelse med at hive nogle poster ud fra en data, så kan du jo gøre det direkte i en select.

Altså det afhænger lidt af situationen.
Avatar billede jespera Nybegynder
28. maj 2006 - 21:50 #14
Nhaa skidt med det. Jeg er bare glad for at der er nogle der gider at hjælpe :-)

Okay så er det bedre at sammenligne tider i mysql istedet for koden? F.eks skal jeg checke om 2015,2030,2045 er ledig i db'en.

Jeg vil så kalde db'en med dato og tid f.eks. 2006-06-01 20:00:00 (hvis der er en anden måde der er smart må du gerne sige det) og så skal jeg finde ud af om tiden imellem 2000 og 2045 er fri...

Håber du forstå?
Avatar billede jespera Nybegynder
28. maj 2006 - 21:51 #15
Glemte lige at næve at jeg har en tabel som hedder calender som har en felt booked som er er type datetime.
Avatar billede coderdk Praktikant
28. maj 2006 - 21:57 #16
Alternativt:

$future = strtotime( "+45 minutes", strtotime( "2006-06-01 20:00:00" ) );
echo date( "Y-m-d H:i:s", $future );

:)
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:57 #17
Ud fra det du fortæller vil det helt klart kunne gøres smart direkte i din databaseforespørgsmål. Men jeg må erkende at jeg ikke liiige at så stærk i datetime formatet (jeg har altid brugt timestamp men er lige gået over til datetime, derfor :).
Avatar billede gizmo-gizmo Nybegynder
28. maj 2006 - 21:58 #18
coderdk: du må vide hvordan man bruger datetime felttypen ;)
Avatar billede jespera Nybegynder
28. maj 2006 - 22:26 #19
Ok I see. For det her tid's check haløjsa skal nemlig bruges ved noget tidsbestilling.

F.eks kan man booke et rum 15 min af gangen. I ovenstående tilfælde vil nogle gerne booke rummet fra 20:00 til 20:45. Jeg skal så checke i min kalender om 20:00,20:15,20:30,20:44 er taget. Hvis alle er frie kan man så booke tiden. Hvis ikke skal den forslå en ny tid.

Håber det giver et mere klart billede af hvad jeg vil :-)
Avatar billede coderdk Praktikant
28. maj 2006 - 23:34 #20
I SQL hedder det DATE_ADD( '2006-06-01 20:00:00', INTERVAL 45 MINUTE ), men man kan vist også bare skrive '2006-06-01 20:00:00' + INTERVAL 45 MINUTE
Avatar billede coderdk Praktikant
28. maj 2006 - 23:43 #21
Mht. til dit spørgsmål, er det letteste måske at gemme starttid og sluttid, og så lave en SQL i stil med:

$nystart = '2006-06-01 20:00:00';
$nyslut = '2006-06-01 20:45:00';
$sql = "
    SELECT
        1
    FROM
        dintabel
    WHERE
        ( '$nystart' > starttid AND sluttid < '$nystart' )
        OR
        ( '$nyslut' > starttid AND sluttid < '$nyslut' )
        OR
        ( '$nystart' < starttid AND '$nyslut' > starttid )
        OR
        ( '$nyslut' < sluttid AND sluttid < '$nystart' )
    ";

Den vil returnere 1 række hvis der er optaget :)
Avatar billede coderdk Praktikant
28. maj 2006 - 23:44 #22
(Husk at lave et sammensat indeks på starttid og sluttid!)
Avatar billede coderdk Praktikant
28. maj 2006 - 23:55 #23
Det var da vist noget vrøvl jeg fik skrevet i den SQL, denne burde være bedre:

$nystart = '2006-06-01 20:00:00';
$nyslut = '2006-06-01 20:45:00';
$sql = "
    SELECT
        1
    FROM
        dintabel
    WHERE
        ( starttid < '$nystart' AND '$nystart' < sluttid )
        OR
        ( starttid < '$nyslut' AND '$nyslut' < sluttid )
        OR
        ( '$nystart' < starttid AND sluttid < '$nyslut' )
    ";
Avatar billede jespera Nybegynder
29. maj 2006 - 08:34 #24
Hej Coderdk,

Tak for dit indput, fedt ;-) Det vil jeg lige prøve af når jeg komme hjem i aften. Men du nævner "sammensat indeks på starttid og sluttid" Hvad betynder det og hvad gør den indeks?

Tak for jeres hjælp, det er sku lærerigt det her......
Avatar billede coderdk Praktikant
29. maj 2006 - 15:19 #25
Du kan lave index'er i phpMyAdmin eller lign. Du kan også fyre SQL af direkte sådan:

CREATE INDEX startsluttid_idx ON dintabel (starttid, sluttid);

Det bevirker at søgninger (som den SELECT jeg har beskrevet) bliver OVERDREVENT meget hurtigere...
Avatar billede jespera Nybegynder
30. maj 2006 - 08:51 #26
Fedest Coderdk.

Jeg nåede desværre ikke at afprøve SQL igår da jeg kom sent hjem.

Jeg giver den et forsøg i aften.

Tak for svaret med "index".
Avatar billede jespera Nybegynder
30. maj 2006 - 22:12 #27
Hej,

Så fik jeg lavet et index og har kørt koden men jeg syntes ikke rigtigt det virker. Dvs. jeg får ikke nogen record tilbage som den burde

Min sql statement ser sådan ud:

SELECT 1 FROM calender WHERE ( starttid < '2006-06-01 20:00:00' AND '2006-06-01 20:00:00' < sluttid ) OR ( starttid < '2006-06-01 20:45:00' AND '2006-06-01 20:45:00' < sluttid ) OR ( '2006-06-01 20:00:00' < starttid AND sluttid < '2006-06-01 20:45:00' )

I min calender table har jeg en record der siger

Tablenames: id,starttid,sluttid
Record: 0,2006-06-01 20:00:00,2006-06-01 20:45:00

Håber i kan hjælpe :-)
Avatar billede coderdk Praktikant
30. maj 2006 - 22:49 #28
Prøv lige med:

$sql = "
    SELECT
        1
    FROM
        dintabel
    WHERE
        ( starttid <= '$nystart' AND '$nystart' <= sluttid )
        OR
        ( starttid <= '$nyslut' AND '$nyslut' <= sluttid )
        OR
        ( '$nystart' <= starttid AND sluttid <= '$nyslut' )
    ";
Avatar billede jespera Nybegynder
30. maj 2006 - 23:01 #29
det ser som om det virker. :-)

Hvordan kan man så få den til at foreslå at næste ledige tid er feks. 2030 hvis jeg nu ændrer sluttid til det i databasen?
Avatar billede coderdk Praktikant
31. maj 2006 - 02:12 #30
Mjaeh, jeg kan ikke lige komme i tanker om en SQL-måde. Men du kunne jo loope lidt og selecte i databasen indtil du finder en tid...
Avatar billede jespera Nybegynder
31. maj 2006 - 11:21 #31
Hej, Jamen det er netop lige det - du har ikke et lille "frækt" bud på hvordan man kunne løse det? ;-)
Avatar billede coderdk Praktikant
31. maj 2006 - 19:52 #32
Well, du kunne jo i stedet for at select'e "1" ud, selecte starttid og sluttid, så kunne du prøve at bruge den eksisterende starttid som din nye sluttid eller den eksisterende sluttid som din starttid og så fremdeles...
Avatar billede jespera Nybegynder
31. maj 2006 - 21:26 #33
okay den syntes jeg godt nok ikke at jeg kan gennemskue. Du har slet ikke et bud på hvordan det kunne se ud?
Avatar billede coderdk Praktikant
01. juni 2006 - 00:25 #34
Jooh, det er jo "bare" at stille det logisk op... Her er en måde jeg lige kunne se - Det er ikke testet, men logikken er vist ok:

    // Forbind database

    $nystart = "2006-06-01 20:00:00";
   
    function checkTime( $nystart, $nyslut )
    {
        // Checker om tiden er ledig. Returnerer den der blokerer hvis der er
        // en, ellers returneres false
        $sql = "
            SELECT
                starttid
                ,sluttid
            FROM
                dintabel
            WHERE
                ( starttid <= '$nystart' AND '$nystart' <= sluttid )
                OR
                ( starttid <= '$nyslut' AND '$nyslut' <= sluttid )
                OR
                ( '$nystart' <= starttid AND sluttid <= '$nyslut' )
            ";
        $qh = mysql_query( $sql ) or die( mysql_error() );
        if ( $row = mysql_fetch_assoc( $qh ) )
        {
            return $row;
        }
        else
        {
            return false;
        }
    }

    while ( true )
    {
        $nyslut = date( "Y-m-d H:i:s"
                        ,strtotime( "+45 minutes", strtotime( $nystart ) ) );

        if ( ( $optaget = checkTime( $nystart, $nyslut) ) == false )
        {
            break;
        }
        else
        {
            $nystart = $row['sluttid'];
        }
    }

    // Her vil $nystart og $nyslut indeholde to gyldige tider ;)
Avatar billede coderdk Praktikant
01. juni 2006 - 00:25 #35
Du får lige et svar fra mig ;P
Avatar billede coderdk Praktikant
01. juni 2006 - 00:26 #36
$nystart = $row['sluttid'];

burde have været:

$nystart = $optaget['sluttid'];
Avatar billede coderdk Praktikant
01. juni 2006 - 00:30 #37
Det ser faktisk pænere ud uden funktionen:

    // Forbind database

    $nystart = "2006-06-01 20:00:00";
    $nyslut = date( "Y-m-d H:i:s"
                    ,strtotime( "+45 minutes", strtotime( $nystart ) ) );
   
    while ( true )
    {
        $sql = "
            SELECT
                starttid
                ,sluttid
            FROM
                dintabel
            WHERE
                ( starttid <= '$nystart' AND '$nystart' <= sluttid )
                OR
                ( starttid <= '$nyslut' AND '$nyslut' <= sluttid )
                OR
                ( '$nystart' <= starttid AND sluttid <= '$nyslut' )
            ";
        $qh = mysql_query( $sql ) or die( mysql_error() );
        if ( $row = mysql_fetch_assoc( $qh ) )
        {
            $nystart = $row['sluttid'];
            $nyslut = date( "Y-m-d H:i:s"
                            ,strtotime( "+45 minutes"
                                        ,strtotime( $nystart ) ) );
        }
        else
        {
            break;
        }
    }
Avatar billede jespera Nybegynder
01. juni 2006 - 16:27 #38
Hej Coderdk,

Tak for svaret.

Har taget dit svar fra 00:30:09 og har afprøvet den. Men den komme aldrig frem med et svar? Ser ud som om den kører uendeligt, nok pga while(true) er det ikke forkert? eller er der noget jeg har overset?
Avatar billede jespera Nybegynder
01. juni 2006 - 21:28 #39
Hej Coderdk,

Jeg har lige prøvet at lave echo til skærmen og den komme aldrig til break?
Avatar billede jespera Nybegynder
01. juni 2006 - 21:56 #40
Og når jeg prøver at udskrive så skriver den

Nystart 2006-06-01 20:30:00
NySlut 2006-06-01 21:15:00

og det bliver den så ved med.

I min db har jeg kun en række som siger
start
2006-06-01 20:00:00

slut
2006-06-01 20:30:00
Avatar billede jespera Nybegynder
01. juni 2006 - 22:04 #41
Og her med SQL:
SELECT starttid ,sluttid FROM calender WHERE ( starttid <= '2006-06-01 20:00:00' AND '2006-06-01 20:00:00' <= sluttid ) OR ( starttid <= '2006-06-01 20:45:00' AND '2006-06-01 20:45:00' <= sluttid ) OR ( '2006-06-01 20:00:00' <= starttid AND sluttid <= '2006-06-01 20:45:00' )
Nystart 2006-06-01 20:30:00
NySlut 2006-06-01 21:15:00
SELECT starttid ,sluttid FROM calender WHERE ( starttid <= '2006-06-01 20:30:00' AND '2006-06-01 20:30:00' <= sluttid ) OR ( starttid <= '2006-06-01 21:15:00' AND '2006-06-01 21:15:00' <= sluttid ) OR ( '2006-06-01 20:30:00' <= starttid AND sluttid <= '2006-06-01 21:15:00' )
Nystart 2006-06-01 20:30:00
NySlut 2006-06-01 21:15:00
Avatar billede coderdk Praktikant
01. juni 2006 - 23:23 #42
Hmmm ok... Prøv lige at ændre SQL'en til:

        $sql = "
            SELECT
                starttid
                ,sluttid
            FROM
                calender
            WHERE
                ( starttid < '$nystart' AND '$nystart' < sluttid )
                OR
                ( starttid < '$nyslut' AND '$nyslut' < sluttid )
                OR
                ( '$nystart' <= starttid AND sluttid <= '$nyslut' )
            ";
Avatar billede jespera Nybegynder
01. juni 2006 - 23:41 #43
Det ser ud som om det virker :-) så må vi håber det er det rigtige når jeg får sat nogle andre checks på.

Tak for din super gode hjælp coderdk. Jeg splitter point så gizmo-gizmo også får en del af kagen.

Fortsat god aften.....
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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