<?php
$initialDate = DateTime::createFromFormat('U', '1409611999');
$initialDate = new DateTimeExtended($initialDate);
$firstDayofWeek = clone $initialDate;
$lastDayofWeek = clone $initialDate;
$firstDayofWeek->setDayOfWeek('Monday', DateTimeExtended::WEEK_CURRENT);
$lastDayofWeek->setDayOfWeek('Sunday', DateTimeExtended::WEEK_CURRENT);
var_dump($firstDayofWeek, $lastDayofWeek);
class DateTimeExtended Extends DateTime {
const WEEK_CURRENT = 0;
const WEEK_NEXT = 1;
const WEEK_PREVIOUS = 2;
protected static $days_of_week = array('sunday',
'monday',
'tuesday',
'wednesday',
'thursday',
'friday',
'saturday',
);
public function __construct()
{
$args = func_get_args();
if (empty($args)) {
throw new Exception('No argument supplied!');
}
if ($args[0] instanceof DateTime) {
parent::__construct($args[0]->format('Y-m-d H:i:s'), $args[0]->getTimezone());
} else {
parent::__construct($args[0], isset($arg[1]) ? $arg[1] : null);
}
}
public function setDayOfWeek($day, $margin = 0)
{
$day = strtolower($day);
if (!is_int($day)) {
$day = array_search($day, static::$days_of_week);
}
$current_day = $this->format('w');
switch($margin) {
case static::WEEK_CURRENT:
$interval = $day - $current_day;
break;
case static::WEEK_NEXT:
$interval = 1;
while($interval <= 7) {
$current_day = ($current_day + 1) % 7;
if ($current_day == $day) {
break;
}
$interval++;
}
break;
case static::WEEK_PREVIOUS:
$interval = -1;
while($interval >= -7) {
$current_day -= 1;
if ($current_day < 0) {
$current_day = 6;
}
if ($current_day == $day) {
break;
}
$interval--;
}
break;
default:
throw new Exception('Invalid margin supplied!');
}
$i = abs($interval);
$days = new DateInterval("P{$i}D");
if ($interval < 0) {
$this->sub($days);
} else {
$this->add($days);
}
return $this;
}
}
preferences:
41.71 ms | 402 KiB | 5 Q