Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Eventos repetidos no enésimo dia da semana de cada mês


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.)