8768 sujets

Développement web côté serveur, CMS

Bonjour,

je suis en train de retourner les fonctions de date en Php dans tous les sens, et je n'arrive pas à faire ce que je voudrais.
Connaissez vous un moyen de déterminer quel jour commence la semaine ISO de n'importe qu'elle année.

par exemple:
ma_function_magique('2015') renverrait le 29 décembre 2014
ma_function_magique('2016') renverrait le 4 janvier 2016
ma_function_magique('2019') renverrait le 31 décembre 2018
ma_function_magique('2022') renverrait le 3 janvier 2022

je vais prendre un Doliprane en attendant.... Smiley cligne
Modifié par lionel_css3 (31 Jan 2017 - 15:49)
Salut,
Il suffit de tester si le 1er janvier tombe sur la semaine 1. Si non, il faut avancer au lundi suivant, si oui au précédent à condition que le 1er janvier ne soit déjà un lundi.

function firstDayOfFirstIsoWeek($year){
  $dt=new DateTime("$year/01/01");
  if($dt->format("N")!=1){
    if($dt->format("W")!=1){
      $dt->modify("next monday");
    }else{
      $dt->modify("previous monday");
    }
  }
  return $dt;
}


echo firstDayOfFirstIsoWeek(2016)->format('d/m/Y').'<br>';
echo firstDayOfFirstIsoWeek(2017)->format('d/m/Y').'<br>';
echo firstDayOfFirstIsoWeek(2018)->format('d/m/Y').'<br>';
echo firstDayOfFirstIsoWeek(2019)->format('d/m/Y').'<br>';
echo firstDayOfFirstIsoWeek(2022)->format('d/m/Y').'<br>';


++
ça marche super, encore un grand merci à toi, chapeau pour la concision de la fonction...

c'est vrai que c'est pas évident de travailler avec les dates en Php
Modérateur
euhh, ça ne donne pas la première semaine ISO (qui peut commencer avant le premier janvier) si c'est vraiment ce qui est recherché. Le calcul de la semaine ISO est trop complexe pour le faire à la main (une trentaine de condition à tester)

Par contre ceci oui:


$date = new DateTime();
$date->setISODate(2008, 1);
print $date->format('d m Y');
kustolovic a écrit :
euhh, ça ne donne pas la première semaine ISO (qui peut commencer avant le premier janvier) si c'est vraiment ce qui est recherché. Le calcul de la semaine ISO est trop complexe pour le faire à la main (une trentaine de condition à tester)


ben sur que si, la formule renvoie certains résultats sur l'année d'avant, par exemple pour la semaine 01 de 2015 la formule renvoie bien le 29 décembre 2014..

Par contre ta formule à l'aitre aussi très intéressante..
Modifié par lionel_css3 (01 Feb 2017 - 09:45)
Modérateur
Au temps pour moi, en effet, j'avais lu de travers. Par contre setIsoDate reste plus simple et plus lisible Smiley smile
kustolovic a écrit :
Au temps pour moi, en effet, j'avais lu de travers. Par contre setIsoDate reste plus simple et plus lisible Smiley smile


oui, après réflexion c'est vrai, plus compact Smiley smile
c'est bizarre, la fonction ne sait pas détecter si il y a une semaine 53 ou pas

$date->setISODate(2010, 53); renvoie la première semaine de 2011 par exemple.
Modérateur
La fonction définit la semaine, comme toute les fonction de définition dans DateTime les valeurs supplémentaires sont ajoutées:


$date->setDate(2017, 1, 32); => le 32 janvier est le premier février.


C'est parfois très pratique parfois pas.


$date = new DateTime();
$date->setISODate(2016+1, 1, -1);
$date->format('W'); // Nombre de semaine de 2016
kustolovic a écrit :



$date = new DateTime();
$date-&gt;setISODate(2016+1, 1, -1);
$date-&gt;format('W'); // Nombre de semaine de 2016


wouaouu, toi t'es fort Smiley smile
kustolovic a écrit :
euhh, ça ne donne pas la première semaine ISO (qui peut commencer avant le premier janvier) si c'est vraiment ce qui est recherché. Le calcul de la semaine ISO est trop complexe pour le faire à la main (une trentaine de condition à tester)

Si si, pour 2019 ça donne bien le 31/12/2018. Mais il est vrai qu'on s'épargne du code avec setISODate, que je ne connaissais pas.

Edit : excusez pour la redite, je pense que la nouvelle présentation m'a leurré, je n'avais pas vu l'ensemble de l'échange.
Modifié par Seven tears (01 Feb 2017 - 20:35)