/** * Erweiterungen zu DateTime: * - round() Runden anhand eines DateInterval * - round2() Runden anhand direkten Parametern * - trunc() Abschneiden eines Datumteils * - Ausgabe der Datumselemente ohne format */ class YDateTime extends DateTime{ const KEY_YEAR = 'y'; const KEY_MONTH = 'm'; const KEY_DAY = 'd'; const KEY_HOUR = 'h'; const KEY_MINUTE = 'i'; const KEY_SECOND = 's'; protected $dateParts = array(); protected $datePartsJson = <<format('Y-m-d H:i:s'); //Interne 'Variablen' definieren $this->dateParts = json_decode($this->datePartsJson, true); parent::__construct($time, $timezone); } /** * Akzeptiert nur Einträge aus $formatJson * @param $key: Alle KEY-Konstanten * @throws Exception */ public function __get($key){ if(array_key_exists($key, $this->dateParts)){ return (int)$this->format($this->dateParts[$key]['format']); }else{ throw new Exception("Property '{$key}' dosnt exists"); } } /** * Akzeptiert nur Einträge aus $formatJson * @param $key: Alle KEY-Konstanten * @param $value * @throws Exception */ public function __set($key, $value){ if(array_key_exists($key, $this->dateParts)){ if($this->dateParts[$key]['part'] ==='date'){ //Änderung im Datum parent::setDate( ($key == self::KEY_YEAR) ? $value : $this->y, ($key == self::KEY_MONTH) ? $value : $this->m, ($key == self::KEY_DAY) ? $value : $this->d); }elseif($this->dateParts[$key]['part'] ==='time'){ //Änderung in der Zeit parent::setTime( ($key == self::KEY_HOUR) ? $value : $this->h, ($key == self::KEY_MINUTE) ? $value : $this->i, ($key == self::KEY_SECOND) ? $value : $this->s); } }else{ throw new Exception("Property '{$key}' dosnt exists"); } } /** * @see DateTime::createFromFormat */ public static function createFromFormat($format, $time, $timezone=null ){ return new YDateTime(parent::createFromFormat($format, $time, $timezone)); } /** * rundet den Timestamp auf die Genauigkeit von DateInterval. * Es wird auf den ersten Eintrag im Interval gerundet. Alle * weiteren werden ignoriert: PT1H15M rundet also auf 1 Stunde genau * @todo Runden auf Datum ist nicht so ganz durchdacht * @param DateInterval $delta * @see round() */ public function round(DateInterval $delta, $mode = PHP_ROUND_HALF_UP){ if(!($delta instanceof YDateInterval)) $delta = new YDateInterval($delta); //Richtiger Part aussuchen und runden foreach($this->dateParts as $key => $format) { if($delta->$key != 0){ $this->$key = round( $this->$key / $delta->$key, 0, $mode) * $delta->$key; break; } } //Alles nachfolgende auf 0 setzen $this->trunc($key); } /** * Runden ohne die DateInterval Klasse * @param $key: Alle KEY-Konstanten * @see round() * @throws Exception */ public function round2($key, $precision, $mode = PHP_ROUND_HALF_UP){ if(array_key_exists($key, $this->dateParts)){ //Ein YDateInterval erstellen und $this->round() ausführen $delta = YDateInterval::createFromDateString("{$precision} {$this->dateParts[$key]['string']}"); $this->round($delta); }else{ throw new Exception("Property '{$key}' dosnt exists"); } } /** * Abschneiden der weiteren Informationen. * $date->trunc(YDateTime::KEY_DAY); schneidet alles nach dem Tag ab * @param $key: Alle KEY-Konstanten * @throws Exception */ public function trunc($key){ if(array_key_exists($key, $this->dateParts)){ $zeroFromNow = false; foreach($this->dateParts as $var => $format) { if(!$zeroFromNow && $key == $var){ $zeroFromNow = true; }elseif($zeroFromNow){ $this->$var = $format['zero']; } } }else{ throw new Exception("Property '{$key}' dosnt exists"); } } }