J'ai eu la même question que l'utilisation strftime au lieu de la date comme point de départ à savoir avoir dérivé plusieurs semaines de strftime en utilisant% WI voulait connaître la plage de dates pour cette semaine - du lundi au dimanche (voire tout jour de départ). Un examen de plusieurs postes similaires et en particulier l'essai de quelques-unes des approches ci-dessus ne m'a pas amené à la solution que je voulais. Bien sûr, j'ai peut-être mal compris quelque chose, mais je n'ai pas pu obtenir ce que je voulais.
Je voudrais donc partager ma solution.
Ma première pensée a été que compte tenu de la description de strftime% W est:
numéro de la semaine
de l'année en cours, en commençant par le premier lundi comme le premier jour de la première semaine
Si j'établis quel est le premier lundi de chaque année, je pourrais calculer un tableau de plages de dates avec un indice égal à la valeur de% W. Par la suite, je pourrais appeler la fonction en utilisant strftime.
Alors, voici:
La fonction:
<?php
/*
* function to establish scope of week given a week of the year value returned from strftime %W
*/
// note strftime %W reports 1/1/YYYY as wk 00 unless 1/1/YYYY is a monday when it reports wk 01
// note strtotime Monday [last, this, next] week - runs sun - sat
function date_Range_For_Week($W,$Y){
// where $W = %W returned from strftime
// $Y = %Y returned from strftime
// establish 1st day of 1/1/YYYY
$first_Day_Of_Year = mktime(0,0,0,1,1,$Y);
// establish the first monday of year after 1/1/YYYY
$first_Monday_Of_Year = strtotime("Monday this week",(mktime(0,0,0,1,1,$Y)));
// Check for week 00 advance first monday if found
// We could use strtotime "Monday next week" or add 604800 seconds to find next monday
// I have decided to avoid any potential strtotime overhead and do the arthimetic
if (strftime("%W",$first_Monday_Of_Year) != "01"){
$first_Monday_Of_Year += (60 * 60 * 24 * 7);
}
// create array to ranges for the year. Note 52 wks is the norm but it is possible to have 54 weeks
// in a given yr therefore allow for this in array index
$week_Start = array();
$week_End = array();
for($i=0;$i<=53;$i++){
if ($i == 0){
if ($first_Day_Of_Year != $first_Monday_Of_Year){
$week_Start[$i] = $first_Day_Of_Year;
$week_End[$i] = $first_Monday_Of_Year - (60 * 60 * 24 * 1);
} else {
// %W returns no week 00
$week_Start[$i] = 0;
$week_End[$i] = 0;
}
$current_Monday = $first_Monday_Of_Year;
} else {
$week_Start[$i] = $current_Monday;
$week_End[$i] = $current_Monday + (60 * 60 * 24 * 6);
// find next monday
$current_Monday += (60 * 60 * 24 * 7);
// test for end of year
if (strftime("%W",$current_Monday) == "01"){ $i = 999; };
}
};
$result = array("start" => strftime("%a on %d, %b, %Y", $week_Start[$W]), "end" => strftime("%a on %d, %b, %Y", $week_End[$W]));
return $result;
}
?>
Exemple:
// usage example
//assume we wish to find the date range of a week for a given date July 12th 2011
$Y = strftime("%Y",mktime(0,0,0,7,12,2011));
$W = strftime("%W",mktime(0,0,0,7,12,2011));
// use dynamic array variable to check if we have range if so get result if not run function
$date_Range = date_Range . "$Y";
isset(${$date_Range}) ? null : ${$date_Range} = date_Range_For_Week($W, $Y);
echo "Date sought: " . strftime(" was %a on %b %d, %Y, %X time zone: %Z",mktime(0,0,0,7,12,2011)) . "<br/>";
echo "start of week " . $W . " is " . ${$date_Range}["start"] . "<br/>";
echo "end of week " . $W . " is " . ${$date_Range}["end"];
Sortie:
> Date sought: was Tue on Jul 12, 2011, 00:00:00 time zone: GMT Daylight
> Time start of week 28 is Mon on 11, Jul, 2011 end of week 28 is Sun on
> 17, Jul, 2011
J'ai testé sur plusieurs années, dont 2018 est l'année suivante quand 1/1/2018 = lundi. Jusqu'à présent, semble fournir la plage de dates correcte.
Donc j'espère que cela aidera.
Cordialement
Cette entrée n'est pas spécifié. L'entrée serait, par exemple, "41". –
Merci, mauvais cas de lundi matin cerveau ici, ne l'a pas lu correctement. Réponse mise à jour avec un extrait de code beaucoup plus court! – ConroyP
cet extrait de code ne fonctionne pas pour moi. Vous n'utilisez pas $ année ... – hendry