- Получить первый день недели в PHP?
- 34 ответа
- Выход для 5.3.0 — 5.6.6, php7 @20140507 — 20150301, hhvm-3.3.1 — 3.5.1
- Выход для 4.3.5 — 5.2.17
- Выход для 4.3.0 — 4.3.4
- Сравнение в Edge-Cases
- Выход для 5.3.0 — 5.6.6, php7 @20140507 — 20150301, hhvm-3.3.1 — 3.5.1
- Выход для 4.3.5 — 5.0.5, 5.2.0 — 5.2.17
- Выход для 5.1.0 — 5.1.6
- Выход для 4.3.0 — 4.3.4
- Get week starting and ending date in PHP
Получить первый день недели в PHP?
Что вы имеете в виду под первым днем недели? Ты имеешь в виду Солнце, Пн? Или вы имеете в виду дату первого дня недели?
Первый день недели постоянен: это понедельник (или, возможно, воскресенье). Вы имеете в виду, что хотите получить дату понедельника, предшествующую данной произвольной дате?
34 ответа
$day = date('w'); $week_start = date('m-d-Y', strtotime('-'.$day.' days')); $week_end = date('m-d-Y', strtotime('+'.(6-$day).' days'));
$day содержит число от 0 до 6, представляющее день недели (воскресенье = 0, понедельник = 1 и т.д.).
$week_start содержит дату воскресенья текущей недели как mm-dd-yyyy.
$week_end содержит дату субботы текущей недели как mm-dd-yyyy.
Что делать, если указан номер недели? и я хочу, чтобы он возвращал начало и дату окончания этой недели.
Я думаю, что этот ответ должен передать первую функцию date функцию strtotime метку времени данной даты MM-дд-гггг . В противном случае это будет просто вычислить понедельник текущей недели.
Если вы хотите выяснить это для произвольной даты, которую вы можете передать ( $date ), вы можете сделать это как $time = strtotime($date); $day = date(‘w’, $time); $first_of_week = date(‘mdY’, strtotime(‘-‘.$day.’ days’, $time));
Заменить время(). Следующие воскресные/последние понедельные методы не будут работать, если текущий день воскресен/понедельник.
this week не работает, если вам нужно всегда иметь начало предыдущей недели, но комментарий @LewisBuckley’s LewisBuckley делает это.
Этот ответ приводит к противоречивым результатам, в зависимости от используемой версии PHP: 3v4l.org/Z3k4E @LewisBuckley’s Решение LewisBuckley является согласованным для всех версий: 3v4l.org/Eeh9c
Ответ @LewisBuckley’s LewisBuckley прекрасно работает, но его можно объединить в одно strtotime: strtotime(‘last Monday tomorrow’, $intTimestamp)
Очень просто использовать strtotime function:
echo date("Y-m-d", strtotime('monday this week')), "\n"; echo date("Y-m-d", strtotime('sunday this week')), "\n";
Выход для 5.3.0 — 5.6.6, php7 @20140507 — 20150301, hhvm-3.3.1 — 3.5.1
Выход для 4.3.5 — 5.2.17
Выход для 4.3.0 — 4.3.4
Сравнение в Edge-Cases
Относительные описания, подобные этой неделе, имеют свой собственный контекст. Ниже показаны выходные данные на эту неделю понедельника и воскресенья, когда они находятся в понедельник или воскресенье:
$date = '2015-03-16'; // monday echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n"; echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n"; $date = '2015-03-22'; // sunday echo date("Y-m-d", strtotime('monday this week', strtotime($date))), "\n"; echo date("Y-m-d", strtotime('sunday this week', strtotime($date))), "\n";
Againt немного отличается через версии PHP:
Выход для 5.3.0 — 5.6.6, php7 @20140507 — 20150301, hhvm-3.3.1 — 3.5.1
2015-03-16 2015-03-22 2015-03-23 2015-03-29
Выход для 4.3.5 — 5.0.5, 5.2.0 — 5.2.17
2015-03-16 2015-03-22 2015-03-23 2015-03-22
Выход для 5.1.0 — 5.1.6
2015-03-23 2015-03-22 2015-03-23 2015-03-29
Выход для 4.3.0 — 4.3.4
2015-03-23 2015-03-29 2015-03-30 2015-03-29
modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week'); $sunday = clone $dateTime->modify('Sunday this week'); ?>
редактировать: опечатка или какой-то неизвестный синтаксис? откуда берется \ $dateTime = new \DateTime(‘2012-05-14’);
Я делаю это, чтобы избежать конфликта с возможным автозагрузочным объектом вашего приложения. Это как абсолютный путь или относительный путь.
@Panique — «неизвестный синтаксис» — это синтаксис пространства имен PHP 5.3. Пространство имен позволяет вам префикс класса с пространством имен, за которым следует обратный слеш. Здесь он использует его без пространства имен, чтобы указать основной класс DateTime , что означает, что код будет работать, даже если у вас есть другой класс с именем DateTime в текущем пространстве имен.
Ура, лучший ответ. Главным образом потому, что автор запрашивает решение DateTime а большинство ответов не предоставляет решение DateTime .
$givenday = date("w", mktime(0, 0, 0, MM, dd, yyyy));
Это дает вам день недели самой даты, где 0 = воскресенье и 6 = суббота. Оттуда вы можете просто рассчитать назад до того дня, когда захотите.
Этот ответ возвращает ответ на вопрос, является ли данная дата воскресеньем или понедельником и т. Д. Но спрашивающий спросил дату воскресенья недели указанной даты, как указано в его комментарии к исходному вопросу.
Для чего это стоит, вот разбивка неуклюжего поведения strtotime при определении согласованной системы отсчета:
В основном только эти строки надежно дадут вам ту же дату, независимо от того, в какой день недели вы сейчас находитесь, когда вы их вызываете:
strtotime("next monday"); strtotime("this sunday"); strtotime("last sunday");
В статье также приведен определенный код для использования: $ start_of_week = strtotime («следующий понедельник — 1 неделя»); // Возвращает понедельник текущей недели, начиная с 00:00:00 «$ end_of_week = strtotime (» следующий понедельник — 1 секунда «); // Возвращает воскресенье текущей недели, заканчивающейся в 23:59:59»
Этот вопрос нуждается в хорошем ответе DateTime: —
function firstDayOfWeek($date) < $day = DateTime::createFromFormat('m-d-Y', $date); $day->setISODate((int)$day->format('o'), (int)$day->format('W'), 1); return $day->format('m-d-Y'); > var_dump(firstDayOfWeek('06-13-2013'));
Это будет охватывать границы года и високосные годы.
Следующий код должен работать с любой пользовательской датой, просто использует нужный формат даты.
$custom_date = strtotime( date('d-m-Y', strtotime('31-07-2012')) ); $week_start = date('d-m-Y', strtotime('this week last monday', $custom_date)); $week_end = date('d-m-Y', strtotime('this week next sunday', $custom_date)); echo '
Start: '. $week_start; echo '
End: '. $week_end;
Я проверил код с PHP 5.2.17 Результаты:
Start: 30-07-2012 End: 05-08-2012
Стоит отметить, что это всегда будет возвращать предыдущий понедельник, поэтому, если $ custom_date — понедельник, он вернет дату понедельника на неделю раньше.
Не работает должным образом, сегодня воскресенье, результаты: Начало: 09-09-2013 Окончание: 22-09-2013
$first_day_of_week = date('m-d-Y', strtotime('Last Monday', time())); $last_day_of_week = date('m-d-Y', strtotime('Next Sunday', time()));
Здесь я рассматриваю воскресенье как первую и субботу как последний день недели.
$m = strtotime('06-08-2012'); $today = date('l', $m); $custom_date = strtotime( date('d-m-Y', $m) ); if ($today == 'Sunday') < $week_start = date("d-m-Y", $m); >else < $week_start = date('d-m-Y', strtotime('this week last sunday', $custom_date)); >if ($today == 'Saturday') < $week_end = date("d-m-Y", $m); >else < $week_end = date('d-m-Y', strtotime('this week next saturday', $custom_date)); >echo '
Start: '. $week_start; echo '
End: '. $week_end;
Начало: 05-08-2012
Конец: 11-08-2012
Предполагая, что понедельник — первый день недели, это работает:
echo date("M-d-y", strtotime('last monday', strtotime('next week', time())));
«ММ-дд-гггг» — это не то же самое, что «ЯМД», пожалуйста, адаптируйте свой ответ к конкретному вопросу.
date («MM-dd-yyyy») выводит дату в виде: NovNov-0202-15151515. Я надеюсь, что это должно быть: date («Mdy»), которая выводит читаемую дату, такую как: Nov-02-15
«ММ-дд-гггг» исходит из вопроса. Если вы не уверены, что это значит — задайте это в комментарии к вопросу. Спасибо за изменение вашего ответа.
Это то, что я использую, чтобы получить первый и последний день недели из любой даты. В этом случае понедельник — первый день недели.
$date = date('Y-m-d') // you can put any date you want $nbDay = date('N', strtotime($date)); $monday = new DateTime($date); $sunday = new DateTime($date); $monday->modify('-'.($nbDay-1).' days'); $sunday->modify('+'.(7-$nbDay).' days');
$day_of_week = date('N', strtotime($string_date)); $week_first_day = date('Y-m-d', strtotime($string_date . " - " . ($day_of_week - 1) . " days")); $week_last_day = date('Y-m-d', strtotime($string_date . " + " . (7 - $day_of_week) . " days"));
Это кратчайшее и наиболее читаемое решение, которое я нашел:
strtotime быстрее, чем new DateTime()->getTimestamp() .
function week_start_date($wk_num, $yr, $first = 1, $format = 'F d, Y') < $wk_ts = strtotime('+' . $wk_num . ' weeks', strtotime($yr . '0101')); $mon_ts = strtotime('-' . date('w', $wk_ts) + $first . ' days', $wk_ts); return date($format, $mon_ts); >$sStartDate = week_start_date($week_number, $year); $sEndDate = date('F d, Y', strtotime('+6 days', strtotime($sStartDate)));
Если вы хотите, чтобы понедельник начинался с вашей недели, сделайте следующее:
$date = '2015-10-12'; $day = date('N', strtotime($date)); $week_start = date('Y-m-d', strtotime('-'.($day-1).' days', strtotime($date))); $week_end = date('Y-m-d', strtotime('+'.(7-$day).' days', strtotime($date)));
Что делает это предпочтительным для этого ответа или этого ответа ? Мне кажется, в 30 других ответах более чем достаточно вариантов .
$monday = date('d-m-Y',strtotime('last monday',strtotime('next monday',strtotime($date))));
Сначала вы должны получить следующий понедельник, затем получить «последний понедельник» следующего понедельника. Поэтому, если данная дата понедельника, она вернется с той же датой не в последнюю неделю понедельника.
$today_day = date('D'); //Or add your own date $start_of_week = date('Ymd'); $end_of_week = date('Ymd'); if($today_day != "Mon") $start_of_week = date('Ymd', strtotime("last monday")); if($today_day != "Sun") $end_of_week = date('Ymd', strtotime("next sunday"));
Указанная PHP версия pre 5.3 следующая функция дает вам первый день недели данной даты (в данном случае — воскресенье, 2013-02-03):
echo(date('Y-m-d',startOfWeek("2013-02-07")).' '); ?>
Умный способ сделать это — позволить PHP обрабатывать разницу в часовом поясе и летнее время (DST). Позвольте мне показать вам, как это сделать.
Эта функция будет генерировать все дни с понедельника по пятницу включительно (удобна для создания рабочих дней недели):
class DateTimeUtilities < public static function getPeriodFromMondayUntilFriday($offset = 'now') < $now = new \DateTimeImmutable($offset, new \DateTimeZone('UTC')); $today = $now->setTime(0, 0, 1); $daysFromMonday = $today->format('N') - 1; $monday = $today->sub(new \DateInterval(sprintf('P%dD', $daysFromMonday))); $saturday = $monday->add(new \DateInterval('P5D')); return new \DatePeriod($monday, new \DateInterval('P1D'), $saturday); > > foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday() as $day) < print $day->format('c'); print PHP_EOL; >
Это вернется с понедельника по пятницу на текущую неделю. Чтобы сделать то же самое для произвольной даты, передайте дату как параметр в DateTimeUtilities ::getPeriodFromMondayUntilFriday , таким образом:
foreach (DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00') as $day) < print $day->format('c'); print PHP_EOL; > //prints //2017-01-02T00:00:01+00:00 //2017-01-03T00:00:01+00:00 //2017-01-04T00:00:01+00:00 //2017-01-05T00:00:01+00:00 //2017-01-06T00:00:01+00:00
Интересно только в понедельник, как спросил ОП?
$monday = DateTimeUtilities::getPeriodFromMondayUntilFriday('2017-01-02T15:05:21+00:00')->getStartDate()->format('c'); print $monday; // prints //2017-01-02T00:00:01+00:00
Get week starting and ending date in PHP
This is how you can get the week starting date or ending date by giving a week number and the year.
$monday = date ( ‘Ymd’ , strtotime ( «2013-W01-1» ));
$sunday = date ( ‘Ymd’ , strtotime ( «2013-W01-7» ));
/**
* Get starting date from week number and year
* Monday is first day of week
*
* @param unknown_type $wk_num
* @param unknown_type $yr
* @param unknown_type $first
* @param unknown_type $format
* @return unknown
*/
function week_start_date ( $week , $year , $format = ‘Ymd’ , $date = FALSE ) ?php
if ( $date ) $week = date ( «W» , strtotime ( $date ));
$year = date ( «o» , strtotime ( $date ));
>
$desiredMonday = date ( $format , strtotime ( » $year -W $week -1″ ));
$sStartDate = week_start_date ( $week_number , $year );
$sEndDate = date ( ‘Y-m-d’ , strtotime ( ‘+6 days’ , strtotime ( $sStartDate )));
Going from date or timestamp to get the week start and end date this call might be a better way to go.
$time = strtotime ( «2011-01-01» );
//or
$time = strtotime ( «2010-12-31» );
?php
$first_day_of_week = date ( ‘Y-m-d’ , strtotime ( ‘Last Monday’ , $time ));
$last_day_of_week = date ( ‘Y-m-d’ , strtotime ( ‘Next Sunday’ , $time ));
//Will give the same result
//2010-12-27
//2011-01-02
?>
/**
* Get week and its start and ending date
*
* @param unknown_type $date
*/
function week_start_end_by_date ( $date , $format = ‘Ymd’ ) ?php
//Is $date timestamp or date?
if ( is_numeric ( $date ) AND strlen ( $date ) == 10 ) $time = $date ;
>else $time = strtotime ( $date );
>
$week [ ‘week’ ] = date ( ‘W’ , $time );
$week [ ‘year’ ] = date ( ‘o’ , $time );
$week [ ‘year_week’ ] = date ( ‘oW’ , $time );
$first_day_of_week_timestamp = strtotime ( $week [ ‘year’ ]. «W» . str_pad ( $week [ ‘week’ ], 2 , «0» , STR_PAD_LEFT ));
$week [ ‘first_day_of_week’ ] = date ( $format , $first_day_of_week_timestamp );
$week [ ‘first_day_of_week_timestamp’ ] = $first_day_of_week_timestamp ;
$last_day_of_week_timestamp = strtotime ( $week [ ‘first_day_of_week’ ]. » +6 days» );
$week [ ‘last_day_of_week’ ] = date ( $format , $last_day_of_week_timestamp );
$week [ ‘last_day_of_week_timestamp’ ] = $last_day_of_week_timestamp ;