Avatar billede expnet Seniormester
03. december 2010 - 21:33 Der er 38 kommentarer og
1 løsning

Time beregner problemer

Hej exp.

Jeg sidder og prøver at lave en lille time beregner.

Men er kørt lidt fast, i hvordan jeg bedst muligt kan få beregneren, til at kigge efter om følgende ting.

Alm. 5 point pr./time.

Man -til Fredag fra kl 18:00 - 00:00 5 point mere pr./time.
Lørdag - hele dagen giver 10 point mere pr./time.
Søndag - hele dagen giver 20 point mere pr./time.

Der hvor min kæde hopper af, er når den skal udregnes.
Se mit eksempel her:

En logger på kl 07.00 - 19.00.
Der skal han/hun have 30 point + 5 point = 35 point.

Har lidt svært ved at se hvordan man skal finde frem til at den sidste time og er med ekstra point?

Håber det giver lidt mening, ellers spørger i bare.
Avatar billede arne_v Ekspert
03. december 2010 - 21:40 #1
Hvis du ved at det er hele timer saa lave en for loekke som itererer over antal hele timer og opsummerer med et funktionskald der returnerer point for et givet tidspunkt.
Avatar billede danco Nybegynder
03. december 2010 - 22:23 #2
Jeg tænker at du måske kunne bruge strtotime() funktionen til at løse problematikken.

Således at du kan trække de to tidspunkter fra hinanden, få antal minutter, dividere med 60 og derefter gange op med 5+dagstakst

Jeg har forsøgt at formulere følgende seudo kode for at se om jeg forstår konceptet korrekt, er det tilfældet?

takst = 5
if(dag == lørdag) {
  takst = 15
}
if(dag == søndag) {
    takst = 25
}
forbrugt = startTid - slutTid

if(forbrugt > 1) {
  point = forbrugt * takst
  tilføj point til konto
}
Avatar billede expnet Seniormester
03. december 2010 - 22:38 #3
Ja jeg kan bare ikke lige se at mit problem med mandag efter 18.00 til 00.00 hvor folk skal have 5 point mere for da jeg udregner det???
Avatar billede danco Nybegynder
03. december 2010 - 22:43 #4
$start = strtotime("19:00");
$slut = strtotime("22:00");
$diff = (($slut-$start)/60)/60;

echo 'differens: '.$diff.' timer';

Der har du ihvertfald en stump kode til at finde forskellen mellem tidspunkterne.
Avatar billede arne_v Ekspert
03. december 2010 - 23:33 #5
Løsning til hele timer:

<?php
function point_rate($t) {
    $parts = getdate($t);
    $wday = $parts['wday'];
    $hours = $parts['hours'];
    if($wday == 0) {
        return 25;
    } else if($wday == 6) {
        return 15;
    } else if($hours >= 18) {
        return 10;
    } else {
        return 5;
    }
}

function calc_point($s1, $s2)
{
    $t1 = strtotime($s1);
    $t2 = strtotime($s2);
    $sum = 0;
    for($t = $t1; $t < $t2; $t += 3600) {
        $sum += point_rate($t);
    }
    return $sum;
}

echo calc_point('07:00', '19.00');

?>
Avatar billede arne_v Ekspert
03. december 2010 - 23:39 #6
Version med minut support:

<?php
function point_rate($t) {
    $parts = getdate($t);
    $wday = $parts['wday'];
    $hours = $parts['hours'];
    if($wday == 0) {
        return 25;
    } else if($wday == 6) {
        return 15;
    } else if($hours >= 18) {
        return 10;
    } else {
        return 5;
    }
}

function hour_fraction($t) {
    $parts = getdate($t);
    $minutes = $parts['minutes'];
    return $minutes / 60;
}

function calc_point($s1, $s2)
{
    $t1 = strtotime($s1);
    $t2 = strtotime($s2);
    $sum = 0;
    for($t = $t1; $t < $t2; $t += 3600) {
        $sum += point_rate($t);
    }
    $sum -= hour_fraction($t1) * point_rate($t1);
    $sum += hour_fraction($t2) * point_rate($t2);
    return $sum;
}

echo calc_point('07:00', '19:00') . "\r\n";
echo calc_point('07:30', '19:30') . "\r\n";

?>
Avatar billede jesperhgh Nybegynder
04. december 2010 - 01:46 #7
Du misforstod vidst opgaven, Arne. Den skulle kunne dække en uge med forskellige dage og tidspunkter for forskellige bonusser.
Avatar billede arne_v Ekspert
04. december 2010 - 01:59 #8
Den passer til teksten i opgaven.

Hvis du er synsk og kan se at spørger ønsker noget andet, så kan jeg kun beklage at jeg ikke er synsk.
Avatar billede jesperhgh Nybegynder
04. december 2010 - 02:11 #9
OK, Arne - lav dit eksempel om til at operere med parametre i unix-time, så er det formentlig ok - spørgeren ønskede ikke bare fra hh:mm - hh:mm, men fra mandag-fredag og andre fra lørdag til søndag. Og den løsning, jeg har været i gang med involverer, at man først aligner unic-time til en mandag (0) kl 00:00:00 og så først nulstil unix time til at være en mandag kl 00:00 (ved at addere 4 gange en dag + en time (så er unix-time mandag kl 00:00)
Og brug så % (modulus til at finde ud af hvor du er) ... need i say more...
Avatar billede arne_v Ekspert
04. december 2010 - 02:26 #10
hm
Avatar billede arne_v Ekspert
04. december 2010 - 02:30 #11
Altså min løsning håndterer jo fint de forskellige ugedage.

Prøv selv med:

echo calc_point('3-Dec-2010 13:00', '3-Dec-2010 15:00') . "\r\n";
echo calc_point('4-Dec-2010 13:00', '4-Dec-2010 15:00') . "\r\n";
echo calc_point('5-Dec-2010 13:00', '5-Dec-2010 15:00') . "\r\n";
echo calc_point('Today 13:00', 'Today 15:00') . "\r\n";
echo calc_point('Tomorrow 13:00', 'Tomorrow 15:00') . "\r\n";
Avatar billede arne_v Ekspert
04. december 2010 - 02:31 #12
Hvis du vil bruge Unix tid fremfor tekst strenge som argumenter, så erstatter du:

function calc_point($s1, $s2)
{
    $t1 = strtotime($s1);
    $t2 = strtotime($s2);

med:

function calc_point($t1, $t2)
{
Avatar billede arne_v Ekspert
04. december 2010 - 02:32 #13
Og så undrer det mig stadig at "ved" hvad expnet leder efter.
Avatar billede jesperhgh Nybegynder
04. december 2010 - 03:07 #14
Det, jeg mener, Arne, er at man siger at mandag kl 0:00 = 0 (sekunder), tirsdag kl 0:00 = 60*60*24 (sekunder) - osv. Og at alle mandage er ens, og alle tirsdage er ens.Så vil du kunne betragte enhver uge som 0 = mandag kl 0 og ehhver tirsdag kl 0 = 60*60*24 - osv. - Det kræver bare, at du tweeker unix time således at du adderer (4 * enDag - enTime) for at få unixtime til at være en mandag kl 0:00.

..see ?

Da man her opererer med EN UGE, så hvorfor ikke bruge tiderne (korrigeret unixtime % 7 dage) for at få 0 for mandag kl 0:00 osv. - også lettere til at angive de forskellige skillelinjer.
Avatar billede arne_v Ekspert
04. december 2010 - 03:16 #15
No see.

Jeg kan virkeligt ikke se nogen grund til at genopfinde hjulet.

PHP kommer med en udmærket funktion til at finde ugedag udfra unix tid.
Avatar billede jesperhgh Nybegynder
04. december 2010 - 04:16 #16
Ja, arne, men (som jeg forstår opgaven) så taler vi ikke om en speciel dag, men en periode - altså fra tidspunkt A til tidspunkt B, hvor satsen er diffencieret.
Hvis man gør det på min måde, får du altid et tidsrum, som er nemt at parse. Du får altid et (eller flere) tidsrum mellem 0 (mandage kl 0:00) og 60*60*24*7-1 (søndage kl 23:59:59).
Og så er det let at sige:
0 til x = den takst
x til y = en anden takst
y til z = en helt anden takst.

Husk: perioden reduceres til ma - sø med modulus.

Vi er jo ikke interesseret i tidspunkteternes absolutte kalendermæssige beliggenhed - blot i deres relative ugemæssige beliggenhed.
Avatar billede expnet Seniormester
04. december 2010 - 05:02 #17
Jeg takker for kommentar
Der er godt nok lige gang i debatten...

Jeg vil lige starte med at sige at jeg arbejder med "UNIX_TIMESTAMP"

Jeg vil lige give jer et par eksempler mere:

Eksempel 1.
Mandag  - kl 16:45 - 00:00
Tirsdag  - kl 07:30 - 10:45
Onsdag  - kl 08:00 - 12:00
Torsdag  - kl 10:15 - 14:15
Fredag  - kl 10:00 - 20:00
Lørdag  - kl 8:00 - 22:00
Søndag  - kl 9:00 - 19:00

Jeg vil lige sige at det kan også godt ske at en bruger ikke er på nogle af dagene

Eksempel 2.
Mandag  - kl 16:45 - 00:00
Tirsdag  - kl 07:30 - 10:45
Onsdag  - Offline
Torsdag  - kl 10:15 - 14:15
Fredag  - Offline
Lørdag  - Offline
Søndag  - Offline

Og til sidst den skal udregne helt ned til et 15 minutter som udgangspunkt

Håber det gav lidt mere info omring det jeg gerne vil lave..?
Avatar billede arne_v Ekspert
04. december 2010 - 15:59 #18
Som de sagde i fangerne på fortet for 15 år siden: sæt igang!

Du har dine data.

Du har en funktion som kan beregne point for intervaller med minutter.
Avatar billede jesperhgh Nybegynder
04. december 2010 - 17:07 #19
Hvis du gør dette ved din unixTime (start og -endtidspunkt) så har du et tal mellem 0 (mandage kl 0:00) og 60*60*24*7-1 (søndage indtil 23:59:59)

$etSekund = 1;
$etMinut  = 60 * $etSekund;
$enTime  = 60 * $etMinut;
$enDag    = 24 * $enTime;
$enUge    = 7  * $enDag;

$unixTimeCorr = (4 * $enDag) - $enTime;

$yourTime = ((now + $unixTimeCorr) % $yourTime);
//Nu er $yourTime et tal mellem 0 og $enUge. og så bestemmer
//du simpelthen bare, at fra 0 til 18 * $enTime koster det dét.
//og så videre....

jeg har muligvis (det er jo sent) ikke ret i ovenstående - men (!) jeg har ret i, at du skal opløse dine datoer i ugevise representationer. Og ved ovenstående $unixTimeCorr får du alligned unixTime = 0 til mandage kl 0:00:00...
Avatar billede expnet Seniormester
05. december 2010 - 12:45 #20
arne_v
Smider du lige et svar, det virker bare.
Du skal have mange tak for hjælpen.

God jul / godt nytår
Avatar billede expnet Seniormester
05. december 2010 - 12:52 #21
har lige et tillægt spørgsmål hvis en bruger har være online

online fra kl. 12.00 - 18.15 og under vejs været offline i 15min

og jeg trækker det fra endtime, så er det ligesom om han fået point af lige da aften point før skal være fra kl 18.00
Avatar billede arne_v Ekspert
05. december 2010 - 15:01 #22
svar
Avatar billede arne_v Ekspert
05. december 2010 - 15:02 #23
Hvis du skal fratrække en pause er du nok nødt til at vide hvornår den pause er.

point(12:00-16:00) + point(16:15-18:15)

eller

point(12:00-18:15) - pauselængde*pointsats(pausetidspunkt)
Avatar billede expnet Seniormester
05. december 2010 - 16:22 #24
arne_v

Jeg tror det var mig der var lidt for hurtigt til at skrive at det ikke virke man det ser ud til at virke... takker for hjæpen
Avatar billede expnet Seniormester
05. december 2010 - 16:30 #25
arne_v

skal jeg forstå det sådan at jeg skal ligge alm sat samme det de skal have i bonus??

function point_rate($t) {
    $parts = getdate($t);
    $wday = $parts['wday'];
    $hours = $parts['hours'];
    if($wday == 0) {
        return 25;
    } else if($wday == 6) {
        return 15;
    } else if($hours >= 18) {
        return 10;
    } else {
        return 5;
    }
}
Avatar billede arne_v Ekspert
05. december 2010 - 16:44 #26
Den funktion returnerer point per time inkl. både base og bonus.
Avatar billede expnet Seniormester
05. december 2010 - 18:41 #27
okay tak..

Må jeg spørger om en lille ting i forhold det antal timer

eksempel han gå online 9.45 til 18.30 og har haft pause i 30 min

echo ( ( ($rs['end']-$breaks)- $rs['start']/60/60) );

så skriver den at min bruger har være online eksempel i 8.25

jeg mener jeg jeg ville få det 8.15
Avatar billede arne_v Ekspert
05. december 2010 - 19:10 #28
Nu kan jeg ikke helt gennemskue sammenhængen, men jeg gætter på at 8.25 er 8.15.

Altså at:

8 + 25/100 = 8 + 15/60

Jeg vil varmt anbefale dig at bruge 8.25 for 8 + 25/100 og 8:15 for 8 + 15/60 for at undgå den slags.
Avatar billede expnet Seniormester
05. december 2010 - 19:22 #29
eksempel hvis du køre det her så siger den 8.25

jeg forstår ikke at den siger det når det skulle blive til 8 timer og 15 min

<?
$start = "1290329100";
$end = "1290360600";
$break = "30";

$breaks = ($break*60);
$diff = ((($end-$breaks) - $start)/60/60);
echo $diff;
?>
Avatar billede arne_v Ekspert
05. december 2010 - 19:39 #30
Det er jo også korrekt.

8.25 = 8 timer 15 minutter
Avatar billede arne_v Ekspert
05. december 2010 - 19:39 #31
echo sprintf("%d:%02d", (int)$diff, (int)(($diff - (int)$diff) * 60));

vil udskrive korrekt
Avatar billede expnet Seniormester
05. december 2010 - 20:34 #32
jeg forstår ikke lige den funktion du bruger der kan du udbyde lidt hvad den gøre mere præcis?? udover at det virker??
Avatar billede arne_v Ekspert
05. december 2010 - 20:37 #33
(int)$diff = hele antal timer

($diff - (int)$diff) = nul komma et eller andet timer

(($diff - (int)$diff) * 60) = omregnet til minutter
Avatar billede arne_v Ekspert
05. december 2010 - 20:37 #34
Der burde iøvrigt være en mere elegant måde at gøre det på, men jeg kan ikke lige komme i tanke om noget.
Avatar billede expnet Seniormester
07. december 2010 - 00:55 #35
arne_v der er en lille ting jeg ikke helt for står

<?

function point_rate($t) {
    $parts = getdate($t);
    $wday = $parts['wday'];
    $hours = $parts['hours'];
   
    if($wday == 0) {
        return 1;
    } else if($wday == 6) {
        return 1;
    } else if($hours >= 18) {
        return 1;
    } else {
        return 1;
    }
}

function hour_fraction($t) {
    $parts = getdate($t);

//print_r($parts);

    $minutes = $parts['minutes'];
    return $minutes / 60;
}

function calc_point($s1, $s2)
{
    $t1 = strtotime($s1);
    $t2 = strtotime($s2);

print date("d-m-Y H:i",$t1)."<br>";
print date("d-m-Y H:i",$t2)."<br>";

    $sum = 0;
    for($t = $t1; $t < $t2; $t += 3600) {
        $sum += point_rate($t);
    }
    $sum -= hour_fraction($t1) * point_rate($t1);
    $sum += hour_fraction($t2) * point_rate($t2);

    return $sum;
}

var_dump( calc_point('07:00', '12:00'));
var_dump( calc_point('07:00', '12:30'));

?>

Når jeg sidder roder med den stump kode du har være så sød ret at lave så synes jeg ikke den regner rigtigt... det er nok bare mig

men man skal vel ikke have 1.5 point mere for kun en halv time


håber du forstår mit spørgsmål
Avatar billede arne_v Ekspert
07. december 2010 - 02:07 #36
Der var vist en fejl der.

:-)

Prøv og ret for løkken til:

for($t = $t1; $t <= $t2 - 3600; $t += 3600) {
Avatar billede arne_v Ekspert
07. december 2010 - 02:13 #37
Nej - ikke godt nok.

    $sum = 0;
    $t1x = $t1;
    while($t1x % 3600 != 0) $t1x++;
    $t2x = $t2;
    while($t2x % 3600 != 0) $t2x--;
    for($t = $t1x; $t < $t2x; $t += 3600) {
        $sum += point_rate($t);
    }
Avatar billede expnet Seniormester
07. december 2010 - 02:27 #38
umiddelbart ser det ud til at den regner rigtigt nu ved at rette til denne for løkke:

for($t = $t1; $t <= $t2 - 3600; $t += 3600) {

hvordan kan det være du skriver en while istedet???
Avatar billede arne_v Ekspert
07. december 2010 - 02:51 #39
Fordi jeg ikke tror at den virker hvis $t1 ikke starter på en hel time!
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



Seneste spørgsmål Seneste aktivitet
24 min siden Pixeline cd’er til PC Af Mathilde i Windows
I dag 01:14 Windows 10 - IIS 10 Af bsn i Windows
I går 20:39 Boot fra USB Af poulmadsen i Windows
I går 11:43 Gmail-ikon på skrivebordet Win 10 Af ErikHg i Fri debat
I går 09:22 Lopslag Af Luffe i Excel