Php начало недели понедельник

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

Я пытаюсь получить диапазон недель, используя воскресенье в качестве даты начала, и контрольную дату, скажем $date , но я просто не могу понять это. Например, если бы у меня $date как 2009-05-01, я бы получил 2009-04-26 и 2009-05-02. 2009-05-10 выйдет 2009-05-10 и 2009-05-16. Мой текущий код выглядит так (я не могу вспомнить, откуда я его снял, поскольку забыл указать URL-адрес в моих комментариях):

function x_week_range(&$start_date, &$end_date, $date) < $start_date = ''; $end_date = ''; $week = date('W', strtotime($date)); $week = $week; $start_date = $date; $i = 0; while(date('W', strtotime("-$i day")) >= $week) < $start_date = date('Y-m-d', strtotime("-$i day")); $i++; >list($yr, $mo, $da) = explode('-', $start_date); $end_date = date('Y-m-d', mktime(0, 0, 0, $mo, $da + 6, $yr)); > 

13 ответов

function x_week_range(&$start_date, &$end_date, $date)

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

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

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

Для форматирования даты последнего воскресенья я использовал следующее: date (‘Ymd’, strtotime (‘last sunday’))

@John М, см. Мой комментарий ниже о том, как «последнее воскресенье» может быть проблематичным, если сегодня воскресенье, а вы хотите на этой неделе.

Для всех, кто все еще использует mktime(), strtotime() и другие функции PHP. дайте PHP5 DateTime класс попробовать. Сначала я колебался, но он очень прост в использовании. Не забывайте об использовании clone() для копирования ваших объектов.

Читайте также:  Php get object property by string

Изменить: этот код был недавно отредактирован для обработки случая, когда текущий день — воскресенье. В этом случае мы должны получить прошлую субботу, а затем добавить один день, чтобы получить воскресенье.

$dt_min = new DateTime("last saturday"); // Edit $dt_min->modify('+1 day'); // Edit $dt_max = clone($dt_min); $dt_max->modify('+6 days'); 

Затем отформатируйте его, как вам нужно.

echo 'This Week ('.$dt_min->format('m/d/Y').'-'.$dt_max->format('m/d/Y').')'; 

Удостоверьтесь, что ваш часовой пояс установлен раньше вашего кода.

date_default_timezone_set('America/New_York'); 

