Mysql
 sql >> Database >  >> RDS >> Mysql

Eventi ripetuti l'ennesimo giorno della settimana di ogni mese

Ecco una possibile alternativa per te. strtotime è potente e la sintassi include bit davvero utili come formulazione completa di data e ora relativa .

Puoi usarlo per generare dal primo all'ennesimo giorno della settimana specifico di un mese specifico utilizzando il formato " di ". Ecco un esempio utilizzando date_create per invocare un DateTime oggetto, ma normale vecchio strtotime funziona allo stesso modo:

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

Trascorrerà anche il mese, se ne chiedi uno non valido:

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

Tieni presente che funziona solo con il numero ordinale formulazione. Sfortunatamente, non puoi passare "1st" o "3rd".

Una volta che lo usi per prendere l'ennesimo giorno della settimana corretto, puoi semplicemente aggiungere il numero di giorni della settimana necessari da saltare (7 per una settimana, 14 per due, 21 per tre, ecc.) come richiesto fino alla data di fine designata o al numero designato di settimane sono passate. Ancora una volta, strtotime in soccorso, usando il secondo argomento per concatenare la relatività:

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

(La mia copia locale ha accettato anche '+14 days First Thursday of March 2011' , ma mi è sembrato un po' strano.)