Получить последнее воскресенье дата в PHP
Я использую cron-задание для создания еженедельных отчетов по базе данных. В принципе, скрипт генерации отчетов находится в PHP. Я запланировал ежедневную работу cron.
моя неделя для отчетности начинается в воскресенье.
Я только хочу, чтобы сценарий генерации отчета генерировал отчет за предыдущую неделю с предыдущего воскресенья до предыдущего понедельника.
возьмите, например.
сегодня 4 марта 2013 года. Когда скрипт запускается, он следует создать отчет за 24 февраля 2013 года по 3 марта 2013 года. Завтра, когда сценарий работает, он также должен запускать отчет только за 24 февраля 2013 года до 3 марта 2013 года.
Как я могу получить последние воскресенье автоматически в мой сценарий?
в настоящее время, я жесткий код, используя следующие кнопки:
$startDate = strtotime("13 January 2013");
$strStartDate = date ("Y-m-d 00:00:00", $startDate);
$strEndDate = date ("Y-m-d 23:59:00", $startDate + (6*24*60*60));
любая помощь очень ценится. Спасибо.
6 ответов
В Минувшее Воскресенье
echo date('Y-m-d',strtotime('last sunday'));
Редактировать Ответ:
За Последнее Прошлое Воскресенье
echo date('Y-m-d',strtotime('last sunday -7 days'));
введение
честно говоря, я не уверен, что вы имеете в виду is it possible using function?
но я думаю, вы хотите универсальную функцию, но я думаю, что простой класс также сделает трюк.
наблюдение
он также должен запускать отчет только за 24 февраля 2013 года по 3 марта 2013 года.
обратите внимание, что от Sunday 24 Feb 2013
to Sunday 3 March 2013
is 8 days
и более 1 weeks
что может привести к overlapping
данные, если вы являетесь ploting graphic или использование его для анализа. Я бы предложил вам ограничить его 1 weeks
что это Sunday, 24 Feb 2013
to Saturday, 2 March 2013
вот что я имею в виду
// imagine today is Today is 4 March 2013
$today = DateTime::createFromFormat("d F Y", "4 March 2013");
$date = new PeroidDate();
vprintf("%s to %s", $date->getPeroid($today));
выход
Sunday, 24 February 2013 to Saturday, 02 March 2013
Другие Примеры
Пример 1
// Example
$date = new PeroidDate();
print_r($date->getPeroid());
выход
stdClass Object
(
[start] => Sunday, 31 March 2013
[end] => Saturday, 06 April 2013
)
//or
Sunday, 31 March 2013
Пример 2
давайте представим, что вы хотите получить отчет для before valentine period
то есть " до февраля 14-й"
print_r($date->getPeroid(new DateTime("2013-02-14")));
выход
stdClass Object
(
[start] => Sunday, 03 February 2013
[end] => Saturday, 09 February 2013
)
Пример 3
давайте представим, что вы хотите диапазон дат вместо одного диапазона, например. Вы хотите дату между January 1
st и Current Time
(Вероятно, вы хотите использовать его для выбора), то вы используете PeroidDate::getBetween
print_r($date->getBetween(new DateTime("2013-1-1"), new DateTime()));
выход
Array
(
[0] => stdClass Object
(
[start] => Sunday, 06 January 2013
[end] => Saturday, 12 January 2013
)
[1] => stdClass Object
(
[start] => Sunday, 13 January 2013
[end] => Saturday, 19 January 2013
)
[2] => stdClass Object
(
[start] => Sunday, 20 January 2013
[end] => Saturday, 26 January 2013
)
[3] => stdClass Object
(
[start] => Sunday, 27 January 2013
[end] => Saturday, 02 February 2013
)
[4] => stdClass Object
(
[start] => Sunday, 03 February 2013
[end] => Saturday, 09 February 2013
)
[5] => stdClass Object
(
[start] => Sunday, 10 February 2013
[end] => Saturday, 16 February 2013
)
[6] => stdClass Object
(
[start] => Sunday, 17 February 2013
[end] => Saturday, 23 February 2013
)
[7] => stdClass Object
(
[start] => Sunday, 24 February 2013
[end] => Saturday, 02 March 2013
)
[8] => stdClass Object
(
[start] => Sunday, 03 March 2013
[end] => Saturday, 09 March 2013
)
[9] => stdClass Object
(
[start] => Sunday, 10 March 2013
[end] => Saturday, 16 March 2013
)
[10] => stdClass Object
(
[start] => Sunday, 17 March 2013
[end] => Saturday, 23 March 2013
)
[11] => stdClass Object
(
[start] => Sunday, 24 March 2013
[end] => Saturday, 30 March 2013
)
[12] => stdClass Object
(
[start] => Sunday, 31 March 2013
[end] => Saturday, 06 April 2013
)
[13] => stdClass Object
(
[start] => Sunday, 07 April 2013
[end] => Saturday, 13 April 2013
)
)
Класс
class PeroidDate {
private $format;
private $interval;
function __construct() {
$this->format = "l, d F Y";
$this->interval = new DateInterval('P7D');
}
function setFormat($format) {
$this->format = (string) $format;
}
function setInterval(DateInterval $format) {
$this->format = $format;
}
function getPeroid(\Datetime $date = null) {
$end = $date ? : new DateTime();
$end->modify("Last Sunday");
print_r($end->format($this->format));
$start = clone $end;
$start->sub($this->interval);
$end->modify("-1 day"); //
return (object) array(
"start" => $start->format($this->format),
"end" => $end->format($this->format)
);
}
function getBetween(Datetime $start = null, Datetime $end = null) {
if ($start > $end)
throw new InvalidArgumentException("`Start date` Must be greater than `End date`");
if ($start === null) {
$start = new DateTime();
$start->modify("First Sunday of January");
} else {
$start->modify("First Sunday");
}
if ($end === null) {
$end = new DateTime();
$end->modify("Last Sunday of December");
}
$range = array();
while ( $start < $end ) {
$r = new stdClass();
$r->start = $start->format($this->format);
$start->add($this->interval);
$tmp = clone $start;
$tmp->modify("-1 day");
$r->end = $tmp->format($this->format);
$range[] = $r;
}
return $range;
}
}
<?php
$date=date("Y-m-d");
echo "Current Date : ".$date."<br>";
echo "last Sunday : ".date('Y-m-d', strtotime($date.'last sunday'));
?>
используйте этот код.
echo date('m/d/Y', strtotime('last Sunday'));
вы можете получить в прошлое воскресенье в соответствии с сегодня.
попробуй такое
$sun = date('Y-m-d',strtotime('last sunday'));
echo date('Y-m-d', strtotime('last Sunday', strtotime($sun)));
вернет 2013-02-24
поскольку этот вопрос помечен также MySql, если вам нужно рассчитать интервал в запросе, вы можете использовать что-то вроде этого:
SELECT
'2013-03-04' - INTERVAL (WEEKDAY('2013-03-04')+1) % 7 DAY - INTERVAL 1 WEEK start_date,
'2013-03-04' - INTERVAL (WEEKDAY('2013-03-04')+1) % 7 DAY end_date
затем для создания отчета вы можете просто использовать CURDATE ():
SELECT *
FROM your_tables
WHERE ... AND
report_date BETWEEN
CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) % 7 DAY - INTERVAL 1 WEEK
AND CURDATE() - INTERVAL (WEEKDAY(CURDATE())+1) % 7 DAY