Holen Sie sich die Wochennummer (im Jahr) von einem Datum PHP

71

Ich möchte ein Date nehmen und die Wochennummer herausfinden.

Bisher habe ich folgendes. Es gibt 24 zurück, 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?

AJFMEDIA
quelle
2
Vergessen Sie nicht, die Zeitzone mit PHP.ini oder über date_default_timezone_set ('Asia / Singapore') festzulegen.
Fedmich

Antworten:

166

Heute DateTimeist es besser , PHP- Objekte zu verwenden:

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

Es ist, weil in mktime(), es geht so:

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;
?>
Madaras Geist
quelle
3
Sie können Carbon " github.com/briannesbitt/Carbon " verwenden, um Ihre Fähigkeiten bei der Datumsmanipulation zu maximieren. Für Kohlenstoff können Sie dies tun durch:Carbon::createFromFormat('Y-m-d H', '2012-10-18')->format('W');
lukaserat
27
Eigentlich ist es besser, nur die nativen DateTime-Objekte von PHP zu verwenden.
Madaras Geist
5
@lukaserat Wie unterscheidet sich das von dem, was die akzeptierte Antwort verwendet (abgesehen davon, dass OP eine externe Abhängigkeit für etwas enthalten muss, das bereits in der Sprache muttersprachlich ist)?
PeeHaa
1
Ich würde sagen, dass die Reihenfolge mktime()falsch ist, nicht die Reihenfolge des OP. Letzteres ist natürlich leichter zu ändern.
Beetstra
2
Wenn die letzte Dezemberwoche auch die erste Woche des nächsten Jahres ist (wie im Jahr 2019), erhalten Sie die Wochennummer 1 für Daten, die in diese Woche fallen (wie 30, 31)
Shah Abaz Khan,
55
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
pbond
quelle
10

Dieses Get Today-Datum gibt dann die Wochennummer für die Woche an

<?php
 $date=date("W");
 echo $date." Week Number";
 ?>
user3133144
quelle
8

Nur als Vorschlag:

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

Könnte ein bisschen 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)); ?>
Andrew Myers
quelle
1
<?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 Parameter, um die Zeit falsch zu berechnen - muss Monat / Tag / Jahr sein, nicht Tag / Monat / Jahr

FreudianSlip
quelle
1

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-Wochen-Notation 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 31.12.2018 verfehlte, da sie 1801 statt 1901 zurückgab. Also musste ich diese lange Version einfügen, die korrekt ist.

Marcel Bachus
quelle
1

Um die Wochennummer für ein Date 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

Kjeld
quelle
0

Ihr Code wird funktionieren, aber Sie müssen das 4. und das 5. Argument umdrehen.

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 für Sie verwirrend sein, nachdem Sie diesen Code eine Woche lang nicht angesehen haben. Lesen Sie http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/

Jake
quelle
0

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 der 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
Elzo Valugi
quelle
Das ist eine Regel (teilweise aus ISO 8601). Darauf date('W', $date)basiert PHP . Dies ist jedoch nicht die einzige Regel.
Mike Sherrill 'Cat Recall'
Ich habe verschiedene Jahresdaten, ist das möglich, Datum ('W', $ Datum) zu verwenden
Suneth Kalhara
0

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'));
}
Bhushan D.
quelle
0

Um die Wochennummer im Jalai-Kalender zu erhalten , können Sie Folgendes verwenden:

$weeknumber = date("W"); //number week in year
$dayweek = date("w"); //number day in week
if ($dayweek == "6")
{
    $weeknumberint = (int)$weeknumber;
    $date2int++; 
    $weeknumber = (string)$date2int;
}

echo $date2;

Ergebnis:

15

Änderung der Wochennummer am Samstag

Majid Rigi Zadeh
quelle
1
Willkommen bei stackoverflow.com. Interessanter Nebenpunkt, dass sich die Wochennummern in verschiedenen Kalendern unterschiedlich ändern. Bitte verwenden Sie jedoch ein DateTime-Objekt für Ihren Code. Außerdem deklarieren Sie keine Variablen, bevor Sie sie verwenden. Es ist in PHP erlaubt, wird aber nicht als Best Practice angesehen. Trotzdem danke für deinen ersten Beitrag.
Loek Bergman
0

Die meisten der oben genannten Beispiele verursachen ein Problem, wenn ein Jahr 53 Wochen hat (wie 2020). So werden Sie jedes vierte Jahr einen Wochenunterschied erleben. Dieser Code funktioniert nicht:

$thisYear = "2020";
$thisDate = "2020-04-24"; //or any other custom date
$weeknr = date("W", strtotime($thisDate)); //when you want the weeknumber of a specific week, or just enter the weeknumber yourself

$tempDatum = new DateTime();
$tempDatum->setISODate($thisYear, $weeknr);
$tempDatum_start = $tempDatum->format('Y-m-d');
$tempDatum->setISODate($thisYear, $weeknr, 7);
$tempDatum_end = $tempDatum->format('Y-m-d');

echo $tempDatum_start //will output the date of monday
echo $tempDatum_end // will output the date of sunday
Jeffrey
quelle
0

Wie wäre es mit der IntlGregorianCalendarKlasse?

Anforderungen : Bevor Sie mit der Verwendung beginnen, IntlGregorianCalendarstellen Sie sicher, dass libicuoder pecl/intlauf dem Server installiert ist. Führen Sie also die CLI aus:

php -m

Wenn Sie intlin der [PHP Modules]Liste sehen, können Sie verwenden IntlGregorianCalendar.

DateTime vs IntlGregorianCalendar : IntlGregorianCalendarist dann nicht besser DateTime. Aber das Gute daran IntlGregorianCalendarist, dass Sie die Wochennummer als erhalten int.

Beispiel:

$dateTime = new DateTime('21-09-2020 09:00:00');
echo $dateTime->format("W"); // string '39'

$intlCalendar = IntlCalendar::fromDateTime ('21-09-2020 09:00:00');
echo $intlCalendar->get(IntlCalendar::FIELD_WEEK_OF_YEAR); // integer 39
julianisch
quelle
0

Wird schwieriger, wenn Sie Jahr und Woche brauchen.
Versuchen Sie herauszufinden, welche Woche der 01.01.2017 ist.
(Es ist die 52. Woche des Jahres 2016, die vom Montag, den 26.12.2016 bis zum Sonntag, den 01.01.2017 stattfindet.)

Nach längerer Suche fand ich

strftime('%G-%V',strtotime("2017-01-01"))

Ergebnis: 2016-52


https://www.php.net/manual/de/function.strftime.php
ISO-8601: 1988 Wochennummer des angegebenen Jahres, beginnend mit der ersten Woche des Jahres mit mindestens 4 Wochentagen, wobei Montag der Beginn ist der Woche. (01 bis 53)


Das Äquivalent in MySQL ist DATE_FORMAT (Datum, '% x-% v') https://www.w3schools.com/sql/func_mysql_date_format.asp
Woche, in der Montag der erste Tag der Woche ist (01 bis 53).


Es konnte keine entsprechende Lösung mit date () oder DateTime gefunden werden.
Zumindest nicht ohne Lösungen wie "+ 1 Tag, letzter Montag".

Drea58
quelle
-1
function last_monday($date) 
{
    if (!is_numeric($date))
        $date = strtotime($date);
    if (date('w', $date) == 1)
        return $date;
    else
        return date('Y-m-d',strtotime('last monday',$date));
}
$date = '2021-01-04';  //Enter custom date
$year = date('Y',strtotime($date));
$date1 = new DateTime($date);
$ldate = last_monday($year."-01-01");
$date2 = new DateTime($ldate);
$diff = $date2->diff($date1)->format("%a");
$diff = $diff/7;
$week = intval($diff) + 1;
echo $week;
//Returns 2.
Muthu Kumar
quelle
-1

Versuchen Sie diese Lösung

date( 'W', strtotime( "2017-01-01 + 1 day" ) );
Ahmed Mohamed
quelle
2017-01-01 ist ein Sonntag. Wenn Sie einen Tag hinzufügen, gelangen Sie in die nächste Woche, wobei die Wochen ab Montag beginnen. 2017-01-01 ist die 52. Woche von 2016.
Drea58