• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Anzahl eines Wochentags zwischen 2 Daten

Splitt3r

New member
Hallo,

Ich möchte zwischen zwei Datumsangaben die Anzahl der (zb.) Donnerstage zählen.

Die Datumsangaben belaufen sich immer zwischen 28 und 31 tagen

Beispiele:

-> 15.01.2010 - 15.02.2010
-> 06.05.2010 - 06.06.2010
-> 21.11.2010 - 21.12.2010

Die Frage an die Funktion:
Wieviel Donnerstage sind zwischen datum1 und datum2?


Hat jemand von euch einen Denkansatz wie man das realisieren könnte oder sogar ein praktisches beispiel?

Ich komme nicht auf die Lösung.


Viele Grüße
 
so habe ich es mal gemacht:
PHP:
$von = gmmktime(0,0,0,12,10,2009);  
$bis = gmmktime(0,0,0,12,17,2009);  
$tage = ($bis-$von)/(60*60*24);
$wochen = floor($tage/7);
$rest = ($tage/7-$wochen)*7;
for ($i=0;$i<$rest+1;$i++)
{
$tageswert = gmstrftime("%w", $von+($i*60*60*24 ));
$days[$tageswert] = 1;
}

for ($i=0;$i<7;$i++)
{
$days[$i] = $days[$i] + $wochen;
echo $days[$i]."<br>";
}
 
Zuletzt bearbeitet:
1. Ich glaube bei diesem Problem ist es unerheblich, ob man die gm... Funktionen benutzt oder nicht - deswegen würde ich die ohne benutzen, da sie etwas schneller sind
PHP Manual schrieb:
gmmktime() internally uses mktime()
2. @andy83: Du solltest dir dringend alle Fehler und Warnungen in PHP ausgeben lassen - da sind ein paar Indizes nicht initialisiert.
3. Den Rest ein Division bekommt man viel einfacher durch eine Modulorechnung:
Code:
$rest = $tage % 7;
 
Herzlichen Dank! :), jedoch glaube ich dass die funktion noch nicht ganz korrekt funktioniert.

Folgender Sachverhalt:

vom 08.01.2010
bis 08.02.2010


Die funktion zeigt: Der 08.01 ist ein Freitag, die funktion gibt aus, dass der Freitag 5 mal vertreten ist.

Zählen wir mal:

08.01 -> Freitag
15.01 -> Freitag
22.01 -> Freitag
29.01 -> Freitag
05.02 -> Freitag,

es ist also korrekt gerechnet worden, inklusive dem starttag (08.01) sind es 5 Freitage.

Nun das problem:

vom 05.01.2010
bis 05.02.2010


Die funktion sagt 4 Freitage, rechnen wir nach:

08.01 -> Freitag
15.01 -> Freitag
22.01 -> Freitag
29.01 -> Freitag
05.02 -> Freitag

Es sind aber 5 Freitage, denn der 05.02.2010 ist ja noch der letzte tag des Datums was ermittelt werden soll, in der ersten Rechnung (08.01. - 08.01) hat die Funktion ja auch den starttag (08.01) mitgezählt.


Woran liegt das?


Hier das Script:

PHP:
<?php
error_reporting(E_ALL);

$von = mktime(0,0,0,01,05,2010);  
$bis = mktime(0,0,0,02,05,2010);  


$tage = ($bis-$von)/(60*60*24);

$wochen = floor($tage/7);
$rest = $tage % 7;

$days = array(0, 0, 0, 0, 0, 0, 0);

for ($i=0;$i<$rest+1;$i++)
{
$tageswert = gmstrftime("%w", $von+($i*60*60*24 ));
$days[$tageswert] = 1;
}

for ($i=0;$i<7;$i++)
{
$days[$i] = $days[$i] + $wochen;
}  

print_r($days);
?>
 
Zuletzt bearbeitet:
INFO!

Ich habe nun testweise die Verbesserung von kkapsner:

PHP:
$rest = $tage % 7;

herausgenommen und durch die alte ersetzt:

PHP:
$rest = ($tage/7-$wochen)*7;


Nun rechnet er korrekterweise 5 Freitage, wie kann das sein?
 
Wie verrückt ist das denn?

PHP:
$rest = ($tage/7-$wochen)*7;

$rest = 3

PHP:
$rest = $tage % 7;

$rest = 3


Es ergibt beides 3, aber der Wert von Freitag ist beim ersten 5 und beim zweiten nur 4!
 
Zuletzt bearbeitet:
Dein Starttag hat im Intervall 24h, dein Endtag 0 Sek. Ich vermute irgendwo kleine Rechenungenauigkeiten. Was hindert dich, den Endtag einige Sekunden zuzugeben ?
 
@jsprit ich habe dem Endtag 23 Stunden hinzugegeben aber leider stehts dann immernoch bei 4 Freitagen.

Mit der Variante $rest = ($tage/7-$wochen)*7; scheint es ja zu funktionieren, hoffe nur das war kein zufall
 
AHA, wenn ich zum endtag noch 23 Stunden 59 min. und 59 sec dazu rechne kommt bei den beiden varianten folgendes raus:

echo ($tage/7-$wochen)*7;

= 3.99998842593


echo $tage % 7;

=3
 
Zuletzt bearbeitet:
Rechenungenauigkeit:
Code:
$rest = $tage % 7;
echo ($rest-3) . "<br>\n";
$rest = ($tage/7-$wochen)*7;
echo ($rest-3) . "<br>\n";
 
Und hier noch was Nettes:
Code:
for ($i = 0; $i <= $rest; $i++){
	$tageswert = gmstrftime("%w", $von+($i*60*60*24 ));
	echo gmdate("r", $von + ($i*60*60*24)) . "<br>\n";
	echo date("r", $von + ($i*60*60*24)) . "<br>\n";
	echo $tageswert . "<br>\n";
	$days[$tageswert] = 1;
}
- die gm...-Funktionsreferenz sollte man sich ev. zuerst ansehen und dann erst verwenden ;)
 
Zurück
Oben