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?
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;
?>
$date_string = "2012-10-18";
echo "Weeknummer: " . date("W", strtotime($date_string));
Verwenden Sie die Datumsfunktion von PHP
http://php.net/manual/de/function.date.php
date("W", $yourdate)
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)); ?>
Dieses heutige Datum erhält dann die Wochennummer der Woche
<?php
$date=date("W");
echo $date." Week Number";
?>
<?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
versuchen Sie diese Lösung
date( 'W', strtotime( "2017-01-01 + 1 day" ) );
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.
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'));
}
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
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/
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