Como encontrar a data de um dia da semana a partir de uma data usando PHP?

86

Se eu tiver um $date YYYY-mm-dde quiser obter um específico $day(especificado de 0 (domingo) a 6 (sábado)) da semana que YYYY-mm-ddestá em.

Por exemplo, se tenho 2012-10-11como $datee 5como $day, quero obter 2012-10-12, se tenho 0como $day,2012-10-14

EDIT:
A maioria de vocês entendeu mal. Eu tenho uma data $datee quero um dia especificado por 0-6 da mesma semana $dateem.

Então não, eu não quero o dia de $date...

Zulakis
fonte
Quando começa sua semana? Segunda ou domingo? Eu sei que é segunda-feira para a maioria das pessoas, mas estou apenas garantindo: p
keyser
3
Não acho que as pessoas que responderam entenderam a pergunta corretamente. Ele não deseja obter um número do dia por data (que seria a data ('w')), mas deseja especificar a data E o número do dia e receber a data correspondente da mesma semana em que a data especificada é .. .
Vafliik

Respostas:

127

Eu acho que é isso que você quer.

$dayofweek = date('w', strtotime($date));
$result    = date('Y-m-d', strtotime(($day - $dayofweek).' day', strtotime($date)));
Renovado
fonte
90

Você pode usar a função date ():

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

ou

date('l'); // dayname

Função de exemplo para obter o número do dia:

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

echo getWeekday('2012-10-11'); // returns 4
powtac
fonte
17

Experimentar

$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)));
air4x
fonte
2
Boa abordagem, mas como você pode ver na resposta de Rezigned, você também pode usar '1 dia', tornando o array $ dias inútil.
Zulakis,
1
Isso parece mais correto porque retorna a data correta 2012-10-14quando você insere 0, @Rezigned retorna2012-10-07
Carl
7

Se sua data já for um DateTimeou DateTimeImmutablevocê pode usar o formatmétodo.

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

A string de formato é idêntica à usada pela função de data .


Para responder à pergunta pretendida:

$date_time->modify($target_day_of_week - $day_of_week . ' days');
Johannes Buchholz
fonte
5

Manual do PHP disse:

w Representação numérica do dia da semana

Você pode, portanto, construir uma data com mktime e usá-la date("w", $yourTime);

blue112
fonte
4

Somente:

11/10/2012 como $ data e 5 como $ dia

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

?>

O $ result = '2012-10-12' é o que você deseja.

lijinma
fonte
1

Receio que você tenha que fazer isso manualmente. Obtenha o dia da semana atual da data, calcule o deslocamento e adicione o deslocamento à data.

$current = date("w", $date)
$offset = $day - $current
$new_date = new DateTime($date)
    ->add(
        new DateInterval($offset."D")
    )->format('Y-m-d')
John Dvorak
fonte
1
Obrigado pela sua abordagem, mas não, eu não tenho que fazer isso manualmente. Dê uma olhada na resposta de Rezigned.
Zulakis,
1

Tive que usar uma solução semelhante para português (Brasil):

<?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)
victorf
fonte
1
<?php echo date("H:i", time()); ?>
<?php echo $days[date("l", time())] . date(", d.m.Y", time()); ?>

Simples, isso deve funcionar

Rune Bøge
fonte