Connaître les jours de début et de fin de semaine en PHP

Avril 2013

Voici une fonction qui permet d'afficher une semaine en chaine de caractères, voici quelques exemples de ce qu'elle retourne :

du 19 au 25 novembre 2012
du 26 novembre au 02 décembre 2012
du 31 décembre 2012 au 06 janvier 2013

Pour cela, on va utiliser la fonction strtotime qui gère assez facilement la manipulation des dates : ajout de jours, de semaines, premier jour de la semaine... plutôt que de passer par de nombreux calculs basés sur des timestamp.

Voici le code source de cette fonction, qui prend 2 arguments : l'année et le numéro de la semaine dans l'année (de 1 à 53) :

/**
 * Retourne une semaine sous forme de chaine "du {lundi} au {dimanche}..." en gérant des cas particuliers :
 *  - début et fin pas dans le même mois
 *  - début et fin pas dans la même année
 * !!! Penser à utiliser setlocale pour avoir la date (jour et mois) en Français !!!
 */
function week2str($annee, $no_semaine){
	// Récup jour début et fin de la semaine
	$timeStart = strtotime("First Thursday January {$annee} + ".($no_semaine - 1)." Week");
	$timeEnd   = strtotime("First Thursday January {$annee} + {$no_semaine} Week -1 day");
	
	// Récup année et mois début
	$anneeStart = date("Y", $timeStart);
	$anneeEnd   = date("Y", $timeEnd);
	$moisStart  = date("m", $timeStart);
	$moisEnd    = date("m", $timeEnd);
	
	// Gestion des différents cas de figure
	if( $anneeStart != $anneeEnd ){
		// à cheval entre 2 années
		$retour = "du ".strftime("%d %B %Y", $timeStart)." au ".strftime("%d %B %Y", $timeEnd);
	} elseif( $moisStart != $moisEnd ){
		// à cheval entre 2 mois
		$retour = "du ".strftime("%d %B", $timeStart)." au ".strftime("%d %B %Y", $timeEnd);
	} else {
		// même mois
		$retour = "du ".strftime("%d", $timeStart)." au ".strftime("%d %B %Y", $timeEnd);
	}
	return $retour;
}

Et voilà comment on l'utilise (j'ai utilisé setlocale pour avoir la date en Français)

setlocale(LC_TIME, 'fra_fra'); // Pour avoir les jours et mois en Français, sous Windows

// Exemples d'utilisation
echo week2str( date('Y'), date('W') )."\n"; // semaine courante
echo week2str( '2012', '47' )."\n";         // même mois
echo week2str( '2012', '48' )."\n";         // à cheval entre 2 mois
echo week2str( '2012', '53' )."\n";         // à cheval entre 2 années

Voici un billet similaire qui vous permettera d'en savoir plus sur types de graphiques excel.

L'essentiel est de comprendre les 2 premières lignes, qui servent à récupérer le timestamp de début et le timestamp de fin. La première ligne récupère la date du lundi de la première semaine de janvier de l'année passée en paramètre, et y ajoute le nombre de semaines passé en paramètre. Si vous demandez la 2éme semaine de 2013, cette semaine commence pile 1 semaine après le premier lundi de l'année 2013...

Pour récupérer la date de fin c'est un peu la même technique, sauf qu'on y retire un jour (- 1 day) pour obtenir la veille du lundi (c'est à dire dimanche, dernier jour de la semaine).

Attention, si vous utilisez setlocale et que votre site est en UTF-8, sous Windows, est possible que vous ayez des problèmes d'accent. Dans ce cas, il faut utiliser la fonction utf8_encode pour encoder le résultat en UTF8. Sur Unix il y a une solution plus propre, puisque UNIX gère des fichiers de langue UTF8, comme ceci : setlocale(LC_TIME, 'fr_FR.UTF8');.

Fini de lire cette page ? allez faire un tour ici : webdesign frais/pastel, ça peut vous intéresser.

6 commentaires :
commentaire n°2849 par Sebus059
Sebus059 mardi 15 juillet 2014, 13:11
Pour un de mes dév, j'avais besoin de cette fonction. Néanmoins, elle est erronée (pas buguée, juste erronée).
En effet, la première semaine de l'année est celle qui contient le PREMIER JEUDI.

Norme ISO 8601 :
- la semaine commence le lundi ;
- les jours de chaque semaine sont numérotés de 1 (un) pour le lundi, à 7 (sept) pour le dimanche ;
- la semaine 1 est celle qui contient le premier jeudi de l'année.

Il faudrait donc à mon sens remplacer les "Monday" par des "Thursday".
Voilà et merci pour le code…

Sébastien
commentaire n°2879 par Galdon
Galdon dimanche 7 septembre 2014, 01:33
Ok merci pour l'info, je ne savais pas, j'ai corrigé le code dans le tuto.
commentaire n°2857 par Sebus059
Sebus059 mardi 5 août 2014, 00:23
Pour compléter mon post précédent, j'ai créer une classe php qui gère tout ça très bien.
C'est dispo ici : http://www.macmax.org/2014/08/04/php-trouver-un-jour-dune-semaine-dont-on-connait-le-numero/
commentaire n°3118 par FredDKR
FredDKR vendredi 31 juillet 2015, 20:39
Salut,

Je cherchais un truc comme ça et je ne trouvais pas mon bonheur donc j'ai réfléchi 2 secondes et ça donne ça :

$someDate = '31/07/2015' ;
$lundiDate = Date( 'd/m/Y', strtotime( 'previous monday', strtotime( $someDate ) ) ) ;
$dimancheDate = Date( 'd/m/Y', strtotime( 'next sunday', strtotime( $someDate ) ) ) ;

Enjoy !
FRED
commentaire n°3246 par erickroos
erickroos vendredi 12 février 2016, 16:09
la fonction reste erronée du moment ou vous ne gerer pas les années bissextile
commentaire n°3295 par Luis
Luis mardi 26 avril 2016, 16:01
Bonjour à tous,

Sébus059 a dit "En effet, la première semaine de l'année est celle qui contient le PREMIER JEUDI."

Et si le premier jour de l'année est un vendredi, samedi ou dimanche, comment fait-on ?
En l'occurence, le script ne fonctionne pas correctement pour 2016 vu qu'il ressort la semaine à venir à la place de la semaine en cours.

Bien cordialement.
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré