diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:44:51 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:44:51 +0000 |
commit | a1ec78bf0dc93d0e05e5f066f1949dc3baecea06 (patch) | |
tree | ee596ce1bc9840661386f96f9b8d1f919a106317 /vendor/gipfl/calendar/src/Calendar.php | |
parent | Initial commit. (diff) | |
download | icingaweb2-module-incubator-a1ec78bf0dc93d0e05e5f066f1949dc3baecea06.tar.xz icingaweb2-module-incubator-a1ec78bf0dc93d0e05e5f066f1949dc3baecea06.zip |
Adding upstream version 0.20.0.upstream/0.20.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/gipfl/calendar/src/Calendar.php')
-rw-r--r-- | vendor/gipfl/calendar/src/Calendar.php | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/vendor/gipfl/calendar/src/Calendar.php b/vendor/gipfl/calendar/src/Calendar.php new file mode 100644 index 0000000..e81227c --- /dev/null +++ b/vendor/gipfl/calendar/src/Calendar.php @@ -0,0 +1,246 @@ +<?php + +namespace gipfl\Calendar; + +use gipfl\Format\LocalTimeFormat; +use InvalidArgumentException; + +class Calendar +{ + const FIRST_IS_MONDAY = 1; + const FIRST_IS_SUNDAY = 0; + + protected $firstOfWeek; + + protected $weekDays = []; + + protected $shortWeekDays = []; + + protected $timeFormat; + + public function __construct($firstOfWeek = self::FIRST_IS_MONDAY) + { + $this->timeFormat = new LocalTimeFormat(); + $this->setFirstOfWeek($firstOfWeek); + } + + public function firstOfWeekIsMonday() + { + return $this->firstOfWeek === self::FIRST_IS_MONDAY; + } + + public function firstOfWeekIsSunday() + { + return $this->firstOfWeek === self::FIRST_IS_SUNDAY; + } + + public function setFirstOfWeek($firstOfWeek) + { + if ($firstOfWeek === self::FIRST_IS_SUNDAY || $firstOfWeek === self::FIRST_IS_MONDAY) { + if ($firstOfWeek !== $this->firstOfWeek) { + $this->firstOfWeek = $firstOfWeek; + $this->prepareWeekDays(); + } + + return $this; + } else { + throw new InvalidArgumentException( + "First day of week has to be either 0 or 1, got '$firstOfWeek'" + ); + } + } + + protected function prepareWeekDays() + { + if ($this->firstOfWeekIsSunday()) { + $start = '2019-02-03'; + } else { + $start = '2019-02-04'; + } + + for ($i = 0; $i < 7; $i++) { + $day = strtotime("$start +{$i}days"); + $this->weekDays[] = $this->timeFormat->getWeekdayName($day); + $this->shortWeekDays[] = $this->timeFormat->getShortWeekdayName($day); + } + } + + public function listWeekDayNames() + { + return $this->weekDays; + } + + public function listShortWeekDayNames() + { + return $this->shortWeekDays; + } + + /** + * Either 'N' or 'w', depending on the first day of week + * + * @return string + */ + protected function getDowFormat() + { + if ($this->firstOfWeekIsMonday()) { + // N -> 1-7 (Mo-Su) + return 'N'; + } else { + // w -> 0-6 (Su-Sa) + return 'w'; + } + } + + /** + * @param $time + * @return int + */ + protected function getWeekDay($time) + { + return (int) date($this->getDowFormat(), $time); + } + + /** + * @param int $now + * @return array + */ + public function getDaysForWeek($now) + { + $formatDow = $this->getDowFormat(); + $today = date('Y-m-d', $now); + $day = $this->getFirstDayOfWeek($today); + $weekday = (int) date($formatDow, strtotime($day)); + $week = [$weekday => $day]; + for ($i = 1; $i < 7; $i++) { + $day = date('Y-m-d', strtotime("$day +1day")); + $weekday = (int) date($formatDow, strtotime($day)); + $week[$weekday] = $day; + } + + return $week; + } + + /** + * @param int $now + * @return array + */ + public function getWorkingDaysForWeek($now) + { + $formatDow = $this->getDowFormat(); + $today = date('Y-m-d', $now); + $day = $this->getFirstDayOfWeek($today, self::FIRST_IS_MONDAY); + $weekday = (int) date($formatDow, strtotime($day)); + $week = [$weekday => $day]; + for ($i = 1; $i < 5; $i++) { + $day = date('Y-m-d', strtotime("$day +1day")); + $weekday = (int) date($formatDow, strtotime($day)); + $week[$weekday] = $day; + } + + return $week; + } + + /** + * @param string $day + * @param int $firstOfWeek + * @return string + */ + public function getFirstDayOfWeek($day, $firstOfWeek = null) + { + if ($firstOfWeek === null) { + $firstOfWeek = $this->firstOfWeek; + } + $dow = $this->getWeekDay(strtotime($day)); + if ($dow > $firstOfWeek) { + $sub = $dow - $firstOfWeek; + return date('Y-m-d', strtotime("$day -{$sub}day")); + } else { + return $day; + } + } + + /** + * @param string $day + * @param int $firstOfWeek + * @return string + */ + protected function getLastDayOfWeek($day, $firstOfWeek = null) + { + if ($firstOfWeek === null) { + $firstOfWeek = $this->firstOfWeek; + } + $dow = $this->getWeekDay(strtotime($day)); + $lastOfWeek = $firstOfWeek + 6; + if ($dow < $lastOfWeek) { + $add = $lastOfWeek - $dow; + return static::expressionToDate(static::incDay($day, $add)); + } else { + return $day; + } + } + + public function getWeekOfTheYear($day) + { + $time = strtotime($day); + // 0 = Sunday + if ($this->firstOfWeekIsSunday() && $this->getWeekDay($time) === 0) { + if (substr($time, 4, 6) === '-12-31') { + return (int) date('W', strtotime(static::decDay($day))); + } else { + return (int) date('W', strtotime(static::incDay($day))); + } + } else { + return (int) date('W', $time); + } + } + + /** + * @param int $now + * @return array + */ + public function getWeeksForMonth($now) + { + $first = date('Y-m-01', $now); + $last = date('Y-m-d', strtotime("$first +1month -1day")); + + $formatDow = $this->getDowFormat(); + $end = $this->getLastDayOfWeek($last); + $day = $this->getFirstDayOfWeek($first); + $formerWeekOfTheYear = 0; + $weeks = []; + while ($day <= $end) { + $weekOfTheYear = $this->getWeekOfTheYear($day); + if ($weekOfTheYear !== $formerWeekOfTheYear) { + $weeks[$weekOfTheYear] = []; + $week = & $weeks[$weekOfTheYear]; + } + + $weekday = (int) date($formatDow, strtotime($day)); + $week[$weekday] = $day; + $day = date('Y-m-d', strtotime("$day +1day")); + $formerWeekOfTheYear = $weekOfTheYear; + } + + return $weeks; + } + + protected static function expressionToDate($expression) + { + return date('Y-m-d', strtotime($expression)); + } + + /** + * @param string $day + * @param int $increment days to add + * @return string + */ + protected static function incDay($day, $increment = 1) + { + return sprintf('%s +%dday', $day, $increment); + } + + protected static function decDay($day, $decrement = 1) + { + return sprintf('%s -%dday', $day, $decrement); + } +} |