J'ai vu quelques variantes sur cette question mais je crois que l'on n'a pas encore répondu à celle-ci.
J'ai besoin de la date de début et de fin d'une semaine, choisie par l'année et le numéro de la semaine (pas une date)
exemple:
contribution:
getStartAndEndDate($week, $year);
sortie:
$return[0] = $firstDay;
$return[1] = $lastDay;
La valeur de retour ressemblera à un tableau dans lequel la première entrée est la date de début de semaine et la seconde est la date de fin.
FACULTATIF: pendant que nous y sommes, le format de date doit être Y-n-j
(format de date normal, pas de zéros à gauche).
J'ai essayé d'éditer des fonctions existantes qui faisaient presque ce que je voulais mais je n'ai pas eu de chance jusqu'à présent.
S'il vous plaît aidez-moi, merci d'avance.
Il y a plusieurs années, j'ai trouvé cette fonction:
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$dto->setISODate($year, $week);
$ret['week_start'] = $dto->format('Y-m-d');
$dto->modify('+6 days');
$ret['week_end'] = $dto->format('Y-m-d');
return $ret;
}
$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
Utilisation de DateTime class:
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$dto->setISODate($year, $week);
$ret['week_start'] = $dto->format('Y-m-d');
$dto->modify('+6 days');
$ret['week_end'] = $dto->format('Y-m-d');
return $ret;
}
$week_array = getStartAndEndDate(52,2013);
print_r($week_array);
Résultats:
Array
(
[week_start] => 2013-12-23
[week_end] => 2013-12-29
)
A expliqué:
Une version plus courte (fonctionne dans> = php5.3):
function getStartAndEndDate($week, $year) {
$dto = new DateTime();
$ret['week_start'] = $dto->setISODate($year, $week)->format('Y-m-d');
$ret['week_end'] = $dto->modify('+6 days')->format('Y-m-d');
return $ret;
}
Pourrait être raccourci avec l'accès des membres de la classe à l'instanciation in> = php5.4.
Nous pouvons y parvenir facilement sans recourir à des calculs supplémentaires autres que ceux inhérents à la classe DateTime .
function getStartAndEndDate($year, $week)
{
return [
(new DateTime())->setISODate($year, $week)->format('Y-m-d'), //start date
(new DateTime())->setISODate($year, $week, 7)->format('Y-m-d') //end date
];
}
La fonction setISODate()
accepte trois arguments: $year
, $week
et $day
respectivement, où $day
est défini par défaut sur 1 - le premier jour de la semaine. Nous passons donc 7 pour obtenir la date exacte du 7ème jour du $week
.
Solution légèrement plus propre, utilisant le format strtotime "[année] W [semaine] [jour]":
function getStartAndEndDate($week, $year) {
// Adding leading zeros for weeks 1 - 9.
$date_string = $year . 'W' . sprintf('%02d', $week);
$return[0] = date('Y-n-j', strtotime($date_string));
$return[1] = date('Y-n-j', strtotime($date_string . '7'));
return $return;
}
moyen le plus rapide de le faire:
function week_date($week, $year){
$date = new DateTime();
return "first day of the week is ".$date->setISODate($year, $week, "1")->format('Y-m-d')
."and last day of the week is ".$date->setISODate($year, $week, "7")->format('Y-m-d');
}
echo week_date(12,2014);
C'est une vieille question, mais bon nombre des réponses ci-dessus semblent incorrectes. Je suis venu avec ma propre solution:
function getStartAndEndDate($week, $year){
$dates[0] = date("Y-m-d", strtotime($year.'W'.str_pad($week, 2, 0, STR_PAD_LEFT)));
$dates[1] = date("Y-m-d", strtotime($year.'W'.str_pad($week, 2, 0, STR_PAD_LEFT).' +6 days'));
return $dates;
}
Le calcul de Roham Rafii est faux. Voici une solution courte:
// week number to timestamp (first day of week number)
function wn2ts($week, $year) {
return strtotime(sprintf('%dW%02d', $year, $week));
}
si vous voulez le dernier jour de la semaine, vous pouvez ajouter 6 * 24 * 3600
Pour la documentation (puisque Google a classé cette question en premier lors de la recherche de "Date de début php datetime cette semaine").
Si vous avez besoin des dates de début et de fin pour la semaine en cours (à l’aide de DateTime):
$dateTime = new DateTime('now');
$monday = clone $dateTime->modify(('Sunday' == $dateTime->format('l')) ? 'Monday last week' : 'Monday this week');
$sunday = clone $dateTime->modify('Sunday this week');
var_dump($monday->format('Y-m-d')); // e.g. 2018-06-25
var_dump($sunday->format('Y-m-d')); // e.g. 2018-07-01
J'espère que cela aidera.
Nous avons d’abord besoin d’un jour à partir de cette semaine. Par conséquent, si vous connaissez le numéro de semaine et que vous avez sept jours, nous allons le faire.
$pickADay = ($weekNo-1) * 7 + 3;
de cette façon, pickAday sera un jour de notre semaine souhaitée.
Maintenant, parce que nous connaissons l’année, nous pouvons vérifier quel jour est… .. les choses sont simples si nous n’avons besoin que de dates plus récentes que l’horodatage Unix Nous allons obtenir l’horodatage Unix pour le premier jour de l’année et ajouter à cela 24*3600*$pickADay
et tout est simple à partir de là car nous avons son horodatage, nous pouvons savoir de quel jour il s’agit et calculer le début et la fin de la semaine en conséquence.
Si nous voulons découvrir la même chose, disons de la 12ème semaine de 1848, nous devons utiliser une autre approche car nous ne pouvons pas obtenir l'horodatage. Sachant que chaque année, un jour avance de 1 jour de semaine (le 1er novembre de l’année dernière était un dimanche, cette année est un lundi, à l’exception des années bissextiles où il avance de 2 jours je crois, vous pouvez le vérifier). Ce que je ferais si l’année est plus ancienne que 1970 et qu’elle fait la différence entre cette année et l’année nécessaire pour savoir combien d’années y sont consacrées, calculez le jour de la semaine où mon pickaday faisait partie de 1970, décalez-le d’un jour de semaine pour chaque . $shiftTimes = ($yearDifference + $numberOfLeapYears)%7
, dans la différence. décale les mots de la journée $ shiftTimes, vous saurez quel jour de la semaine était ce jour-là ces années-là, puis trouvez le tête de semaine et le queue de semaine. La même chose peut être utilisée également pour l'avenir si cela semble plus simple. Essayez si cela fonctionne et dites-moi si cela ne fonctionne pas.
Avez-vous essayé PHP dates relatives ? Cela peut fonctionner.
$dateParam = '2018-06-10';
$week = date('w', strtotime($dateParam));
$date = new DateTime($dateParam);
$firstWeek = $date->modify("-".$week." day")->format("Y-m-d H:i:s");
$endWeek = $date->modify("+6 day")->format("Y-m-d H:i:s");
echo $firstWeek."<br/>";
echo $endWeek;
imprimera
2018-06-10 00:00:00
2018-06-16 00:00:00
espérons aider
Même si vous ne voulez pas utiliser une date spécifique, vous ne pouvez pas y échapper. Vous pouvez calculer une semaine en fonction de la date uniquement.
Pas:
Je recommande de travailler avec un système de dates cohérent comme Zend_Date ou Pear Date .