Получить номер недели (в году) от даты PHP
Я хочу взять дату и номер недели.
пока у меня есть следующие. Он возвращается 24, когда он должен быть 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;
?>
это неправильно и совпадение, что цифры поменялись местами? Или я уже почти там?
12 ответов:
сегодня, используя PHP
DateTimeобъекты лучше:<?php $ddate = "2012-10-18"; $date = new DateTime($ddate); $week = $date->format("W"); echo "Weeknummer: $week";
Это потому, что в
mktime(), это звучит так:mktime(hour, minute, second, month, day, year);следовательно, ваш заказ неправильно.
<?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; ?>
использовать функцию даты PHP
http://php.net/manual/en/function.date.phpdate("W", $yourdate)
просто как предложение:
<?php echo date("W", strtotime("2012-10-18")); ?>может быть немного проще, чем все, что много.
другие вещи, которые вы могли бы сделать:
<?php echo date("Weeknumber: W", strtotime("2012-10-18 01:00:00")); ?> <?php echo date("Weeknumber: W", strtotime($MY_DATE)); ?>
это получить сегодня дату, то скажите номер недели за неделю
<?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; ?>у вас были параметры для mktime неправильно-должен быть месяц / день / год, а не день/месяц/год
ваш код будет работать, но нужно перевернуть 4-й и 5-й аргумент.
Я бы сделал это так
$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}.";кроме того, ваши имена переменных будут сбивать вас с толку после недели не глядя на этот код, вы должны рассмотреть возможность чтения http://net.tutsplus.com/tutorials/php/why-youre-a-bad-php-programmer/
правило состоит в том, что первая неделя года-это неделя, содержащая первый четверг года.
Я лично использую Zend_Date для такого рода расчета и получить неделю на сегодня это просто. У них есть много других полезных функций при работе с датами.
$now = Zend_Date::now(); $week = $now->get(Zend_Date::WEEK); // 10
Я пытался решить этот вопрос в течение многих лет, я думал, что нашел более короткое решение, но пришлось снова вернуться к длинной истории. Эта функция возвращает правильное обозначение недели 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; }Я обнаружил, что мое короткое решение пропустило 2018-12-31, поскольку оно вернуло 1801 вместо 1901. Поэтому мне пришлось вставить эту длинную версию, которая является правильной.
чтобы получить номер недели для даты в Северной Америке мне нравится это:
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));и
Tue 2022-12-27: 53
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.
Comments