Tidsberäkning, PHP/MySQL

Avdelningen för webbrelaterad programmering och grafisk design.
Post Reply
User avatar
slaüman
Posts: 966
Joined: 2002-04-14 12:55:52
Location: Göteborg
Contact:

Tidsberäkning, PHP/MySQL

Post by slaüman »

Tjenare!

Håller på med en form av resursplanering, försöker beräkna lagd arbetstid/arbetsuppgift i stort sett.
Har byggt ett adminverktyg mha AJAX (prototype.js & scriptaculous.js from http://script.aculo.us, fruktansvärt smutt!), vid byte av uppgift uppdateras databasen, och jag kan där sätta starttid på uppgiften man börjar på, och sluttid på den man tidigare höll på med.
Systemet har stöd för flera "resurser" (personer), och jag vill kunna summera lagd tid/uppgift, arbetad tid/uppgift/person (Under viss tid, vecka, dag, månad, whatever)

Det jag kört fast på nu är hur jag skall beräkna tiden.

Ponera att jag har dessa fält i databasen;
uppgift (uppgift.ID), resurs (resurs.ID), in/ut (1/2), tid (unix timestamp?)
Ingen modifiering görs normalt vid hemgång (1700), och ingen på morgonen (0800).
Måste alltså på något höger räkna bort alla sekunder som är mellan 17:00 och 08:00 & all tid som är helgdag (v1 kan sakna stöd för storhelger... Men har ni något färdigt för det är jag ytterst tacksam )

Så; Några tips?

Allt detta görs i PHP5.0.4 & MySQL 4.1.11
User avatar
Nurgle
Posts: 72
Joined: 2002-10-05 1:38:19
Location: Sverige, Göteborg

Post by Nurgle »

Antal sekunder mallan 17.00 o 08.00 är konstant:
(15*60*60=54000sek)

En helg (fredag 17.00 - måndag 08.00) borde alltså vara:
(54000+(2*24*60*60)=226800sek (en kväll+2dygn)

Ett dygn = 24*60*60=86400sek

Alla de där sifforna retunerar dock mktime(), gärna i sammarbete med date() (läs på på www.php.net)...

Jag har faktiskt försökt något likande, men fann att det var ett rent helvete med helger...
Min funktion skulle gå ut på att räkna ut leveranstid och därmed räkna bort lördag, södnag. (Försökte inte med med helgdagar).

Jag fick det att funka innom vissa tidsintervall men inte alla så jag gav upp.
Här kommer mitt försök. Lyckas du göra ngt av den eller finner din egna väg så posta det gärna här!

Code: Select all

function getFutureDate( $t )
{
	echo "Now: ".date( 'Y-m-d' )." (".date('w', mktime(0, 0, 0, date('m'), date('d'), date('Y')) ) .")";
		
	$posttime = work_mktime( date('Y'), date('m'), (date('d')+$t), $t );
	echo "<br>Levdate ".$t." days: ".date( 'Y-m-d', $posttime )." (".date('w', work_mktime( date('Y'), date('m'), date('d'), $t ) ) .")";
}

function work_mktime($y=0, $month=0, $d=0, $t )
{
	$start = floor( mktime(0, 0, 0, 0, $d, 0) / (60*60*24 ) );
	$end = floor( mktime(0, 0, 0, 0, ($d+$t), 0) / (60*60*24 ) )+1;
		
	$first = true;
	for( $i=$start;$i<=$end;$i++ )
	{
		if( date( 'w', ($i*60*60*24) ) == 0 || date( 'w', ($i*60*60*24) ) == 6 ) $d++;
	}
	return mktime(0, 0, 0, $month, ($d+$t), $y);
}
Wepic Visions - www.wepic.se
User avatar
slaüman
Posts: 966
Joined: 2002-04-14 12:55:52
Location: Göteborg
Contact:

Post by slaüman »

Tog en genväg, kör ett cronjobb klockan 8 & 17 på vardagar.
17-jobbet sätter sluttid (unixtime), skapar en ny rad i db'n (där arbetsuppgiften är samma) utan start/stoptid, 8-jobbet sätter starttid på dessa.
Får då fördelen att se antal gånger man jobbat med varje uppgift.
Post Reply