• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Tage zählen

Status
Für weitere Antworten geschlossen.

FleyerShaver

Neues Mitglied
Hi,
ich hab mal wieder ein ganz kleines PHP Problem. Um zwar habe ich das heutige Datum(z.B. 03.11.2008) und ein Endatum(z.B. 16.03.2009). Nun brauche ich ein Script was die Wochentager bis zu diesem Datum zählt und dabei am 04.11.2008 anfängt(als ersren Tag).
Nachher soll folgendes ausgegen werden:
Tage bis zum 16.03.2009
14 x Montag
13 x Dienstag
13 x Mittwoch
...

Hätte jemadn nen guten Lösungsansatz für micht?

Danke schonmal im vorraus
 
Werbung:
Hmm ich würde das glaube ich so lösen:
PHP:
<?php
error_reporting(E_ALL);
class Wochentage {
	public $start;
	public $end;
	public $mondays;
	public $tuesdays;
	public $wednesdays;
	public $thursdays;
	public $fridays;
	public $saturdays;
	public $sundays;
	public function __construct() {
		$this->start = time();
		$this->end = 0;
		$this->mondays = 0;
		$this->tuesdays = 0;
		$this->wednesdays = 0;
		$this->thursdays = 0;
		$this->fridays = 0;
		$this->saturdays = 0;
		$this->sundays = 0;
	}
	public function isOk() {
		if($this->start >= $this->end) {
			return false;
		}
		return true;
	}
	public function countDays() {
		if(!$this->isOK()) return false;
		$correctedStart = mktime(0,0,0, date("m", $this->start), date("d", $this->start), date("Y", $this->start));
		$correctedEnd = mktime(0,0,0, date("m", $this->end), date("d", $this->end), date("Y", $this->end));
		$daysInBetween = ($correctedEnd-$correctedStart)/86400;
		for($i = 1; $i < $daysInBetween; $i++) {
			switch(date("w",($correctedStart+$i*86400))) {
				case 0:
					$this->sundays++;
				break;
				case 1:
					$this->mondays++;
				break;
				case 2:
					$this->tuesdays++;
				break;
				case 3:
					$this->wednesdays++;
				break;
				case 4:
					$this->thursdays++;
				break;
				case 5:
					$this->fridays++;
				break;
				case 6:
					$this->saturdays++;
				break;
			}
		}
        return true;
	}
}

$obj = new Wochentage();
$obj->end = mktime(22,30,00,12,24,2008); //Beispiel Weihnachten '08 22:30:00
if($obj->countDays()) {

	echo "<pre>";
    echo "Zwischen ".date("d.m.y H:i:s", $obj->start)." und ".date("d.m.y H:i:s", $obj->end)." vergehen:\n";
	echo "Montage:\t".$obj->mondays."\n";
	echo "Dienstage:\t".$obj->tuesdays."\n";
	echo "Mittwoche:\t".$obj->wednesdays."\n";
	echo "Donnerstage:\t".$obj->thursdays."\n";
	echo "Freitage:\t".$obj->fridays."\n";
	echo "Samstage:\t".$obj->saturdays."\n";
	echo "Sonntage:\t".$obj->sundays;
	echo "</pre>";
}
else {
	trigger_error("End date is before start date",E_USER_WARNING);
}
?>
HF, vlt kannst du es auch noch verbessern (bzw. ganz sicher kann man das).
 
ich habs so ^^ auch nur n vorschlag :p

PHP:
// deine anfangswerte
$anfang = '01.01.2000';
$ende   = '01.01.2008';

// sinvoll teilen
$anfang = explode('.', $anfang);
$ende   = explode('.', $ende  );

// timestamp hohlen
$anfang = mktime(0, 0, 0, (int)$anfang[1], (int)$anfang[0], (int)$anfang[2]);
$ende   = mktime(0, 0, 0, (int)$ende[1]  , (int)$ende[0]  , (int)$ende[2]  );

// ausrechnen wie viel ein tag ist
$ein_tag = 60 * 60 * 24;

// einen tag hinzufügen weil dus ja so wolltest
$anfang += $ein_tag;

// array erstellen mit default werdewn
$tage = array(
    'mon' => 0,
    'tue' => 0,
    'wed' => 0,
    'thu' => 0,
    'fri' => 0,
    'sat' => 0,
    'sun' => 0
);

// schleife und so ^^
do {
    $tag = strtolower( date('D', $anfang) );
    $anfang += $ein_tag;
    if($tag{0} == 's') { continue; }
    $tage[$tag]++;
} while($anfang <= $ende);

echo '<pre>';
var_dump($tage);
 
Werbung:
Ich zweifel etwas an der Richtigkeit der obrigen Scripte. Ich hab mal versucht eine schnellere Version aus der meines Vorgängers zu basteln:
PHP:
<?php
$anfang = '01.01.2000';
$ende   = '01.01.2008';

// sinvoll teilen
$anfang_e = explode('.', $anfang);
$ende_e   = explode('.', $ende  );

// timestamp hohlen
$anfang = mktime(0, 0, 0, (int)$anfang_e[1], (int)$anfang_e[0], (int)$anfang_e[2]);
$ende   = mktime(0, 0, 0, (int)$ende_e[1]  , (int)$ende_e[0]  , (int)$ende_e[2]  );

// ausrechnen wie viel ein tag ist
$ein_tag = 60 * 60 * 24;

// ab hier neu
$anzahl_tage =  ($ende - $anfang) / $ein_tag;
$anzahl_wochentag = floor($anzahl_tage / 7);

// so, mo, di, mi, do, fr, sa
$wochentage = array($anzahl_wochentag, $anzahl_wochentag, $anzahl_wochentag, $anzahl_wochentag, $anzahl_wochentag, $anzahl_wochentag, $anzahl_wochentag);

$fehlt = $anzahl_tage % 7;

for ($anfang_tag = date('w', $anfang), $i = 0; $i < $fehlt; $i++, $anfang_tag++) {
	$wochentage[$anfang_tag]++;
	if ($anfang_tag > 5) $anfang_tag = -1;
}

print_r($wochentage);
Nur ein bisschen getestet.
 
Zuletzt bearbeitet:
warum zweifelsst du?
wir haben es sogar besser gemacht als du! :-D

wir haben ihm nicht die ganze arbeit abgenommen, du schon... und das ist nicht im sinne des erfinders...

Ps: @ farnk warum sit deine methode isOK public? ;)
 
Nehmen wir nicht letztendlich immer die Arbeit anderer ab? Ich hätte bei der Klasse die Wochentags-Funktionen als Getter gemacht, das hätte einiges an Code sparen können.
 
Werbung:
natürlich hätte es, aber er hat hatl schnell was hingeklatscht, so wie ich um dem kerl zu zeigen wie man es machen kann und nun soll er aus unseren beta versionen release canidates machen :p

es kommt halt auch immer drauf an wie viel ein user kann um ihm zu helfen, wenn nun ein anfänger schreibt hey wie geht das dann wird er solange labern bis wir es ihm fertig gemacht haben oder halt nicht und er verschwindet aus dem forum ^^

oder die elrnwilligen die sich mit enm link auf PHP: Hypertext Preprocessor zufrieden geben da postet man dann halt garkeinen code...

hier hat nur ein kleiner teil and er umsetzung gefehlt und damit man sich was drunter vorstellen kann habenw a halt noch n paar zeilen extra dazu gebastelt :p
 
hi.
warum nicht einfach:

Code:
zeitraum = anfangsdatum - enddatum;
rest = zeitraum mod 7;

montag = (zeitraum-rest)/7;
if(rest > 0) montag += 1;

dienstag= (zeitraum-rest)/7;
if(rest > 1) dienstag += 1;
...
Gruß KY
 
Werbung:
PHP:
<?php

function datums_diff($start,$ende)
{

    $tag = substr($start,6,2);
    $mon = substr($start,4,2);
    $jahr = substr($start,0,4);

    $tag2 = substr($ende,6,2);
    $mon2 = substr($ende,4,2);
    $jahr2 = substr($ende,0,4);

    $datum1 = mktime(0,0,0,$mon,$tag,$jahr);
    $datum2 = mktime(0,0,0,$mon2,$tag2,$jahr2);

    $diff = (($datum2 - $datum1) / 3600 / 24);
    return number_format($diff,0,".",",");
}

$start = "20081103";
$ende = "20090316";
// $ende = date("Ymd"); // heute

echo datums_diff($start,$ende);
?>
 
Danke für die ganze Codeschnipsel. Ich werde sie mir morgen mal alle angucken und mir daraus was zurecht basteln.

Manchmal ist es echt schwer nen die Idee für die Lösungansatz zu bekommen.
 
@Sysop, es geht nicht darum, zu zählen wie viele Tage vergangen sind, sondern wieviele Montage, Dienstage, Mittwoche etc dazwischen liegen
 
Werbung:
Status
Für weitere Antworten geschlossen.
Zurück
Oben