Если я не читаю это неправильно, я не уверен, сработает ли эта логика, если сегодня воскресенье. Если сегодня воскресенье и вы создаете объект DateTime в last sunday , PHP вернет предыдущее воскресенье, а не текущее. Таким образом, если сегодняшняя дата 28.02.2016, код, приведенный выше, будет This week 2/21/2016 — 2/27/2016 (фактически на предыдущей неделе. С понедельника по субботу эта проблема будет This week 2/21/2016 — 2/27/2016 . Я бы предложил что-то вроде $dt_min = new DateTime(«last Saturday + 24 hour»);

По-видимому, значение форматирования ‘w’ даты() или метода формата объекта 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 дней, чтобы получить конец недели или что-то делать.

то же самое можно сделать с помощью функции Date: $day_of_week date(‘w’, strtotime($start_date)); $sunday = date(‘Ymd’, strtotime(‘-‘.$day_of_week.’ days’, strtotime($start_date)));

Основы на ответе @jjwdesign, я разработал функцию, которая может вычислять начало и конец недели для определенной даты с использованием класса DateTime. РАБОТАЕТ НА PHP 5.3.0 ++

Разница в том, что вы можете установить день, который вы хотите, в качестве «начала» между 0 (понедельника) и 6 (воскресенье).

if(function_exists('grk_Week_Range') === FALSE) < function grk_Week_Range($DateString, $FirstDay=6)< # Valeur par défaut si vide if(empty($DateString) === TRUE)< $DateString = date('Y-m-d'); ># On va aller chercher le premier jour de la semaine qu'on veut $Days = array( 0 => 'monday', 1 => 'tuesday', 2 => 'wednesday', 3 => 'thursday', 4 => 'friday', 5 => 'saturday', 6 => 'sunday' ); # On va définir pour de bon le premier jour de la semaine $DT_Min = new DateTime('last '.(isset($Days[$FirstDay]) === TRUE ? $Days[$FirstDay] : $Days[6]).' '.$DateString); $DT_Max = clone($DT_Min); # On renvoie les données return array( $DT_Min->format('Y-m-d'), $DT_Max->modify('+6 days')->format('Y-m-d') ); > > 
print_r(grk_Week_Range('2013-08-11 16:45:32', 0)); print_r(grk_Week_Range('2013-08-11 16:45:32', 1)); print_r(grk_Week_Range('2013-08-11 16:45:32', 2)); print_r(grk_Week_Range('2013-08-11 16:45:32', 3)); print_r(grk_Week_Range('2013-08-11 16:45:32', 4)); print_r(grk_Week_Range('2013-08-11 16:45:32', 5)); print_r(grk_Week_Range('2013-08-11 16:45:32', 6)); Array ( [0] => 2013-07-29 [1] => 2013-08-04 ) Array ( [0] => 2013-07-30 [1] => 2013-08-05 ) Array ( [0] => 2013-07-31 [1] => 2013-08-06 ) Array ( [0] => 2013-07-25 [1] => 2013-07-31 ) Array ( [0] => 2013-07-26 [1] => 2013-08-01 ) Array ( [0] => 2013-07-27 [1] => 2013-08-02 ) Array ( [0] => 2013-07-28 [1] => 2013-08-03 ) 

Функция работает. Благодарю. Тем не менее, ваш пример немного не в порядке. У него дата 2013-08-11, так как он возвращает диапазон дат от 7-25 до 8-06? Разве 11 августа не должно быть где-то там?

Источник

PHP DateTime (), изменить первый день недели на понедельник

Класс DateTime в PHP (5.3+) отлично работает до тех пор, пока в первый день недели в вашей стране будет воскресенье. В Нидерландах первый день недели – понедельник, и это просто делает класс бесполезным для создания календаря с недельным просмотром и расчетами.

Я не могу найти ответ на Stackoverflow или остальную часть Интернета о том, как заставить DateTime действовать так, как будто первый день недели – понедельник.

Я нашел этот кусок на Stackoverflow, но он не фиксирует все способы, с которыми вы можете столкнуться, и это не изящное решение.

$dateTime = new DateTime('2012-05-14'); $monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); 

Есть ли способ изменить это или увеличить DateTime? Не могу себе представить, что это не настройка, так как большая часть Европы начинает свои недели в понедельник.

Добавлено: публикация полного кода календаря и функций не станет более понятной. Но вот одна строка, например. Мне часто приходится проверять, что в первый день недели, или рассчитать с первого дня недели в другую дату и время на этой неделе. Мой код заполняется ими:

$startOfWeek = $date->modify(('Sunday' == $date->format('l')) ? 'Monday last week' : 'Monday this week')->modify('+3 hours')->format(DATETIME); 

Я также получаю нежелательный результат, пытаясь получить первую полную неделю месяца или года. Поскольку мой объект $ date не всегда содержит ту же дату, я должен продолжать проверять его таким образом, что затрудняет чтение кода. Имея намного больше программ для этого календаря, я не могу предвидеть, где снова будет ошибка.

EDIT Есть некоторые несоответствия. По какой-то странной причине DateTime делает следующее следующее:

$test = new DateTime('2012-10-29'); // Monday echo $test->modify('Sunday this week')->format('Ym-d'); // 2012-11-04 // But. $test = new DateTime('2012-11-04'); // Sunday echo $test->modify('Monday this week')->format('Ym-d'); // 2012-11-05 instead of 2012-10-29 

