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?
Antworten:
Heute
DateTime
ist 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: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; ?>
quelle
Carbon::createFromFormat('Y-m-d H', '2012-10-18')->format('W');
mktime()
falsch ist, nicht die Reihenfolge des OP. Letzteres ist natürlich leichter zu ändern.$date_string = "2012-10-18"; echo "Weeknummer: " . date("W", strtotime($date_string));
quelle
Verwenden Sie die PHP-Datumsfunktion
http://php.net/manual/en/function.date.php
date("W", $yourdate)
quelle
Dieses Get Today-Datum gibt dann die Wochennummer für die Woche an
<?php $date=date("W"); echo $date." Week Number"; ?>
quelle
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)); ?>
quelle
<?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
quelle
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.
quelle
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
quelle
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/
quelle
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
quelle
date('W', $date)
basiert PHP . Dies ist jedoch nicht die einzige Regel.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')); }
quelle
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
quelle
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
quelle
Wie wäre es mit der
IntlGregorianCalendar
Klasse?Anforderungen : Bevor Sie mit der Verwendung beginnen,
IntlGregorianCalendar
stellen Sie sicher, dasslibicu
oderpecl/intl
auf dem Server installiert ist. Führen Sie also die CLI aus:Wenn Sie
intl
in der[PHP Modules]
Liste sehen, können Sie verwendenIntlGregorianCalendar
.DateTime vs IntlGregorianCalendar :
IntlGregorianCalendar
ist dann nicht besserDateTime
. Aber das Gute daranIntlGregorianCalendar
ist, dass Sie die Wochennummer als erhaltenint
.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
quelle
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".
quelle
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.
quelle
Versuchen Sie diese Lösung
date( 'W', strtotime( "2017-01-01 + 1 day" ) );
quelle