Tage vergleichen und Event anzeigen

1:1 *g*
<= geht mit String -> Punkt für mich
über Jahreswende geht meins nicht -> Punkt für dich

Da er aber die Perioden eh fixcodiert macht (oder in einer Liste) kann man auch einfach 2 Perioden erfassen
"12.25" bis "12.31" und "01.01" bis "01.02"
Soviel mal zur Fragestellung.

Natürlich ists mit Datums schöner, aber auch da muss er in der Jahreswende einen Murks machen, da ja der Code das Jahr hinzufügen sollte...
 
Dann mache ich es halt anders..... das jeweilige Datum ist irgendwo hinterlegt (z.B. in einer Datenbank) oder wird durch ein Formular bestimmt.
PHP:
<?php

    $starttermin = "25.10.2009"; // z.B. Urlaubsbeginn ;)
    $endtermin   = "02.11.2009"; // z.B. Urlaubsende :(
    $termin      = "01.11.2009"; // z.B. Flugtermin

    $datum  = explode(".", $termin);
    $check  = mktime("0", "0", "0", $datum[1], $datum[0], $datum[2]);

    $start  = explode(".", $starttermin);
    $stop   = explode(".", $endtermin);
    $beginn = mktime("0", "0", "0", $start[1], $start[0], $start[2]);
    $ende   = mktime("23", "59", "59", $stop[1], $stop[0], $stop[2]);

    if ($check >= $beginn and $check <= $ende) { // prüfen ob der Flugtermin im Urlaub liegt :p
        echo "Flugtermin liegt im Urlaub. :)";
    } else {
        echo "Flugtermin liegt <u>nicht</u> im Urlaub. :(";
    }

?>
 
Soweit schon klar. Jedoch ist in der DB oder im Code bei Start und End kein Jahr definiert.

Das von dir gezeigte Problem meines Codes ist bei deinem Code leider nicht gelöst.
 
Dann lasse die Jahreszahl doch weg (ist möglich und erlaubt).
Dann kann allerdings wieder nur für das aktuelle Jahr geprüft werden.

Abgesehen davon: vernünftige Leute verwenden eh einen Timestamp..... und wandeln ihn lediglich bei der Ausgabe in ein lesbares Format um..... dann kann man sich das ganze Theater sparen. ;)
 
So, anstatt hier nur mit Theorien rumzuspielen habe ich mich in meiner Mittagspause mal hingesetzt und hab eine kleine Klasse geschrieben, die das Problem löst.

Die eigentlich Funktionalität ist in der function compare() der Klasse Periode. Der Rest ist dazu da, das ganze sinnvoll nutzbar zu machen.

Anwendungsbeispiele findet sich am NEde des Scriptes, nach der Klasse.

PHP:
<?php
/**
* @license  	mpl by ERB software
* @author		stefan.erb(at)erb-software.com
* @example 		see below
*/

/**
 * Class for a periode
 */
class Periode{
	protected $start;
	protected $end;
	protected $perideName;
	
	/**
	 * construct a entity of this class
	 * @param int $start
	 * @param int $end
	 * @param string $perideName
	 */
	public function __construct($start, $end, $perideName){
		$this->start = $start;
		$this->end = $end;
		$this->perideName = $perideName;
	}

	/**
	 * return a timestamp from day, month[, year]
	 * @param int $day
	 * @param int $month
	 * @param int $year
	 * @return int
	 * @access public
	 */
	public static function createTime($day, $month, $year = 0){
		return mktime(0, 0, 0, $month, $day, $year);
	}
	
	/**
	 * compare a timestamp with the periode
	 *
	 * @param int $termin
	 * @return boolean
	 * @access public
	 */
	public function compare($date = time){
		//set the year for the start- and enddate
		$start = $this->changeYear($this->start, idate("Y",$date));
		$end = $this->changeYear($this->end, idate("Y",$date));
		
		#$this->debugDates($termin, $start, $end, "step1");
		
		//change the year if the startdate is in the future of the termin
		if ($start > $date){
			$this->addYear($start, -1);
			$this->addYear($end, -1);
		}
		//change the endyear if the start is in the future of the end
		if ($end < $start) {
			$this->addYear($end, +1);
		}
		
		# $this->debugDates($termin, $start, $end, "step2");
		
		return ($start <= $date && $date <= $end);
	}

	/**
	 * getter for perideName
	 * @return string
	 * @access public
	 */
	public function getPerideName(){
		return $this->perideName;		
	}
	
	/**
	 * get a timestamp from a other timestamp with a new year
	 * @param int $time
	 * @param int $year
	 * @return int
	 * @access protected
	 */
	protected function changeYear($time, $year){
		return $this->createTime(idate("d", $time), iDate("m", $time), $year);
	}
		
	/**
	 * add years to a refereced timestamp
	 * @param int $time
	 * @param int $add
	 * @access protected
	 */
	protected function addYear(&$time, $add){
		$time = $this->createTime(idate("d", $time), iDate("m", $time), idate("Y", $time) + $add);
	}
	
	/**
	 * Debug the periode and the time
	 * @param int $termin
	 * @param int $start
	 * @param int $end
	 * @param string $tag
	 * @access protected
	 */
	protected function debugDates($termin, $start, $end, $tag = ""){
		echo $tag.": termin ".date("d.m.Y", $termin)." between ".date("d.m.Y", $start)." and ".date("d.m.Y", $end)."<br />";
	}
}

# --------------- Example --------------------

/**
 * a small testfunction
 */
function testDate($date, $periodes){
	echo date("d.m.Y", $date).":<br />";
	foreach($periodes as $i => $periode) {
		echo $periode->compare($date) ? "{$periode->getPerideName()} <br />" : ""; 	
	}
}

/** create the testperiodes */
$periodes = array();
array_push($periodes, new Periode(Periode::createTime(25,12), Periode::createTime(02,01),"Weihnachten"));
array_push($periodes, new Periode(Periode::createTime(25,10), Periode::createTime(02,11),"Halloween"));

/** tes different dates */
testDate(Periode::createTime(26,12,2009), $periodes);
testDate(Periode::createTime(01,01,2010), $periodes);
testDate(Periode::createTime(26,10,2012), $periodes);

?>
 
Zurück