Как найти дату дня недели по дате с помощью PHP?

86

Если у меня есть $date YYYY-mm-ddи я хочу получить конкретную $day(указанную от 0 (воскресенье) до 6 (суббота)) недели, которая YYYY-mm-ddнаходится в.

Например, если я получил 2012-10-11as $dateand 5as $day, я хочу получить 2012-10-12, если я получил 0as $day,2012-10-14

РЕДАКТИРОВАТЬ:
Большинство из вас неправильно это поняли. У меня есть дата, $dateи я хочу получить день, указанный 0-6 той же недели $date.

Так что нет, мне не нужен день $date...

Зулакис
источник
Когда у тебя неделя начинается? Понедельник или воскресенье? Я знаю, что для большинства сегодня понедельник, но я просто
проверяю
3
Не думаю, что ответившие правильно поняли вопрос. Он не хочет получать число дня по дате (которое будет датой ('w')), но он хочет указать дату И номер дня и получить соответствующую дату на той же неделе, что и указанная дата .. .
Vafliik

Ответы:

128

Я думаю, это то, что вам нужно.

$dayofweek = date('w', strtotime($date));
$result    = date('Y-m-d', strtotime(($day - $dayofweek).' day', strtotime($date)));
Переиздан
источник
90

Вы можете использовать функцию date ():

date('w'); // day of week

или же

date('l'); // dayname

Пример функции для получения номера дня:

function getWeekday($date) {
    return date('w', strtotime($date));
}

echo getWeekday('2012-10-11'); // returns 4
Powtac
источник
17

Пытаться

$date = '2012-10-11';
$day  = 1;
$days = array('Sunday', 'Monday', 'Tuesday', 'Wednesday','Thursday','Friday', 'Saturday');
echo date('Y-m-d', strtotime($days[$day], strtotime($date)));
воздух4x
источник
2
Хороший подход, но, как вы можете видеть в ответе Rezigned, вы также можете использовать «1 день», что делает массив $ days бесполезным.
Zulakis
1
Это кажется более правильным, потому что он возвращает правильную дату 2012-10-14при вводе 0, @Rezigned возвращает2012-10-07
Карл
7

Если ваша дата уже a DateTimeили DateTimeImmutableвы можете использовать formatметод.

$day_of_week = intval($date_time->format('w'));

Строка формата идентична той, которая используется функцией даты .


Чтобы ответить на заданный вопрос:

$date_time->modify($target_day_of_week - $day_of_week . ' days');
Йоханнес Бухгольц
источник
5

В руководстве по PHP сказано:

w Числовое представление дня недели

Поэтому вы можете создать дату с помощью mktime и использовать в ней date("w", $yourTime);

синий112
источник
4

Просто:

2012-10-11 как $ date и 5 как $ Day

<?php
$day=5;
$w      = date("w", strtotime("2011-01-11")) + 1; // you must add 1 to for Sunday

echo $w;

$sunday = date("Y-m-d", strtotime("2011-01-11")-strtotime("+$w day"));

$result = date("Y-m-d", strtotime($sunday)+strtotime("+$day day"));

echo $result;

?>

$ Result = '2012-10-12' - это то, что вам нужно.

лиджинма
источник
1

Боюсь, вам придется это делать вручную. Получите текущий день недели для даты, вычислите смещение и добавьте смещение к дате.

$current = date("w", $date)
$offset = $day - $current
$new_date = new DateTime($date)
    ->add(
        new DateInterval($offset."D")
    )->format('Y-m-d')
Джон Дворжак
источник
1
Спасибо за ваш подход, но нет, мне не нужно делать это вручную. Взгляните на ответ Rezigned.
Zulakis
1

Мне пришлось использовать аналогичное решение для португальского (Бразилия):

<?php
$scheduled_day = '2018-07-28';
$days = ['Dom','Seg','Ter','Qua','Qui','Sex','Sáb'];
$day = date('w',strtotime($scheduled_day));
$scheduled_day = date('d-m-Y', strtotime($scheduled_day))." ($days[$day])";
// provides 28-07-2018 (Sáb)
Викторф
источник
1
<?php echo date("H:i", time()); ?>
<?php echo $days[date("l", time())] . date(", d.m.Y", time()); ?>

Просто, это должно помочь

Руне Бёге
источник