В соответствии с рекомендациями по оптимизации Intel и AMD смешивание типов op с типами данных приводит к удару по производительности, поскольку ЦП внутренне пропускает 64-битные половинки регистра для определенного типа данных. Это, по-видимому, в основном влияет на облицовку труб, когда команда декодируется, и запланированы команды. Функционально они дают одинаковый результат. Более новые версии для целых типов данных имеют большую кодировку и занимают больше места в сегменте кода. Поэтому, если размер кода является проблемой, используйте старые операционные системы, поскольку они имеют меньшую кодировку.
Я бы хотел воспользоваться преимуществами 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 выяснил это.
Теперь вы можете использовать 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") );
Пытаясь найти более упорядоченную версию принятого ответа Паоло Бергантино, я нашел действительно хороший способ сделать это:
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));
}
Строка «Воскресенье на этой неделе» всегда означает « Воскресенье в конце этой недели. " Если используется метка времени, приходящаяся на воскресенье, это будет следующее воскресенье. Это позволяет избежать необходимости использования троичного оператора в решении Паолы.
Не делая так много манипуляций со строками, вы можете сделать несколько простых математических операций с временными метками.
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);
}
Очевидно значение форматирования '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 дней чтобы получить конец недели или что-то еще.
Вот моя версия, в которой используется понятие, подобное версии Клея:
/**
* 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 );
}
Слегка проверена. Код может не быть пуленепробиваемым или обрабатывать даты в далеком прошлом или будущем. Используйте на свой риск. Не погружайте код в воду. Не показывайте код тем, кто нервничает или ненавидит знак доллара. Не тестировался на животных. Безопасен для вегетарианцев. Автор гарантирует, что код никогда с вами не заговорит. В том маловероятном случае, если код действительно пытается вовлечь вас в разговор, автор советует вам игнорировать любые советы, которые он дает.
Честно говоря, мне сложно понять опубликованный вами код;)
Думаю, что-то вроде этого должно помочь:
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));
}