Voici une alternative possible pour vous. strtotime
est puissant, et la syntaxe inclut des éléments vraiment utiles
comme formulation relative complète de l'heure et de la date
.
Vous pouvez l'utiliser pour générer du premier au Nième jour de semaine spécifique d'un mois spécifique en utilisant le format " de ". Voici un exemple utilisant date_create
pour invoquer un DateTime
objet, mais vieux strtotime
normal fonctionne de la même manière :
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
Il débordera également du mois, si vous en demandez un invalide :
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
Notez que cela ne fonctionne qu'avec le numéro ordinal formulation. Vous ne pouvez pas passer "1er" ou "3ème", malheureusement.
Une fois que vous l'avez utilisé pour saisir le Nième jour de semaine approprié, vous pouvez simplement ajouter le nombre de jours de semaine nécessaires pour sauter (7 pour une semaine, 14 pour deux, 21 pour trois, etc.) selon les besoins jusqu'à la date de fin désignée ou le nombre de jours désigné. semaines ont passé. Encore une fois, strtotime
à la rescousse, en utilisant le second argument pour enchaîner la relative :
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
(Ma copie locale a également accepté '+14 days First Thursday of March 2011'
, mais c'était un peu bizarre.)