Но я думаю, что я могу сделать вопрос более ясным: можно ли использовать класс DateTime () с понедельника в качестве первого дня недели. Если нет, можно ли расширить класс, чтобы использовать понедельник в качестве первого дня недели.

UPDATE: Хорошо, я думаю, что я куда-то … Я не профессионал в классах кодирования … но это, похоже, работает в течение недель. Но для него все еще нужны правила для первого дня, второго дня … а также для самого имени дня в воскресенье. Я не думаю, что это безупречно. Буду признателен за любую помощь, чтобы исправить это.

class EuroDateTime extends DateTime < // Fields private $weekModifiers = array ( 'this week', 'next week', 'previous week', 'last week' ); // Override "modify()" public function modify($string) < // Search pattern $pattern = '/'.implode('|', $this->weekModifiers).'/'; // Change the modifier string if needed if ( $this->format('N') == 7 ) < // It's Sunday $matches = array(); if ( preg_match( $pattern, $string, $matches )) < $string = str_replace($matches[0], '-7 days '.$matches[0], $string); >> return parent::modify($string); > > // This works $test = new EuroDateTime('2012-11-04'); echo $test->modify('Monday this week')->format('Ym-d'); // And I can still concatenate calls like the DateTime class was intended echo $test->modify('Monday this week')->modify('+3 days')->format('Ym-d'); 

Я нашел, что это работает, но есть некоторые несоответствия в классе DateTime PHP.

Если уходящая дата – воскресенье, предыдущий понедельник не считается той же неделей (фиксируется этим классом). Но, уходя с понедельника, следующее воскресенье считается одной и той же неделей. Если они исправит это, в будущем этому классу потребуются некоторые дополнения.

class EuroDateTime extends DateTime < // Override "modify()" public function modify($string) < // Change the modifier string if needed if ( $this->format('N') == 7 ) < // It's Sunday and we're calculating a day using relative weeks $matches = array(); $pattern = '/this week|next week|previous week|last week/i'; if ( preg_match( $pattern, $string, $matches )) < $string = str_replace($matches[0], '-7 days '.$matches[0], $string); >> return parent::modify($string); > > 

Вам нечего вручную изменять дату, чтобы получить «первый» день недели, в зависимости от вашего определения «первый». Например:

$firstDayOfWeek = 1; // Monday $dateTime = new DateTime('2012-05-16'); // Wednesday // calculate how many days to remove to get back to the "first" day $difference = ($firstDayOfWeek - $dateTime->format('N')); if ($difference > 0) < $difference -= 7; >$dateTime->modify("$difference days"); var_dump($dateTime->format('r')); // "Mon, 14 May 2012 00:00:00 +0000" 

Обратите внимание, как изменяется результат при изменении $firstDayOfWeek ; если бы он был изменен на 4 выше (четверг), тогда он рассмотрит Thu, 10 May 2012 как «первый» день.

Изменить : это довольно простой пример. Правильный способ сделать это – использовать локаль пользователя / системы, чтобы дать вам «первый» день и вычислить оттуда. См. Этот вопрос для получения дополнительной информации.

Я тоже смущен тем, что проблема, потому что у DateTime есть понятие недели, начиная с понедельника: формат N дает вам дни недели с понедельника по воскресенье, с понедельником 1, а воскресенье – 7. Более того, формат W , единственный способ получить номер недели, также начинается неделя в понедельник. (Кажется, я помню, что номера голландской недели не совсем такие, как номера ИСО, но это совсем другая история). Какая особенность вам не хватает точно?

Edit Итак, проблема (только?), Что относительные форматы datetime , такие как «понедельник на этой неделе», дают неверный результат, когда контрольная дата – воскресенье. Из документов это похоже на то, что DateTime просто отбрасывает strtotime , который, как предполагается, зависит от языка. Поэтому, если у вас установлен ваш язык, и это не работает, это звучит как ошибка (для чего это стоит).

Источник

Оцените статью