Получить начало и конец дней для данной недели в PHP

В соответствии с рекомендациями по оптимизации Intel и AMD смешивание типов op с типами данных приводит к удару по производительности, поскольку ЦП внутренне пропускает 64-битные половинки регистра для определенного типа данных. Это, по-видимому, в основном влияет на облицовку труб, когда команда декодируется, и запланированы команды. Функционально они дают одинаковый результат. Более новые версии для целых типов данных имеют большую кодировку и занимают больше места в сегменте кода. Поэтому, если размер кода является проблемой, используйте старые операционные системы, поскольку они имеют меньшую кодировку.

29
задан Zahymaka 29 May 2009 в 00:44
поделиться

7 ответов

Я бы хотел воспользоваться преимуществами PHP strtotime :

function x_week_range(&$start_date, &$end_date, $date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    $start_date = date('Y-m-d', $start);
    $end_date = date('Y-m-d', strtotime('next saturday', $start));
}

Протестировано на предоставленных вами данных, и оно работает. Однако мне не особенно нравится вся ваша справочная информация. Если бы это была моя функция, я бы сделал это так:

function x_week_range($date) {
    $ts = strtotime($date);
    $start = (date('w', $ts) == 0) ? $ts : strtotime('last sunday', $ts);
    return array(date('Y-m-d', $start),
                 date('Y-m-d', strtotime('next saturday', $start)));
}

И назову это так:

list($start_date, $end_date) = x_week_range('2009-05-10');

Я не большой поклонник математических вычислений для подобных вещей. Сроки непростые, и я предпочитаю, чтобы PHP выяснил это.

86
ответ дан 27 November 2019 в 22:58
поделиться

Теперь вы можете использовать DateTime для получения даты начала / окончания недели

function getDateRangeForAllWeeks($start, $end){
    $fweek = getDateRangeForWeek($start);
    $lweek = getDateRangeForWeek($end);
    $week_dates = [];
    while($fweek['sunday']!=$lweek['sunday']){
        $week_dates [] = $fweek;
        $date = new DateTime($fweek['sunday']);
        $date->modify('next day');

        $fweek = getDateRangeForWeek($date->format("Y-m-d"));
    }
    $week_dates [] = $lweek;

    return $week_dates;
}

function getDateRangeForWeek($date){
    $dateTime = new DateTime($date);
    $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
    $sunday = clone $dateTime->modify('Sunday this week'); 
    return ['monday'=>$monday->format("Y-m-d"), 'sunday'=>$sunday->format("Y-m-d")];
}

Использование

print_r( getDateRangeForWeek("2016-05-07") );

print_r( getDateRangeForAllWeeks("2015-11-07", "2016-02-15") );
1
ответ дан Waqas 29 May 2009 в 00:44
поделиться

Пытаясь найти более упорядоченную версию принятого ответа Паоло Бергантино, я нашел действительно хороший способ сделать это:

function x_week_range2($date) {
  $ts = strtotime($date);
  $start = strtotime('sunday this week -1 week', $ts);
  $end = strtotime('sunday this week', $ts);
  return array(date('Y-m-d', $start), date('Y-m-d', $end));
}

Строка «Воскресенье на этой неделе» всегда означает « Воскресенье в конце этой недели. " Если используется метка времени, приходящаяся на воскресенье, это будет следующее воскресенье. Это позволяет избежать необходимости использования троичного оператора в решении Паолы.

1
ответ дан CoreDumpError 29 May 2009 в 00:44
поделиться

Не делая так много манипуляций со строками, вы можете сделать несколько простых математических операций с временными метками.

function getDateRange(&$start, &$end, $date) {
  $seconds_in_day = 86400;
  $day_of_week = date("w", $date); 
  $start = $date - ($day_of_week * $seconds_in_day);
  $end = $date + ((6 - $day_of_week) * $seconds_in_day);
}
0
ответ дан Clay 29 May 2009 в 00:44
поделиться

Очевидно значение форматирования 'w' для date () или метод форматирования объекта DateTime вернет день недели в виде числа (по умолчанию 0 = воскресенье, 1 = понедельник, и т.д.)

Вы можете взять это значение и вычесть его значение в днях из текущего дня, чтобы найти начало недели.

$start_date = new DateTime("2009-05-13");
$day_of_week = $start_date->format("w");

$start_date->modify("-$day_of_week day");

$ start_date теперь будет равно воскресенью этой недели, оттуда вы можете добавить 7 дней чтобы получить конец недели или что-то еще.

9
ответ дан 27 November 2019 в 22:58
поделиться

Вот моя версия, в которой используется понятие, подобное версии Клея:

/**
 * Start of the week
 *
 * 0 = Sun, 1 = Mon, etc.
 */
define( 'WEEK_START', 0 );

/**
 * Determine the start and end dates for
 * the week in which the specified date
 * falls
 *
 * @param $date Date in week
 * @param $start Week start (out)
 * @param $end Week end (out)
 */
function week_bounds( $date, &$start, &$end ) {
    $date = strtotime( $date );
    // Find the start of the week, working backwards
    $start = $date;
    while( date( 'w', $start ) > WEEK_START ) {
        $start -= 86400; // One day
    }
    // End of the week is simply 6 days from the start
    $end = date( 'Y-m-d', $start + ( 6 * 86400 ) );
    $start = date( 'Y-m-d', $start );
}

Слегка проверена. Код может не быть пуленепробиваемым или обрабатывать даты в далеком прошлом или будущем. Используйте на свой риск. Не погружайте код в воду. Не показывайте код тем, кто нервничает или ненавидит знак доллара. Не тестировался на животных. Безопасен для вегетарианцев. Автор гарантирует, что код никогда с вами не заговорит. В том маловероятном случае, если код действительно пытается вовлечь вас в разговор, автор советует вам игнорировать любые советы, которые он дает.

2
ответ дан 27 November 2019 в 22:58
поделиться

Честно говоря, мне сложно понять опубликованный вами код;)

Думаю, что-то вроде этого должно помочь:

function get_week($date) {
        $start = strtotime($date) - strftime('%w', $date) * 24 * 60 * 60;
        $end = $start + 6 * 24 * 60 * 60;
        return array('start' => strftime('%Y-%m-%d', $start),
                     'end' => strftime('%Y-%m-%d', $end));
}
0
ответ дан 27 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: