wake-up-neo.com

Ermitteln Sie die Wochennummer (im Jahr) von einem Datum PHP

Ich möchte ein Datum nehmen und die Wochennummer erarbeiten.

Bisher habe ich folgendes. Es wird 24 zurückgegeben, wenn es 42 sein sollte.

<?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;
?>

Ist es falsch und ein Zufall, dass die Ziffern vertauscht sind? Oder bin ich fast da?

56
AJFMEDIA

Heute ist die Verwendung von PHP DateTime objects besser:

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

Es ist so, weil es in mktime() so läuft:

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

Daher ist Ihre Bestellung falsch.

<?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

Verwenden Sie die Datumsfunktion von PHP
http://php.net/manual/de/function.date.php

date("W", $yourdate)
11
cjtech

Nur als Vorschlag:

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

Könnte etwas einfacher sein als all das.

Andere Dinge, die Sie tun könnten: 

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

Dieses heutige Datum erhält dann die Wochennummer der Woche 

<?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;
?>

Sie hatten die Params zu mktime falsch - muss Monat/Tag/Jahr sein, nicht Tag/Monat/Jahr

1
FreudianSlip

versuchen Sie diese Lösung

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

Ich habe seit Jahren versucht, diese Frage zu lösen, ich dachte, ich hätte eine kürzere Lösung gefunden, musste aber noch einmal auf die lange Geschichte zurückkommen. Diese Funktion gibt die richtige ISO-Wochennotation zurück:

/**
 * 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;
}

Ich fand heraus, dass meine kurze Lösung den 2018-12-31 verpasste, da er 1801 statt 1901 zurückgegeben wurde. Also musste ich diese lange Version einfügen, die korrekt ist.

0
Marcel Bachus

Um die korrekte Wochenzahl für das Datum 2018-12-31 zu erhalten, verwenden Sie bitte den folgenden Code

$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

Die Regel ist, dass die erste Woche eines Jahres die Woche ist, die den ersten Donnerstag des Jahres enthält.

Ich persönlich benutze Zend_Date für diese Art von Berechnung und die Woche für heute zu bekommen ist so einfach. Sie haben viele andere nützliche Funktionen, wenn Sie mit Datumsangaben arbeiten.

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

Ihr Code wird funktionieren, aber Sie müssen das vierte und fünfte Argument umkehren.

Ich würde es so machen

$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}.";

Außerdem werden Ihre Variablennamen nach einer Woche, in der Sie den Code nicht angeschaut haben, verwirrend sein. Sie sollten http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php- lesen. Programmierer/

0
Jake

Um die Wochennummer für ein Datum in Nordamerika zu erhalten, gefällt mir Folgendes:

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));

und bekomme:

Tue 2022-12-27: 53

0
Kjeld