web-dev-qa-db-fra.com

PHP obtenir les dates de début et de fin d'une semaine par numéro de semaine

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.

44
Pieter888

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);
36
Roham Rafii

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é:

  • Créer un nouvel objet DateTime dont la valeur par défaut est now ()
  • Appelez setISODate pour changer l'objet en premier jour de $ semaine de $ année au lieu de maintenant ()
  • Formatez la date en tant que 'Y-m-d' et mettez $ ret ['week_start']
  • Modifier l'objet en ajoutant 6 jours, ce qui sera la fin de $ week
  • Format la date comme 'Y-m-d' et mettre dans $ ret ['week_end']

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.

141
user3108829

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.

11
Henry Ohanga

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;
}
10
tripper54

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);
3
Claudiu Creanga

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;
}
2
bezz

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

1
FirePanther

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.

1
Kai Noack

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. 

1
Catalin Marin

Avez-vous essayé PHP dates relatives ? Cela peut fonctionner.

0
Mikel
$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

0
user2963512

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:

  1. obtenir le premier jour de l'année 
  2. décider du début de la première semaine (certaines règles incluent le premier jeudi, si je me souviens bien).
  3. ajoutez un certain nombre de semaines (votre premier paramètre). Zend_Date a une fonction add () où vous pouvez ajouter des semaines par exemple. Cela vous donnera le premier jour de la semaine.
  4. compenser et obtenir le dernier jour.

Je recommande de travailler avec un système de dates cohérent comme Zend_Date ou Pear Date .

0
Elzo Valugi