Получить последнее воскресенье дата в 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 1st и 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