web-dev-qa-db-fra.com

Obtenir le numéro de semaine (dans l'année) à partir d'une date PHP

Je veux prendre un rendez-vous et calculer son numéro de semaine.

Jusqu'à présent, j'ai ce qui suit. Il revient 24 quand il devrait être 42.

<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[2], $duedt[1],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>

Est-ce une erreur et une coïncidence que les chiffres soient inversés? Ou suis-je presque là?

56
AJFMEDIA

Aujourd'hui, utiliser PHP DateTime objects est préférable:

<?php
$ddate = "2012-10-18";
$date = new DateTime($ddate);
$week = $date->format("W");
echo "Weeknummer: $week";

C'est parce que dans mktime(), ça se passe comme ça:

mktime(hour, minute, second, month, day, year);

Par conséquent, votre commande est fausse.

<?php
$ddate = "2012-10-18";
$duedt = explode("-", $ddate);
$date  = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]);
$week  = (int)date('W', $date);
echo "Weeknummer: " . $week;
?>
134
Madara Uchiha
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
48
pbond

Utiliser la fonction de date de PHP
http://php.net/manual/en/function.date.php

date("W", $yourdate)
11
cjtech

Juste comme une suggestion:

<?php echo date("W", strtotime("2012-10-18")); ?>

Peut-être un peu plus simple que tout ça.

Autres choses que vous pourriez faire: 

<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?>
<?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?>
8
Andrew Myers

Cette date d’aujourd’hui puis dire le numéro de la semaine pour la semaine 

<?php
 $date=date("W");
 echo $date." Week Number";
 ?>
6
user3133144
<?php
$ddate = "2012-10-18";
$duedt = explode("-",$ddate);
$date = mktime(0, 0, 0, $duedt[1], $duedt[2],$duedt[0]);
$week = (int)date('W', $date);
echo "Weeknummer: ".$week;
?>

Vous avez eu le mauvais réglage du paramètre - il doit s'agir du mois/jour/année et non du jour/mois/année

1
FreudianSlip

essayez cette solution

date( 'W', strtotime( "2017-01-01 + 1 day" ) );
0
Ahmed Mohamed

J'essaie de résoudre cette question depuis des années maintenant, je pensais avoir trouvé une solution plus courte mais je devais revenir à la longue histoire. Cette fonction restitue la bonne notation de semaine ISO:

/**
 * calcweek("2018-12-31") => 1901
 * This function calculates the production weeknumber according to the start on 
 * monday and with at least 4 days in the new year. Given that the $date has
 * the following format Y-m-d then the outcome is and integer.
 *
 * @author M.S.B. Bachus
 *
 * @param date-notation PHP "Y-m-d" showing the data as yyyy-mm-dd
 * @return integer
 **/
function calcweek($date) {
  // 1. Convert input to $year, $month, $day
  $dateset      = strtotime($date);
  $year         = date("Y", $dateset);
  $month        = date("m", $dateset);
  $day          = date("d", $dateset);

  $referenceday = getdate(mktime(0,0,0, $month, $day, $year));
  $jan1day      = getdate(mktime(0,0,0,1,1,$referenceday[year]));

  // 2. check if $year is a  leapyear
  if ( ($year%4==0 && $year%100!=0) || $year%400==0) {
    $leapyear = true;
  } else {
    $leapyear = false;
  }

  // 3. check if $year-1 is a  leapyear
  if ( (($year-1)%4==0 && ($year-1)%100!=0) || ($year-1)%400==0 ) {
    $leapyearprev = true;
  } else {
    $leapyearprev = false;
  }

  // 4. find the dayofyearnumber for y m d
  $mnth = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
  $dayofyearnumber = $day + $mnth[$month-1];
  if ( $leapyear && $month > 2 ) { $dayofyearnumber++; }

  // 5. find the jan1weekday for y (monday=1, sunday=7)
  $yy = ($year-1)%100;
  $c  = ($year-1) - $yy;
  $g  = $yy + intval($yy/4);
  $jan1weekday = 1+((((intval($c/100)%4)*5)+$g)%7);

  // 6. find the weekday for y m d
  $h = $dayofyearnumber + ($jan1weekday-1);
  $weekday = 1+(($h-1)%7);

  // 7. find if y m d falls in yearnumber y-1, weeknumber 52 or 53
  $foundweeknum = false;
  if ( $dayofyearnumber <= (8-$jan1weekday) && $jan1weekday > 4 ) {
    $yearnumber = $year - 1;
    if ( $jan1weekday = 5 || ( $jan1weekday = 6 && $leapyearprev )) {
      $weeknumber = 53;
    } else {
      $weeknumber = 52;
    }
    $foundweeknum = true;
  } else {
    $yearnumber = $year;
  }

  // 8. find if y m d falls in yearnumber y+1, weeknumber 1
  if ( $yearnumber == $year && !$foundweeknum) {
    if ( $leapyear ) {
      $i = 366;
    } else {
      $i = 365;
    }
    if ( ($i - $dayofyearnumber) < (4 - $weekday) ) {
      $yearnumber = $year + 1;
      $weeknumber = 1;
      $foundweeknum = true;
    }
  }

  // 9. find if y m d falls in yearnumber y, weeknumber 1 through 53
  if ( $yearnumber == $year && !$foundweeknum ) {
    $j = $dayofyearnumber + (7 - $weekday) + ($jan1weekday - 1);
    $weeknumber = intval( $j/7 );
    if ( $jan1weekday > 4 ) { $weeknumber--; }
  }

  // 10. output iso week number (YYWW)
  return ($yearnumber-2000)*100+$weeknumber;
}

J'ai découvert que ma solution courte avait manqué le 2018-12-31, car elle rendait 1801 au lieu de 1901. J'ai donc dû intégrer cette version longue qui est correcte.

0
Marcel Bachus

Pour obtenir le nombre correct de semaines pour la date 2018-12-31, veuillez utiliser le code ci-dessous.

$day_count = date('N',strtotime('2018-12-31'));
$week_count = date('W',strtotime('2018-12-31'));    


if($week_count=='01' && date('m',strtotime('2018-12-31'))==12){
    $yr_count = date('y',strtotime('2018-12-31')) + 1;
}else{
    $yr_count = date('y',strtotime('2018-12-31'));
}
0
Bhushan D

La règle est que la première semaine d'une année est la semaine qui contient le premier jeudi de l'année.

Personnellement, j'utilise Zend_Date pour ce type de calcul et obtenir la semaine d'aujourd'hui est aussi simple que cela. Ils ont beaucoup d'autres fonctions utiles si vous travaillez avec des dates.

$now = Zend_Date::now();
$week = $now->get(Zend_Date::WEEK);
// 10
0
Elzo Valugi

Votre code fonctionnera, mais vous devez inverser le 4ème et le 5ème argument.

Je le ferais de cette façon

$date_string = "2012-10-18";
$date_int = strtotime($date_string);
$date_date = date($date_int);
$week_number = date('W', $date_date);
echo "Weeknumber: {$week_number}.";

En outre, les noms de vos variables vous laisseront perplexe après une semaine de non-observation de ce code, vous devriez envisager de lire http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php- programmeur/

0
Jake

Pour obtenir le numéro de semaine pour une date en Amérique du Nord, j'aime bien ceci:

function week_number($n)
{
    $w = date('w', $n);
    return 1 + date('z', $n + (6 - $w) * 24 * 3600) / 7;
}

$n = strtotime('2022-12-27');
printf("%s: %d\n", date('D Y-m-d', $n), week_number($n));

et obtenir:

Tue 2022-12-27: 53

0
Kjeld