Connaître les jours de début et de fin de semaine en PHP
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.
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
C'est dispo ici : http://www.macmax.org/2014/08/04/php-trouver-un-jour-dune-semaine-dont-on-connait-le-numero/
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
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.