Aqui está uma alternativa possível para você.
strtotime
é poderoso, e a sintaxe inclui bits realmente úteis
como oração abrangente de data e hora relativa
. Você pode usá-lo para gerar o primeiro até o enésimo dia da semana específico de um mês específico usando o formato "de". Aqui está um exemplo usando
date_create
para invocar um DateTime
objeto, mas o antigo strtotime
regular funciona da mesma forma:php > $d = date_create('Last Friday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Friday March 25 2011 00:00:00
php > $d = date_create('First Friday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Friday March 04 2011 00:00:00
php > $d = date_create('First Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 06 2011 00:00:00
php > $d = date_create('Fourth Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 27 2011 00:00:00
php > $d = date_create('Last Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday March 27 2011 00:00:00
Também vai estourar o mês, se você pedir um inválido:
php > $d = date_create('Ninth Sunday of March 2011'); if($d instanceof DateTime) echo $d->format('l F d Y H:i:s');
Sunday May 01 2011 00:00:00
Observe que ele só funciona com o número ordinal redação. Você não pode passar "1º" ou "3º", infelizmente.
Depois de usar isso para obter o enésimo dia da semana adequado, você pode simplesmente adicionar o número de dias da semana necessários para pular (7 para uma semana, 14 para duas, 21 para três etc.), conforme necessário, até a data final designada ou o número designado de semanas se passaram. Mais uma vez,
strtotime
para o resgate, usando o segundo argumento para encadear a relatividade:php > echo date('l F d Y H:i:s', strtotime('+14 days', strtotime('First Thursday of March 2011')));
Thursday March 17 2011 00:00:00
(Minha cópia local também aceita
'+14 days First Thursday of March 2011'
, mas isso parecia meio estranho.)