Avatar billede cpccorp Juniormester
07. august 2009 - 22:40 Der er 11 kommentarer og
1 løsning

Lave en selectbox hvor tiden forøges

Jeg vil gerne lave en php box hvor man kan definere start og slut + interval mellem tider og indsætter det i en selctbox

eks.

startid = 9:00
Sluttid = 23:00
Interval = 0:45
Avatar billede elkoger Nybegynder
07. august 2009 - 23:10 #1
Gider du ikke uddybe det en smule? :)
Avatar billede cpccorp Juniormester
07. august 2009 - 23:19 #2
Jo da

jeg vil gerne lave følgende

Variabel1(antal minutter imellem) = eks 45
Start tidspunkt = 9:00
Slut tidspunkt = 23:00

Så vil jeg lave en selectbox/dropdown der viser klokkeslættene fra 9:00 til 23:00 med interval som her 45 min eller hvis jeg ændrer intervallet til 30 min eller sågar 1 time
Avatar billede Slettet bruger
07. august 2009 - 23:20 #3
Er det du prøver på at få PHP til at udregne hvor mange 'facer' eller dele om man vil, i det pågældne tidsrum efter det angivne interval? Hvis jeg nu prøver tage udgangspunkt i dit eksempel:

Første interval: 9:00 - 9:45
Andet interval: 9:45 - 10:30
Osv.

Er det, det du prøver at opnå?
Hvis, så vil jeg angive start og slut tidspunktet i en varibel som sekunder vha. mktime() funktionen (http://dk.php.net/manual/en/function.mktime.php) og så lave tids intervallerne og bagefter omskrive dem tilbage til tt:mm formatet.

Håber jeg har fat i hvad det oprindeligt er du vil opnå, og at du forstår idéen i dette her.
Avatar billede cpccorp Juniormester
07. august 2009 - 23:48 #4
Det ser rigtigt ud, men forstår jeg det næhh ;0) ikke umiddelbart
Avatar billede Slettet bruger
08. august 2009 - 00:58 #5
Hehe okay jeg vil prøve at uddybe det en smule så!

Da et tidspunkt i tt:mm formatet er en string, kan de ikke bruges i matematiske udregninger og derfor er det mest hensigtsmæssigt at omskrive dem til et passende format, og da det er et klokkeslæt er det ikke nødvendigt med mere end sekunder, så derfor sagde jeg i forrige post du skal omregne dine tidspunkter til sekunder. Dog var jeg lidt for hurtig og kom til at nævne en lidt ubruglig funktion (mktime()) i dette sammenhæng.
Istedet for mktime() funktionen jeg nævnte før, har jeg lavet en hurtig funktion, der omregner tidspunkter i formatet tt:mm om til sekunder (se længere nede).
Når du har fået omregnet dine tidspunkter til sekunder kan du nu bruge dem i matematiske udregninger.
En god start er at finde ud af hvor stort et tidsrum du egentlig har valgt.
Det skal lige nævnes at nedenstående eksempel ikke vil håndterer tidspunkter der går over midnat!
Men her er eksemplet på omskrivningen og udregning af intervaller:

<?php
// "tt:mm => sek" funktionen
function time_to_sek($time = "")
{
    $pattern = "/^([0-9]{2})\:([0-9]{2})$/";
   
    if(!preg_match($pattern,$time,$match))
    {
        echo "Ukendt tidsformat fundet i <b>" . $time . "</b>! Det godkendte tidsformat er <b>tt:mm</b>";
        exit();
    }
   
    $tt = (int) $match[1];
    $mm = (int) $match[2];
   
    $tt = ($tt > 0) ? ($tt - 1) : $tt;
    $tt = $tt * 3600;
    $mm = $mm * 60;
    $ss = $tt + $mm;
   
    return $ss;
}

// Angiver tidspunkter i tt:mm format
$start_tid = "09:00"; // Start tidspunkt
$slut_tid = "23:00"; // Slut tidspunkt
$int_tid = "00:45"; // Interval længde

// Nu omregner vi tidspunkterne til sekunder
$start_sek = time_to_sek($start_tid); // 32400 sekunder
$slut_sek = time_to_sek($slut_tid); // 82800 sekunder
$int_sek = time_to_sek($int_tid); // 2700 sekunder

// Udregner tidsrum mellem start og slut tidspunkterne
$tidsrum_sek = $slut_sek - $start_sek;

// Antal intervaller
$int_count = $tidsrum_sek / $int_sek;
$int_count = ceil($int_count); // Runder op til nærmeste heltal. Præcis resultat vil være 18,667 så vi runder op til 19

// Looper igennem intervallerne
$interval = array();
for($i=1; $i<=$int_count; $i++)
{
    $start = $start_sek + (($i - 1) * $int_sek);
    $start = date("H:i",$start);
   
    $slut = $start_sek + ($i * $int_sek);
    $slut = ($slut > $slut_sek) ? date("H:i",$slut_sek) : date("H:i",$slut);
   
    $interval[$i] = $start . " - " . $slut;
}
?>

Så en hurtig gennemgang af ovenstående script er som følger:

1. Angiver tidspunkter i tt:mm formatet

2. Omskriver tidspunkterne til sekunder

3. Udregner tidsrummet mellem start- og slut tidspunkterne, i sekunder

4. Udregner antal intervaller af tidsrummet ud fra intervals længden, som derefter rundes op.

5. Looper intervallerne igennem og omregner sekunderne tilbage til tt:mm formatet og putter tidspunkterne i arrayet $interval med værdier som "09:00 - 09:45" osv.


Lige for at runde af vil jeg lige nævne at jeg ikke vil råde dig til at bruge ovenstående script som det er, men håber det har givet dig en idé om hvordan det kan gøres.

Så må du sove godt, burde dog ikke være noget problem hvis du har læst hele denne post!
Avatar billede hermandsen Juniormester
10. august 2009 - 22:57 #6
Hvorfor ikke bare gøre brug af en simpel integer-værdi og så forøge med 45 minutter hver gang?

<?php

$start = strtotime('9:00');
$end = strtotime('23:00');
$interval = 45;

$interval *= 60;

echo '<select>';

for ($i = $start; $i < $end; $i += $interval) {
  $d = date('H:i', $i);
  echo <<<EndOfOption
<option value="$d">$d</option>
EndOfOption;
}

echo '</select>';

?>

//hermandsen
Avatar billede Slettet bruger
10. august 2009 - 23:36 #7
Puha må da indrømme at hermandsens metode er lidt smartere :)
Så lærte jeg også noget idag!
Avatar billede cpccorp Juniormester
10. august 2009 - 23:45 #8
Jeg afprøver det lige i morgen har ikke tid i dag
Avatar billede cpccorp Juniormester
11. august 2009 - 18:03 #9
Det er en super god løsning læg et svar
Avatar billede hermandsen Juniormester
12. august 2009 - 22:48 #10
Jeg er i tvivl.
Hvis løsning brugte du, og skal jeg lægge et svar mere hvis du brugte min??
Avatar billede cpccorp Juniormester
13. august 2009 - 07:03 #11
Undskyld den vege formulering, ja det var din løsning

-> Hermandsen
Avatar billede hermandsen Juniormester
18. august 2009 - 21:39 #12
Jamen jeg lægger da gerne et svar mere... :)
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