Получить дату для понедельника и пятницы для текущей недели (PHP) - PullRequest
31 голосов
/ 16 сентября 2009

Как я могу получить дату для понедельника и пятницы для текущей недели?

У меня есть следующий код, но он не работает, если текущий день воскресенье или суббота.

$current_day = date("N");
$days_to_friday = 5 - $current_day;
$days_from_monday = $current_day - 1;
$monday = date("Y-m-d", strtotime("- {$days_from_monday} Days"));
$friday = date("Y-m-d", strtotime("+ {$days_to_friday} Days"));

Ответы [ 8 ]

60 голосов
/ 16 сентября 2009

Эти входные данные strtotime работают очень хорошо:

strtotime( "next monday" );
strtotime( "previous monday" );
strtotime( "today" );
strtotime( "next friday" );
strtotime( "previous friday" );

Все, что вам нужно сделать, это обернуть логику в некоторые операторы if.

57 голосов
/ 18 сентября 2015

Лучшее решение будет:

$monday = date( 'Y-m-d', strtotime( 'monday this week' ) );
$friday = date( 'Y-m-d', strtotime( 'friday this week' ) );
10 голосов
/ 03 октября 2013

На этот вопрос нужен ответ 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)

Посмотри, как работает

1 голос
/ 23 апреля 2015

Как подсказывает главный ответ, использование PHP-функции strtotime () является самым простым способом.

Однако, вместо использования выражений if, как он предлагает, вы можете просто вернуться к предыдущему воскресенью и получить нужные вам даты.

$monday = strtotime('next monday', strtotime('previous sunday'));
$friday = strtotime('next friday', strtotime('previous sunday'));
1 голос
/ 03 июля 2013

Это действительно зависит от того, как вы определяете в неделю , но я придумала эту функцию, которая даст вам дату ближайшего «понедельника» или «пятницы» (или любого другого дня в этом отношении):

function closestDate($day){

    $day = ucfirst($day);
    if(date('l', time()) == $day)
        return date("Y-m-d", time());
    else if(abs(time()-strtotime('next '.$day)) < abs(time()-strtotime('last '.$day)))
        return date("Y-m-d", strtotime('next '.$day));
    else
        return date("Y-m-d", strtotime('last '.$day));

}

Ввод: день недели («воскресенье», «понедельник» и т. Д.)

Вывод: если бы я спросил о ближайшем «воскресенье», а сегодня это:

  1. «Воскресенье»: я получу сегодняшнюю дату
  2. «Понедельник»: я получу вчерашнюю дату
  3. "Суббота: завтра получу дату

Надеюсь, это поможет:)

0 голосов
/ 20 июля 2017

я использую:

$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')));
0 голосов
/ 30 апреля 2015

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

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;
}

Принимает произвольную дату и дает воскресенье. Тогда вы можете легко добавить дни назад, чтобы получить с понедельника по субботу.

0 голосов
/ 18 ноября 2014

Мне нужно определение текущей недели по ISO 8601. Я хочу, чтобы понедельник всегда определялся как понедельник, который начался на текущей неделе.

У меня отлично работает следующее решение:

$monday = strtotime(date('o-\WW'));
$friday = strtotime("next friday",$monday);

Для $monday этот метод всегда возвращает понедельник, который начался на этой календарной неделе. к сожалению, этот метод использует PHP 5.1 для анализа формата даты o.

Чтобы получить любой день недели, вы можете попробовать:

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'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...