Как я могу получить дату понедельника и пятницы на текущую неделю?
У меня есть следующий код, но он не работает, если текущий день – воскресенье или суббота.
$current_day = date("N"); $days_to_friday = 5 - $current_day; $days_from_monday = $current_day - 1; $monday = date("Ymd", strtotime("- {$days_from_monday} Days")); $friday = date("Ymd", strtotime("+ {$days_to_friday} Days"));
Эти входы strtotime работают очень хорошо:
strtotime( "next monday" ); strtotime( "previous monday" ); strtotime( "today" ); strtotime( "next friday" ); strtotime( "previous friday" );
Все, что вам нужно сделать, это обернуть логику внутри некоторых операторов if.
Лучшим решением было бы:
$monday = date( 'Ym-d', strtotime( 'monday this week' ) ); $friday = date( 'Ym-d', strtotime( 'friday this week' ) );
Этот вопрос требует ответа DateTime: –
/** * @param String $day * @return DateTime */ function getDay($day) { $days = ['Monday' => 1, 'Tuesday' => 2, 'Wednesday' => 3, 'Thursday' => 4, 'Friday' => 5, 'Saturday' => 6, 'Sunday' => 7]; $today = new \DateTime(); $today->setISODate((int)$today->format('o'), (int)$today->format('W'), $days[ucfirst($day)]); return $today; }
Применение:
var_dump(getDay('Monday')->format('l dS F Y')); var_dump(getDay('Friday')->format('l dS F Y'));
Вывод:
string 'Monday 30th September 2013' (length=26) string 'Friday 04th October 2013' (length=24)
Посмотрите, как работает
Это зависит от того, как вы определяете неделю, но я придумал эту функцию, которая даст вам дату ближайшего «понедельника» или «пятницы» (или любого дня, если на то пошло):
function closestDate($day){ $day = ucfirst($day); if(date('l', time()) == $day) return date("Ymd", time()); else if(abs(time()-strtotime('next '.$day)) < abs(time()-strtotime('last '.$day))) return date("Ymd", strtotime('next '.$day)); else return date("Ymd", strtotime('last '.$day)); }
Вход: день недели («воскресенье», «понедельник» и т. Д.)
Выход: если бы я попросил ближайшее «воскресенье» и сегодня:
Надеюсь это поможет 🙂
Мне нужно определение текущей недели по ISO 8601. Я хочу, чтобы понедельник всегда определялся как понедельник, начавшая эту текущую неделю.
Следующее решение отлично подходит для меня:
$monday = strtotime(date('o-\WW')); $friday = strtotime("next friday",$monday);
В течение $monday
этот метод всегда будет возвращать понедельник, начавшее эту календарную неделю. К сожалению, этот метод использует PHP 5.1 для анализа формата даты.
Чтобы получить любой день недели, вы можете попробовать:
function time_for_week_day($day_name, $ref_time=null){ $monday = strtotime(date('o-\WW',$ref_time)); if(substr(strtoupper($day_name),0,3) === "MON") return $monday; else return strtotime("next $day_name",$monday); }
Применение:
time_for_week_day('wednesday'); time_for_week_day('friday',strtotime('2014-12-25'));
Как следует из главного ответа, использование функции strtotime () PHP является самым простым способом.
Однако вместо использования инструкций if, как он предлагает, вы можете просто вернуться к предыдущему воскресенью и получить нужные вам даты.
$monday = strtotime('next monday', strtotime('previous sunday')); $friday = strtotime('next friday', strtotime('previous sunday'));
Я искал аналогичную вещь, за исключением того, что хотел любой понедельник, а не только на этой неделе. Вот что я придумал:
function getSunday(DateTime $date){ $outdate = clone($date); $day = $date->format("w"); // get the weekday (sunday is 0) $outdate->sub(new DateInterval("P".$day."D")); // subtracting the weekday from the date always gives Sunday return $outdate; }
Он принимает произвольную дату и дает воскресенье. Затем вы можете легко добавить дни назад, чтобы добраться с понедельника по субботу.
я использую :
$first_week_date = date('d F Y', strtotime('next Monday -1 week', strtotime('this sunday'))); $last_week_date = date('d F Y', strtotime('next Monday -1 week + 4 days', strtotime('this sunday')));