Vinnaren i pepparkakshustävlingen!
2018-08-03, 19:14
  #1
Medlem
Tja, jag håller på med ett incheckningssystem till frugans jobb(taxi), webbdesign är min starka sida, PHP är det inte lika mycket

Jag har fått min kod att fungera men det känns som om det måste finnas ett enklare sätt.
Koden som visas nedan fungerar bara om hon har jobbat dagtid(06-19). Denna koden gör egentligen det som den ska, men ville visa även denna så ni får ett grepp om vad jag försöker göra.

$start och $slut innehåller en tidsstämpel var som är utformad på detta sättet: 2018-08-03 06:31:52, det är sedan dessa tider som jag räknar ut skillnaden mellan.



Kod:
//Räkna dagtid, vardag. KLART
        
if($starthour && $stophour 19 && $start $slut)
        {
            
            
$start_date2 = new DateTime($start);
            
$since_start2 $start_date2->diff(new DateTime($slut));
            
$minutes2 $since_start2->days 24 60;
            
$minutes2 += $since_start2->60;
            
$minutes2 += $since_start2->i;                        //Passets längd i minuter
            
$hours2 $minutes2 60;                            //Passets längd i timmar
            
$hours2 floor($hours2);                            //Avrunta timmar till heltal
            
$minutesdone2 $hours2 60;                        //Räkna ut hur många minuter som går åt till alla hela timmar
            
$minutesleft2 $minutes2 $minutesdone2;            //Räkna ut hur många minuter som är kvar efter hela timmar tagits bort
            
            
echo "<center><div class='timebox'><table width='100%'><tr><td width='16%'>$start</td><td width='16%'>$slut</td><td width='16%'>$timmarperdag $minuterperdag</td><td width='16%'>$hours2 H, $minutesleft2 M</td><td width='16%'></td><td width='16%'></td></tr></table></div>";
            
            
$daytime $daytime $hours2;                        //Lägg till timmar i totalen för månaden
            
$daytimeminutes $daytimeminutes $minutesleft2;    //Lägg till minuter i totalen för månaden
        
        



Okej så långt så fungerar det kanon, men sen kom jag till nästa stycke som behövde göras. Nämligen om hon börjar innan kl 19 och slutar efter kl 19, Vid 19:00 så går hon över på kvällstid, vilket gör att jag måste kunna skilja dessa tider åt för varje pass.

Då har jag tagit fram denna geniala koden:

Kod:
//Räkna dagtid och kvällstid, vardag. KLART
        
if($starthour && $stophour 19 && $start $slut)
        {
            
            
$startday =  mb_substr($start0, -9'utf-8');
            
$start_date2 = new DateTime($start);
            
$since_start2 $start_date2->diff(new DateTime($slut));
            
$minutes2 $since_start2->days 24 60;
            
$minutes2 += $since_start2->60;
            
$minutes2 += $since_start2->i;
            
            
$minutestotal $minutes2;
            
            
$startday =  mb_substr($start0, -9'utf-8');
            
$stopday "$startday 19:00:00";
            
$start_date2 = new DateTime($start);
            
$since_start2 $start_date2->diff(new DateTime($stopday));
            
$minutes2 $since_start2->days 24 60;
            
$minutes2 += $since_start2->60;
            
$minutes2 += $since_start2->i;
            
$hours2 $minutes2 60;
            
$hours2 floor($hours2);
            
$minutesdone2 $hours2 60;
            
$minutesleft2 $minutes2 $minutesdone2;
            
$minutesleftnight $minutestotal $minutesdone2;
            
            if (
$minutesleftnight 0)
            {
                
$hoursleftnight $minutesleftnight 60;
                
$hoursleftnight floor($hoursleftnight);
                
$minutesdonenight $hoursleftnight 60;
                
$minutesleftnight $minutesleftnight $minutesdonenight;
                
                
$hourslefttotal "$hoursleftnight H, $minutesleftnight M";
                
                
$nighttime $hoursleftnight;
                
$nighttimeminutes $minutesleftnight;
                
            }
            
            echo 
"<center><div class='timebox'><table width='100%'><tr><td width='16%'>$start</td><td width='16%'>$slut</td><td width='16%'>$timmarperdag $minuterperdag</td><td width='16%'>$hours2 H, $minutesleft2 M</td><td width='16%'>$hourslefttotal</td><td width='16%'></td></tr></table></div>";
            
            
$daytime $daytime $hours2;
            
$daytimeminutes $daytimeminutes $minutesleft2;

        
        } 

Även denna koden gör väl vad den ska men den känns väldigt rörig och komplicerad. Den räknar helt enkelt ut tiden som är mellan då hon startade passet och 19:00, sedan räknar den ut tiden som är ifrån 19:00 fram tills det att hon går av passet.


Hade detta varit allt som behövts så hade jag väl nöjt mig där antar jag, men dessvärre är det inte så. Lördag och Söndag går under helgtid(finns ingen dag/kvällstid här), det har jag också lyckats lösa fast med mycket mindre kod.

Men säg nu att åker på att köra från Fredag kl18 fram tills Lördag kl03. Då är det helt plötsligt 3 olika "OB" att räkna på, det är för en timma dag på fredagen fram tills 19, sedan är det kvällstid fram till kl24, sedan är det helg fram till kl03.

Med mitt sätt att koda så känns det som om detta kommer bli helt överdrivet svårt att ordna.

Så jag tänkte om det helt enkelt finns något magiskt sätt att göra allt detta i en funktion istället. Om någon har den minsta ide så tveka inte att peka mig åt rätt håll för detta driver mig till vansinne haha
Citera
2018-08-03, 22:58
  #2
Medlem
Bongomans avatar
Lagrar du datan i databas? Då ska du låta databasen sköta grovjobbet och du ska bara felhantera och presentera datan. Kör du SQL kan du dessutom köra funktioner men det lär vara överkurs för dig. Inte ens jag ger mig på det i onödan.
Citera
2018-08-03, 23:10
  #3
Medlem
Citat:
Ursprungligen postat av Bongoman
Lagrar du datan i databas? Då ska du låta databasen sköta grovjobbet och du ska bara felhantera och presentera datan. Kör du SQL kan du dessutom köra funktioner men det lär vara överkurs för dig. Inte ens jag ger mig på det i onödan.

Ja jag hämtar all data med MYSQL, jo jag antog att det innebar mycket jobb, men om någon kan hitta en bra guide så blir jag glader
Citera
2018-08-03, 23:16
  #4
Medlem
Jag hade gjort om alla tider till äkta timestamp (altså epoch) och sedan delat in de sekunderna i respektive tidstyp (dagtid, kväll, helg).

Säg att hon börjar köra på en fredag 1800 som i exemplet. Då vet man att kvällen börjar 1900, man räknar ut mellanskilnaden där hur många sekunder hon körde i den tidstypen (dagtid) och lägger undan det och samtidigt drar av den av tiden som är kvar. Sedan gör man motsvarande för resterande tid och gör om processen igen och lägger till tiden som räknas till rätt tidstyp och drar av den av kvarvarande tid. När ingen tid är kvar så har du hur mycket hon kört i respektive tidstyp. Du kan göra en enkel ifsats där du kollar vilken tid som ska matchas. Matcha alltid den med högst prioritet först (helg), sen kväll och sist dag. Annars blir det fel om hon kör dagtid på en helg, det ska ju räknas som helg och inte dagtid.

Går säkert göra bättre men den lösningen jag kom på lite snabbt när jag läste din post.
Citera
2018-08-03, 23:24
  #5
Medlem
Citat:
Ursprungligen postat av LoveShy
Jag hade gjort om alla tider till äkta timestamp (altså epoch) och sedan delat in de sekunderna i respektive tidstyp (dagtid, kväll, helg).

Säg att hon börjar köra på en fredag 1800 som i exemplet. Då vet man att kvällen börjar 1900, man räknar ut mellanskilnaden där hur många sekunder hon körde i den tidstypen (dagtid) och lägger undan det och samtidigt drar av den av tiden som är kvar. Sedan gör man motsvarande för resterande tid och gör om processen igen och lägger till tiden som räknas till rätt tidstyp och drar av den av kvarvarande tid. När ingen tid är kvar så har du hur mycket hon kört i respektive tidstyp. Du kan göra en enkel ifsats där du kollar vilken tid som ska matchas. Matcha alltid den med högst prioritet först (helg), sen kväll och sist dag. Annars blir det fel om hon kör dagtid på en helg, det ska ju räknas som helg och inte dagtid.

Går säkert göra bättre men den lösningen jag kom på lite snabbt när jag läste din post.


Det är precis detta jag vill uppnå, det låter så himla lätt när du förklarar det, men jag kan fan inte komma på hur jag ska skriva den ifsatsen haha
Citera
2018-08-04, 11:31
  #6
Medlem
Bongomans avatar
Citat:
Ursprungligen postat av abiz2
Det är precis detta jag vill uppnå, det låter så himla lätt när du förklarar det, men jag kan fan inte komma på hur jag ska skriva den ifsatsen haha

Den ligger i SQL. Du får lägga ett antal kolumner (som inte finns sparat utan är alias) som räknar antalet timmar i respektive klass. Man behöver inte använda epoch som föreslogs eftersom det finns funktioner som räknar med timestamp.

https://dev.mysql.com/doc/refman/8.0...culations.html

Det finns också sätt att ta reda på veckodagen för att klassa som veckoslut. Det enda som är kvar att lägga in manuellt är en tabell med röda dagar och andra speciella dagar som aftnar. Den tabellen joinar du in med prioritet över standard. Svårt? Japp, det tar många år att bli programmerare och kräver normalt en högskolekurs.
Citera
2018-08-04, 14:23
  #7
Medlem
Timestamp använder epoch internt, men visst man behöver inte använda det om man inte vill, fördelen är att det är väldigt enkelt att dra bort tid som man räknat.

Vilka dagar som är röda dagar man man dra hem från någon onlinekalender automatiskt, men det är ju en del kod bara det.
Citera
2018-08-11, 00:16
  #8
Medlem
Nu fungerar allt förutom när jag ska räkan ihop totalen för dag/kväll/helgdag/helgkväll.

i varje if statement så har jag någon liknande kod:
Kod:
$dagtidtotal $dagtidtotal $dagtid;
$kvalltidtotal $kvalltidtotal $kvallstid

$dagtid och $kvallstid innehåller antal timmar och minuter för varje pass i formatet tex 08:30

Men när jag försöker räkna ihop totalen så räknas bara timmarna ihop, minutrarna lämnas helt ute, vilket gör att det kan fela någon timma om man har ett antal rader att lägga ihop.

Hur fasiken löser jag det?
Citera
2018-08-11, 14:15
  #9
Medlem
Citat:
Ursprungligen postat av abiz2
Nu fungerar allt förutom när jag ska räkan ihop totalen för dag/kväll/helgdag/helgkväll.

i varje if statement så har jag någon liknande kod:
Kod:
$dagtidtotal $dagtidtotal $dagtid;
$kvalltidtotal $kvalltidtotal $kvallstid

$dagtid och $kvallstid innehåller antal timmar och minuter för varje pass i formatet tex 08:30

Men när jag försöker räkna ihop totalen så räknas bara timmarna ihop, minutrarna lämnas helt ute, vilket gör att det kan fela någon timma om man har ett antal rader att lägga ihop.

Hur fasiken löser jag det?

Du borde förmodligen försöka lösa det på ett annat sätt än att summera ihop två strängar. Men så här skulle du kunna göra om du nu vill jobba på det sättet:

Kod:
<?php

function addTimes$time1$time2 ) {
    
    
$parts[] = explode':'$time1 );
    
