Created
May 11, 2015 08:32
-
-
Save jawdatls/62321abc4d3ccdc1773d to your computer and use it in GitHub Desktop.
Calendar Helpfull
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
class Calendar { | |
static $now = 0; | |
function __construct() { | |
Calendar::$now = time(); | |
} | |
function years($start, $end) { | |
$array = array(); | |
foreach(range($start, $end) as $year) { | |
$array[] = $this->year($year); | |
} | |
return new CalendarIterator($array); | |
} | |
function year($year) { | |
return new CalendarYear($year, 1, 1, 0, 0, 0); | |
} | |
function months($year=false) { | |
$year = new CalendarYear($year, 1, 1, 0, 0, 0); | |
return $year->months(); | |
} | |
function month($year, $month) { | |
return new CalendarMonth($year, $month, 1, 0, 0); | |
} | |
function week($year=false, $week=false) { | |
return new CalendarWeek($year, $week); | |
} | |
function days($year=false) { | |
$year = new CalendarYear($year); | |
return $year->days(); | |
} | |
function day($year=false, $month=false, $day=false) { | |
return new CalendarDay($year, $month, $day); | |
} | |
function date() { | |
$args = func_get_args(); | |
if(count($args) > 1) { | |
$year = isset($args[0]) ? $args[0] : false; | |
$month = isset($args[1]) ? $args[1] : 1; | |
$day = isset($args[2]) ? $args[2] : 1; | |
$hour = isset($args[3]) ? $args[3] : 0; | |
$minute = isset($args[4]) ? $args[4] : 0; | |
$second = isset($args[5]) ? $args[5] : 0; | |
} else { | |
if(isset($args[0])) { | |
$ts = (is_int($args[0])) ? $args[0] : strtotime($args[0]); | |
} else { | |
$ts = time(); | |
} | |
if(!$ts) return false; | |
list($year, $month, $day, $hour, $minute, $second) = explode('-', date('Y-m-d-H-i-s', $ts)); | |
} | |
return new CalendarDay($year, $month, $day, $hour, $minute, $second); | |
} | |
function today() { | |
return $this->date('today'); | |
} | |
function now() { | |
return $this->today(); | |
} | |
function tomorrow() { | |
return $this->date('tomorrow'); | |
} | |
function yesterday() { | |
return $this->date('yesterday'); | |
} | |
} | |
class CalendarIterator implements Iterator { | |
private $_ = array(); | |
public function __construct($array=array()) { | |
$this->_ = $array; | |
} | |
function __toString() { | |
$result = ''; | |
foreach($this->_ as $date) { | |
$result .= $date . '<br />'; | |
} | |
return $result; | |
} | |
function rewind() { | |
reset($this->_); | |
} | |
function current() { | |
return current($this->_); | |
} | |
function key() { | |
return key($this->_); | |
} | |
function next() { | |
return next($this->_); | |
} | |
function prev() { | |
return prev($this->_); | |
} | |
function valid() { | |
$key = key($this->_); | |
$var = ($key !== null && $key !== false); | |
return $var; | |
} | |
function count() { | |
return count($this->_); | |
} | |
function first() { | |
return array_shift($this->_); | |
} | |
function last() { | |
return array_pop($this->_); | |
} | |
function nth($n) { | |
$values = array_values($this->_); | |
return isset($values[$n]) ? $values[$n] : null; | |
} | |
function indexOf($needle) { | |
return array_search($needle, array_values($this->_)); | |
} | |
function toArray() { | |
return $this->_; | |
} | |
function slice($offset=null, $limit=null) { | |
if($offset === null && $limit === null) return $this; | |
return new CalendarIterator(array_slice($this->_, $offset, $limit)); | |
} | |
function limit($limit) { | |
return $this->slice(0, $limit); | |
} | |
} | |
class CalendarObj { | |
var $yearINT; | |
var $monthINT; | |
var $dayINT; | |
var $hourINT; | |
var $minuteINT; | |
var $secondINT; | |
var $timestamp = 0; | |
function __construct($year=false, $month=1, $day=1, $hour=0, $minute=0, $second=0) { | |
if(!$year) $year = date('Y'); | |
if(!$month) $month = date('m'); | |
if(!$day) $day = date('d'); | |
$this->yearINT = intval($year); | |
$this->monthINT = intval($month); | |
$this->dayINT = intval($day); | |
$this->hourINT = intval($hour); | |
$this->minuteINT = intval($minute); | |
$this->secondINT = intval($second); | |
// convert this to timestamp | |
$this->timestamp = mktime($hour, $minute, $second, $month, $day, $year); | |
} | |
function year($year=false) { | |
if(!$year) $year = $this->yearINT; | |
return new CalendarYear($year, 1, 1, 0, 0, 0); | |
} | |
function month($month=false) { | |
if(!$month) $month = $this->monthINT; | |
return new CalendarMonth($this->yearINT, $month, 1, 0, 0, 0); | |
} | |
function day($day=false) { | |
if(!$day) $day = $this->dayINT; | |
return new CalendarDay($this->yearINT, $this->monthINT, $day, 0, 0, 0); | |
} | |
function hour($hour=false) { | |
if(!$hour) $hour = $this->hourINT; | |
return new CalendarHour($this->yearINT, $this->monthINT, $this->dayINT, $hour, 0, 0); | |
} | |
function minute($minute=false) { | |
if(!$minute) $minute = $this->minuteINT; | |
return new CalendarMinute($this->yearINT, $this->monthINT, $this->dayINT, $this->hourINT, $minute, 0); | |
} | |
function second($second=false) { | |
if(!$second) $second = $this->secondINT; | |
return new CalendarSecond($this->yearINT, $this->monthINT, $this->dayINT, $this->hourINT, $this->minuteINT, $second); | |
} | |
function timestamp() { | |
return $this->timestamp; | |
} | |
function __toString() { | |
return date('Y-m-d H:i:s', $this->timestamp); | |
} | |
function format($format) { | |
return date($format, $this->timestamp); | |
} | |
function iso() { | |
return date(DATE_ISO, $this->timestamp); | |
} | |
function cookie() { | |
return date(DATE_COOKIE, $this->timestamp); | |
} | |
function rss() { | |
return date(DATE_RSS, $this->timestamp); | |
} | |
function atom() { | |
return date(DATE_ATOM, $this->timestamp); | |
} | |
function mysql() { | |
return date('Y-m-d H:i:s', $this->timestamp); | |
} | |
function time() { | |
return strftime('%T', $this->timestamp); | |
} | |
function ampm() { | |
return strftime('%p', $this->timestamp); | |
} | |
function modify($string) { | |
$ts = (is_int($string)) ? $this->timestamp+$string : strtotime($string, $this->timestamp); | |
list($year, $month, $day, $hour, $minute, $second) = explode('-', date('Y-m-d-H-i-s', $ts)); | |
return new CalendarDay($year, $month, $day, $hour, $minute, $second); | |
} | |
function plus($string) { | |
$modifier = (is_int($string)) ? $string : '+' . $string; | |
return $this->modify($modifier); | |
} | |
function add($string) { | |
return $this->plus($string); | |
} | |
function minus($string) { | |
$modifier = (is_int($string)) ? -$string : '-' . $string; | |
return $this->modify($modifier); | |
} | |
function sub($string) { | |
return $this->minus($string); | |
} | |
function dmy() { | |
return $this->format('d.m.Y'); | |
} | |
function padded() { | |
return str_pad($this->int(),2,'0',STR_PAD_LEFT); | |
} | |
} | |
class CalendarYear extends CalendarObj { | |
function __toString() { | |
return $this->format('Y'); | |
} | |
function int() { | |
return $this->yearINT; | |
} | |
function months() { | |
$array = array(); | |
foreach(range(1, 12) as $month) { | |
$array[] = $this->month($month); | |
} | |
return new CalendarIterator($array); | |
} | |
function month($month=1) { | |
return new CalendarMonth($this->yearINT, $month); | |
} | |
function weeks() { | |
$array = array(); | |
$weeks = (int)date('W', mktime(0,0,0,12,31,$this->int))+1; | |
foreach(range(1,$weeks) as $week) { | |
$array[] = new CalendarWeek($this, $week); | |
} | |
return new CalendarIterator($array); | |
} | |
function week($week=1) { | |
return new CalendarWeek($this, $week); | |
} | |
function countDays() { | |
return (int)date('z', mktime(0,0,0,12,31,$this->yearINT))+1; | |
} | |
function days() { | |
$days = $this->countDays(); | |
$array = array(); | |
$ts = false; | |
for($x=0; $x<$days; $x++) { | |
$ts = (!$ts) ? $this->timestamp : strtotime('tomorrow', $ts); | |
$month = date('m', $ts); | |
$day = date('d', $ts); | |
$array[] = $this->month($month)->day($day); | |
} | |
return new CalendarIterator($array); | |
} | |
function next() { | |
return $this->plus('1year')->year(); | |
} | |
function prev() { | |
return $this->minus('1year')->year(); | |
} | |
function name() { | |
return $this->int(); | |
} | |
function firstMonday() { | |
$cal = new Calendar(); | |
return $cal->date(strtotime('first monday of ' . date('Y', $this->timestamp))); | |
} | |
function firstSunday() { | |
$cal = new Calendar(); | |
return $cal->date(strtotime('first sunday of ' . date('Y', $this->timestamp))); | |
} | |
} | |
class CalendarMonth extends CalendarObj { | |
function __toString() { | |
return $this->format('Y-m'); | |
} | |
function int() { | |
return $this->monthINT; | |
} | |
function weeks($force=false) { | |
$first = $this->firstDay(); | |
$week = $first->week(); | |
$currentMonth = $this->int(); | |
$nextMonth = $this->next()->int(); | |
$max = ($force) ? $force : 6; | |
for($x=0; $x<$max; $x++) { | |
// make sure not to add weeks without a single day in the same month | |
if(!$force && $x>0 && $week->firstDay()->month()->int() != $currentMonth) break; | |
$array[] = $week; | |
// make sure not to add weeks without a single day in the same month | |
if(!$force && $week->lastDay()->month()->int() != $currentMonth) break; | |
$week = $week->next(); | |
} | |
return new CalendarIterator($array); | |
} | |
function countDays() { | |
return date('t', $this->timestamp); | |
} | |
function firstDay() { | |
return new CalendarDay($this->yearINT, $this->monthINT, 1); | |
} | |
function lastDay() { | |
return new CalendarDay($this->yearINT, $this->monthINT, $this->countDays()); | |
} | |
function days() { | |
// number of days per month | |
$days = date('t', $this->timestamp); | |
$array = array(); | |
$ts = $this->firstDay()->timestamp(); | |
foreach(range(1, $days) as $day) { | |
$array[] = $this->day($day); | |
} | |
return new CalendarIterator($array); | |
} | |
function day($day=1) { | |
return new CalendarDay($this->yearINT, $this->monthINT, $day); | |
} | |
function next() { | |
return $this->plus('1month')->month(); | |
} | |
function prev() { | |
return $this->minus('1month')->month(); | |
} | |
function name() { | |
return strftime('%B', $this->timestamp); | |
} | |
function shortname() { | |
return strftime('%b', $this->timestamp); | |
} | |
} | |
class CalendarWeek extends CalendarObj { | |
function __toString() { | |
return $this->firstDay()->format('Y-m-d') . ' - ' . $this->lastDay()->format('Y-m-d'); | |
} | |
var $weekINT; | |
function int() { | |
return $this->weekINT; | |
} | |
function __construct($year=false, $week=false) { | |
if(!$year) $year = date('Y'); | |
if(!$week) $week = date('W'); | |
$this->yearINT = intval($year); | |
$this->weekINT = intval($week); | |
$ts = strtotime('Thursday', strtotime($year . 'W' . $this->padded())); | |
$monday = strtotime('-3days', $ts); | |
parent::__construct(date('Y', $monday), date('m', $monday), date('d', $monday), 0, 0, 0); | |
} | |
function years() { | |
$array = array(); | |
$array[] = $this->firstDay()->year(); | |
$array[] = $this->lastDay()->year(); | |
// remove duplicates | |
$array = array_unique($array); | |
return new CalendarIterator($array); | |
} | |
function months() { | |
$array = array(); | |
$array[] = $this->firstDay()->month(); | |
$array[] = $this->lastDay()->month(); | |
// remove duplicates | |
$array = array_unique($array); | |
return new CalendarIterator($array); | |
} | |
function firstDay() { | |
$cal = new Calendar(); | |
return $cal->date($this->timestamp); | |
} | |
function lastDay() { | |
$first = $this->firstDay(); | |
return $first->plus('6 days'); | |
} | |
function days() { | |
$day = $this->firstDay(); | |
$array = array(); | |
for($x=0; $x<7; $x++) { | |
$array[] = $day; | |
$day = $day->next(); | |
} | |
return new CalendarIterator($array); | |
} | |
function next() { | |
$next = strtotime('Thursday next week', $this->timestamp); | |
$year = date('Y', $next); | |
$week = date('W', $next); | |
return new CalendarWeek($year, $week); | |
} | |
function prev() { | |
$prev = strtotime('Monday last week', $this->timestamp); | |
$year = date('Y', $prev); | |
$week = date('W', $prev); | |
return new CalendarWeek($year, $week); | |
} | |
} | |
class CalendarDay extends CalendarObj { | |
function __toString() { | |
return $this->format('Y-m-d'); | |
} | |
function int() { | |
return $this->dayINT; | |
} | |
function week() { | |
$week = date('W', $this->timestamp); | |
$year = ($this->monthINT == 1 && $week > 5) ? $this->year()->prev() : $this->year(); | |
return new CalendarWeek($year->int(), $week); | |
} | |
function next() { | |
return $this->plus('1day'); | |
} | |
function prev() { | |
return $this->minus('1day'); | |
} | |
function weekday() { | |
return date('N', $this->timestamp); | |
} | |
function name() { | |
return strftime('%A', $this->timestamp); | |
} | |
function shortname() { | |
return strftime('%a', $this->timestamp); | |
} | |
function isToday() { | |
$cal = new Calendar(); | |
return $this == $cal->today(); | |
} | |
function isYesterday() { | |
$cal = new Calendar(); | |
return $this == $cal->yesterday(); | |
} | |
function isTomorrow() { | |
$cal = new Calendar(); | |
return $this == $cal->tomorrow(); | |
} | |
function isInThePast() { | |
return ($this->timestamp < Calendar::$now) ? true : false; | |
} | |
function isInTheFuture() { | |
return ($this->timestamp > Calendar::$now) ? true : false; | |
} | |
function isWeekend() { | |
$num = $this->format('w'); | |
return ($num == 0) ? true : false; | |
} | |
function hours() { | |
$obj = $this; | |
$array = array(); | |
while($obj->int() == $this->int()) { | |
$array[] = $obj->hour(); | |
$obj = $obj->plus('1hour'); | |
} | |
return new CalendarIterator($array); | |
} | |
} | |
class CalendarHour extends CalendarObj { | |
function int() { | |
return $this->hourINT; | |
} | |
function minutes() { | |
$obj = $this; | |
$array = array(); | |
while($obj->hourINT == $this->hourINT) { | |
$array[] = $obj; | |
$obj = $obj->plus('1minute')->minute(); | |
} | |
return new CalendarIterator($array); | |
} | |
function next() { | |
return $this->plus('1hour')->hour(); | |
} | |
function prev() { | |
return $this->minus('1hour')->hour(); | |
} | |
} | |
class CalendarMinute extends CalendarObj { | |
function int() { | |
return $this->minuteINT; | |
} | |
function seconds() { | |
$obj = $this; | |
$array = array(); | |
while($obj->minuteINT == $this->minuteINT) { | |
$array[] = $obj; | |
$obj = $obj->plus('1second')->second(); | |
} | |
return new CalendarIterator($array); | |
} | |
function next() { | |
return $this->plus('1minute')->minute(); | |
} | |
function prev() { | |
return $this->minus('1minute')->minute(); | |
} | |
} | |
class CalendarSecond extends CalendarObj { | |
function int() { | |
return $this->secondINT; | |
} | |
function next() { | |
return $this->plus('1second')->second(); | |
} | |
function prev() { | |
return $this->minus('1second')->second(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment