cs_brezoneg
Messages postés104Date d'inscriptionsamedi 6 novembre 2004StatutMembreDernière intervention19 août 2015
-
28 déc. 2008 à 20:15
kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 2012
-
29 déc. 2008 à 22:26
Bonjour et joyeuses fêtes à tous.
Je voudrais récupérer le nom du mois sachant que je n'ai que la semaine et l'année. Je sais qu' une semaine peut être sur deux mois; Mais quelqu'un à t'il une solution ?
merci d'avance !
kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 28 déc. 2008 à 23:05
Salut Brezoneg,
A mon avis ce n'est pas "raisonnablement" possible. Comme tu le dis une semaine peut être sur deux mois différents, ce qui fausse le résultat, et pire, il peut y avoir 2 semaines 01 sur une année (... je dis une connerie ?)
Semaine 01 du 31 décembre 1979 au 06 janvier 1980
Semaine 01 du 29 décembre 1980 au 04 janvier 1981
Au final tu n'auras pas de résultat fiable.
Bon, je viens de gribouiller ça (pas le temps de faire trop de tests) :
// search_month (année, numéro de la semaine)
function search_month ($year, $week) {
for ($i=1; $i <= 365; $i++) {
$mk = mktime(0, 0, 0, 1, $i, $year);
$b = date("n", $mk);
$w = date("W", $mk);
if ($w == $week) return $b;
}
}
cs_jeca
Messages postés341Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention14 juillet 201114 29 déc. 2008 à 08:43
Bonjour,
Tout d'abord :
Semaine 01 du 31 décembre 1979 au 06 janvier 1980 = semaine 01 de 1980 ;
Semaine 01 du 29 décembre 1980 au 04 janvier 1981 = semaine 01 de 1981.
Donc, une seule semaine 01 par année.
Ensuite, essaie ce code :
<?php
function dateSemainePhp51($annee, $numSemaine)
{
//-- initialisation d'un objet DateTime au 4 janvier -------------------------
//-- celui-ci se trouve obligatoirement dans la semaine N° 1 -----------------
$date = new DateTime($annee . '-01-04');
//-- si le 4 janvier n'est pas un lundi, -------------------------------------
//-- le lundi précédent est le lundi de la semaine N° 1 ----------------------
if ($date -> format('N') > 1)
{
$date -> modify('last monday');
}
//-- on ajoute le nombre de semaines -----------------------------------------
//-- pour avoir le lundi de la semaine recherchée ----------------------------
$date -> modify('+' . ($numSemaine - 1) . ' week');
$dateDeb = $date -> format('d/m/Y');
//-- on ajoute 6 jours pour avoir le dernier jour de la semaine recherchée ---
$date -> modify('+6 day');
$dateFin = $date -> format('d/m/Y');
return array($dateDeb, $dateFin);
}
function dateSemainePhp5($annee, $numSemaine)
{
$timeStamp = strtotime($annee . '-01-04');
//-- si le 4 janvier n'est pas un lundi, -------------------------------------
//-- le lundi précédent est le lundi de la semaine N° 1 ----------------------
if (date('N', $timeStamp) > 1)
{
$timeStamp = strtotime('last monday', $timeStamp);
}
//-- on ajoute le nombre de semaines -----------------------------------------
//-- pour avoir le lundi de la semaine recherchée ----------------------------
$timeStamp = strtotime('+' . ($numSemaine - 1) . ' week', $timeStamp);
$dateDeb = date('d/m/Y', $timeStamp);
//-- on ajoute 6 jours pour avoir le dernier jour de la semaine recherchée ---
$timeStamp = strtotime('+6 day', $timeStamp);
$dateFin = date('d/m/Y', $timeStamp);
$jour = dateSemainePhp5($annee, $numSemaine);
echo 'la semaine N° ' . $numSemaine . ' de l\'année ' . $annee .
'
commence le ' . $jour[0] .
'
et se termine le ' . $jour[1] . '
';
$jour = dateSemainePhp51($annee, $numSemaine);
echo 'la semaine N° ' . $numSemaine . ' de l\'année ' . $annee .
'
commence le ' . $jour[0] .
'
et se termine le ' . $jour[1];
?>
Les 2 fonctions font la même chose, mais 'dateSemainePhp51' ne fonctionne qu'à partir de php 5.1, mais est de 3 à 4 fois plus rapide que l'autre.
kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 29 déc. 2008 à 09:23
Salut,
Semaine 01 du 31 décembre 1979 au 06 janvier 1980 = semaine 01 de 1980 ;
Semaine 01 du 29 décembre 1980 au 04 janvier 1981 = semaine 01 de 1981.
Donc, une seule semaine 01 par année.
=> oui, sauf que ça reste à mon sens tendancieux. Tout dépend de "l'enregistrement" initial des données.
Si je prends un exemple :
Enregistrement d'un événement survenu le 29/12/1980
$year = date("Y", [timestamp de la date]);
$week = date("W", [timestamp de la date]);
INSERT INTO machin (year, week) VALUES ('$year', '$week');
=> impossible de savoir si il s'agit de janvier ou de décembre 1980
Je cherche peut être la petite bête mais c'est un exemple tout à fait possible.
cs_jeca
Messages postés341Date d'inscriptionmercredi 17 juillet 2002StatutMembreDernière intervention14 juillet 201114 29 déc. 2008 à 09:53
C'est parce que tu n'utilises pas le bon paramètre de format :
<?php
$date = '1980-12-29';
$annee = date('o', strtotime($date));
$semaine = date('W', strtotime($date));
$jour = date('d/m/Y', strtotime($date));
echo 'le ' . $jour . ' se trouve dans la semaine N° ' . $semaine . ' de l\'année ' . $annee;
?>
Vous n’avez pas trouvé la réponse que vous recherchez ?
kohntark
Messages postés3706Date d'inscriptionlundi 5 juillet 2004StatutMembreDernière intervention27 avril 201230 29 déc. 2008 à 22:26
Je suis bien d'accord, je ne montrais pas ici ce qu'il fallait écrire, mais un exemple d'enregistrement (erroné) des données. C'est pour cela que je précisais "Je cherche peut être la petite bête", mais, tu seras sans doute d'accord avec moi, c'est une erreur qui doit arriver très fréquemment.
Après tout dépend de la pertinence des données que possède Brezoneg et de ce qu'il veut en faire. Si une erreur d'un mois ne pose pas de problème alors le tour est joué, dans le cas contraire c'est impossible.