$parts[] = explode':'$time2 );
    
    
$hours  $parts[0][0] + $parts[1][0];
    
$minutes$parts[0][1] + $parts[1][1];

    return 
sprintf'%02d:%02d'$hours intdiv($minutes60),  $minutes 60 );
    
}

echo 
addTimes'10:40''04:35' ); //15:15
echo addTimes'5:50''09:27' ); //15:17
echo addTimes'1:10''05:05' ); //06:15
echo addTimes'17:40''99:35' ); //117:15
echo addTimes'14:40''04:18' ); //18:58
Citera
2018-08-14, 14:31
  #10
Medlem
Citat:
Ursprungligen postat av abiz2
$dagtid och $kvallstid innehåller antal timmar och minuter för varje pass i formatet tex 08:30

Men när jag försöker räkna ihop totalen så räknas bara timmarna ihop, minutrarna lämnas helt ute, vilket gör att det kan fela någon timma om man har ett antal rader att lägga ihop.

Hur fasiken löser jag det?

Som Nich sa, att summera två strängar fungerar nog sällan. (Om strängarna är mer komplicerade än '8', '8.10' eller så..) Anledningen till att du "bara" får timmarna i det här fallet är att PHP som sagt inte har nån additionsoperator för strängar som fungerar som du vill, utan PHP försöker omvandla strängarna till tal. Det är ju ett känt sätt:
Citat:
Kod:
php > echo '8'+'3'
11
Men det generella tillvägagångssättet är att PHP går igenom strängen från vänster och använder alla tecken som passar in för att skapa det nya talet. Om det bara är siffror så blir resultatet int, om en punkt dyker upp(max en, sen blir nästa punkt ogiltig) så blir det float. Tills dess att strängen tar slut eller ett tecken som inte går att använda dyker upp. Då säger PHP "Ok, färdigt. Det här är vad vi fick ihop"

Om strängarna är klockslag, t.ex '08:30' och '09:01', så används bara det som kommer innan kolonet eftersom det inte kan vara del av ett tal. Så strängarna ovan blir till 8+9:
Citat:
Kod:
php > echo '08:30'+'09:01'
17

Beroende på vilken error_reporting-level som är inställd så kan PHP Notices visas.
__________________
Senast redigerad av Koenigsegg 2018-08-14 kl. 14:35.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback