WinFuture-Forum.de: Php - Berechnungen Mit Zeit - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Php - Berechnungen Mit Zeit


#1 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 20. Juli 2008 - 20:17

Hallo,
ich schreibe an einem StundenzettelScript, kome aber mit der berechnung nicht weiter.

Es soll ein "Stundenzettelscript" werden. Der User gibt die Uhrzeit an und die Enzeit seiner Arbeitszeit an:
Beispiel:
Anfang angefangen um: 21:45
Ende der Arbeit: 06:15 (nächster Tag)

Dann muss ich einmal die Dauer ausrechnen. Ich dachte ich könnet es mit einem Timestap machen, kan doch aber mit time() nur den jetztigen timestap ausgeben.

Des weiteren gibt es "Zuschläge".

Nachtzuschlag:
1€ pro std von 22-6 Uhr
Der User gibt hier an nichts an, das Script soll es selber berechnen aus der angegebenen Start-/Endzeit.

S+F-Zuschlag:
Wochenendzuschlag soll auch mit 1 € berechnet werden.
Ist die Arbeit also am Wochenende erfolgt soll er pro Stunde 1 Euro berechnen.

Am ende Soll alles in einer Tabelle ausgegeben:
Datum| von | bis | Stunden | Nachzuschlag | SFzuschlag


Bei Datum stehen alle Datumsangaben eines Monats.
Ich brauche vorallem bei der Berechnung Hilfe. :wink:

Danke,
Toasterfraktion
0

Anzeige



#2 _USA_

  • Gruppe: Gäste

geschrieben 20. Juli 2008 - 22:40

Mh. Wie wäre es denn, wenn du dir nicht jedes mal alles vorkauen lassen würdest?
So wirst du auf Dauer nicht weiterkommen, und das ist ja unser aller Ziel, oder?

Wenn du dann ne Woche erfolglos an dem Ding sitzt, kannst du dir ja hier mal ne Inspiration holen, aber um dein Gehirn zu ersetzen ist das Forum nicht da. Als Programmierer braucht man etwas Eigeninitiative!

Kannst dir ja nen Konzept überlegen, wie du das anstellen kannst. Wenn du Einzelheiten nicht auf die Reihe kriegst, kannst du einfach nach ner Lösung googeln oder im Forum nachfragen.
Aber einfach dein "Projekt" hier reinzuschreiben und auf fertigen Code zu hoffen ist der falsche Weg...

sry für Offtopic, das musst mal raus!
Just my 50 Cent.

Gruß USA

Dieser Beitrag wurde von USA bearbeitet: 20. Juli 2008 - 22:41

0

#3 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 20. Juli 2008 - 23:30

Als Ausgleich zum Lernen habe ich kurz einen alten Code von mir an deine Bedürfnisse angepasst. Bei mir hat er eine Produktionsübersicht in Schichten eingeteilt. Ich habe nicht alles durchprobiert, aber der Code sollte soweit funktionieren. Auf das Kommentieren habe ich verzichtet, jedoch sollte der Code leicht zu durchschauen sein:

<?php

$startzeit 	= '21:45';
$endzeit 	= '06:15';

$nachtzuschlag_beginn 	= '22:00';
$nachtzuschlag_ende		= '06:00';
$zuschlag_pro_stunde	= '1.00'; //Euro

$arbeitszeit = arbeitszeit($startzeit, $endzeit, $nachtzuschlag_beginn, $nachtzuschlag_ende, $zuschlag_pro_stunde);

echo 'Arbeitszeit: '.$arbeitszeit['h'].'h '.$arbeitszeit['min'].'min <br />';
echo 'Nachtzuschlag: '.$arbeitszeit['nacht_h'].'h '.$arbeitszeit['nacht_min'].'min, d.h. '.$arbeitszeit['nacht_zuschlag'].' &euro;<br />';

function arbeitszeit($startzeit, $endzeit, $nachtzuschlag_beginn, $nachtzuschlag_ende, $nachtzuschlag) {
	$startzeit	= preg_split('/[.:]/', trim($startzeit));
	$endzeit	= preg_split('/[.:]/', trim($endzeit));
	
	$startzeit	= mktime($startzeit[0], $startzeit[1]);
	$endzeit	= mktime($endzeit[0], $endzeit[1]);
	
	if ($endzeit <= $startzeit) {
		$endzeit += 24*3600; // Endzeit im neuen Tag
	}
	
	$zeitdifferenz = $endzeit - $startzeit;
	
	$zeitdifferenz /= 60;
	
	$return['h'] = floor($zeitdifferenz / 60);
	$return['min'] = $zeitdifferenz % 60;
	$return['g_min'] = $zeitdifferenz;
	
	$nachtzuschlag_beginn	= preg_split('/[.:]/', trim($nachtzuschlag_beginn));
	$nachtzuschlag_ende		= preg_split('/[.:]/', trim($nachtzuschlag_ende));
	
	$nachtzuschlag_beginn	= mktime($nachtzuschlag_beginn[0], $nachtzuschlag_beginn[1]);
	$nachtzuschlag_ende		= mktime($nachtzuschlag_ende[0], $nachtzuschlag_ende[1]) + 24*3600;
	
	$nacht_beginn	= ($nachtzuschlag_beginn < $startzeit)?$startzeit:$nachtzuschlag_beginn;
	$nacht_ende		= ($nachtzuschlag_ende < $endzeit)?$nachtzuschlag_ende:$endzeit;
	
	$nacht_differenz = $nacht_ende - $nacht_beginn;
	$nacht_differenz /= 60;
	
	if ($nacht_differenz > 0) {
		$return['nacht_h'] = floor($nacht_differenz / 60);
		$return['nacht_min'] = $nacht_differenz % 60;
		$return['g_min'] = $nacht_differenz;
		$return['nacht_zuschlag'] = $nacht_differenz * $nachtzuschlag / 60;
	} else {
		$return['nacht_h'] = 0;
		$return['nacht_min'] = 0;
		$return['g_min'] = 0;
		$return['nacht_zuschlag'] = 0;
	}
	
	return $return;
}

?>


Gruß,
Stefan
0

#4 Mitglied ist offline   Gitarremann 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.263
  • Beigetreten: 04. Juni 06
  • Reputation: 3
  • Geschlecht:Männlich
  • Wohnort:Trebnitz

geschrieben 21. Juli 2008 - 01:52

Ich würde die eigentliche Berechnung über den Timestamp machen. So braucht man die Zeiten nicht aufzudröseln und kriegt die Zeitdifferenz mit einer simplen Subtraktion, ohne sich Gedanken machen zu müssen, wenn ein Datumswechsel dazwischenliegt. Die Aufgabe an sich ist ja nun auch nicht wirklich schwer, nur von der Menge her ist es etwas umfangreich, bis man da an alle wenns und abers gedacht hat.

Dieser Beitrag wurde von Gitarremann bearbeitet: 21. Juli 2008 - 01:54

Der Pessimist sagt: "Das Glas ist halb leer,"
Der Optimist sagt: "Das Glas ist halb voll."
Der Realist sagt: "Bedienung, zwei Neue!"
0

#5 Mitglied ist offline   Diewie 

  • Gruppe: aktive Mitglieder
  • Beiträge: 409
  • Beigetreten: 18. Juni 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:Geisenhausen / München

geschrieben 21. Juli 2008 - 08:56

Beitrag anzeigenZitat (Gitarremann: 21.07.2008, 02:52)

Ich würde die eigentliche Berechnung über den Timestamp machen. So braucht man die Zeiten nicht aufzudröseln und kriegt die Zeitdifferenz mit einer simplen Subtraktion, ohne sich Gedanken machen zu müssen, wenn ein Datumswechsel dazwischenliegt. Die Aufgabe an sich ist ja nun auch nicht wirklich schwer, nur von der Menge her ist es etwas umfangreich, bis man da an alle wenns und abers gedacht hat.

Alles mit "echten" Timestamps (also komplettes korrektes Datum + Uhrzeit) zu machen ist generell das Beste (vor allem, wenn man in Nächte mit Zeitumstellung gearbeitet hat bzw. es an einem Tag vor der Zeitumstellung eingibt). Dies erfordert jedoch, dass man im Studenzettel an dem Tag der Eingabe auch ggf. das Datum bei der Endzeit ändern muss (kann man aber auch automatisch machen, so wie bei meinem Code).
Die Berechnungen an sich sind einfachste Schulmathematik, die man leicht herausfindet, wenn man sich auf einen Zettel zwei Intervalle zeichnet und den Deckungsbereich bestimmt. (einfachste min() und max() Funktionen, in meinem Code sind es if-Abfragen die das gleiche machen, die könnten also auch ersetzt werden).
Bei solch eher heiklen Sachen wie Stundenzettel, sollte jedoch die Originaleingabe des Eingebers gespeichert werden, so dass man später ggf. einen Fehler manuell finden und beheben könnte.

Gruß,
Stefan
0

#6 Mitglied ist offline   ps915 

  • Gruppe: aktive Mitglieder
  • Beiträge: 1.119
  • Beigetreten: 17. Mai 07
  • Reputation: 0
  • Geschlecht:Männlich

geschrieben 21. Juli 2008 - 15:31

Zitat

Kannst dir ja nen Konzept überlegen, wie du das anstellen kannst. Wenn du Einzelheiten nicht auf die Reihe kriegst, kannst du einfach nach ner Lösung googeln oder im Forum nachfragen.
Aber einfach dein "Projekt" hier reinzuschreiben und auf fertigen Code zu hoffen ist der falsche Weg...


Das Konzept habe ich mir überlegt und habe auch schon gegoogelt. Mein Problem war nur dass ich nicht weiß, wie ich die Zeiten optimal berechnen kann und konnte eigentlich gar nicht loslegen mit meinem Script.

Ich erwarte von keinem ein fertiges Script, nur auf Tipps, aber evebtuell ist es so rübergekommen da ich mein Problem nicht gut geschildert habe.

@ Diewie
Danke schonmal für deinen Code, werde nun versuchen alleine damit klarzukommen, werde mich trotzdem melden wenn ich kleinere Probleme habe!

@ Gitarremann
Ich würde es auch so machen!

Danke,
Toasterfraktion
0

#7 Mitglied ist offline   schumi0815 

  • Gruppe: aktive Mitglieder
  • Beiträge: 482
  • Beigetreten: 20. Juli 06
  • Reputation: 0
  • Geschlecht:Männlich
  • Wohnort:München

geschrieben 21. Juli 2008 - 15:57

da du keine datumsspanne hast sondern nur einen tag würde ich die zeit in minuten umrechnen und somit alles berechen(ausser natürlich feiertagszuschlag)
	  wenn STARTZEIT kleiner 360min(6 uhr) dann { FRÜHZUSCHLAG1 = 360min - STARTZEIT}
	  wenn STARTZEIT grösser 1320min(22 uhr) dann { SPÄTZUSCHLAG1 = STARTZEIT - 1320min}
	  wenn ENDZEIT kleiner 360min(6 uhr) dann { FRÜHZUSCHLAG2 = 360min - ENDZEIT}
	  wenn ENDZEIT grösser 1320min(22 uhr) dann { SPÄTZUSCHLAG2 = ENDZEIT- 1320min}

	  NACHTZUSCHLAG = FRÜHZUSCHLAG1 + FRÜHZUSCHLAG2 + SPÄTZUSCHLAG1 +SPÄTZUSCHLAG2


//edit: davor evtl runden, jenachdem wie genau abgerechnet wird und dann halt mit anderem faktor als normalzeit in euro umrechnen lassen

zeiten kannst du dir aus dem string auslesen bzw einzelne eingabefelder machen.
beim datum bin ich mir nicht ganz sicher wie man des am besten macht.
entweder für jedes jahr ne tabelle für feiertage + wochenenden anlegen und dann abgleiche oder user angeben lassen obs feiertag oda wochenende ist.
evtl gibts dafür auch eine funktion, die kann ich dann abaer nicht^^

//edit: feiertage + sa + so

Dieser Beitrag wurde von schumi0815 bearbeitet: 21. Juli 2008 - 16:05

0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0