hi, как не найти недель и каждую дату понедельника между 2 датами. для ex 10-07-2009 по сегодняшний день.
Примечание. Также учитывайте високосный год и другие ограничения, связанные с датой.
hi, как не найти недель и каждую дату понедельника между 2 датами. для ex 10-07-2009 по сегодняшний день.
Примечание. Также учитывайте високосный год и другие ограничения, связанные с датой.
echo datediff('ww', '9 July 2003', '4 March 2004', false);
Найдите функцию на сайте ниже: http://www.addedbytes.com/code/php-datediff-function/
ОБНОВИТЬ
Ссылка теперь не работает (сентябрь 2017 г.), поэтому функция, приведенная ниже, извлечена из веб-архива:
<?php
/**
* @param $interval
* @param $datefrom
* @param $dateto
* @param bool $using_timestamps
* @return false|float|int|string
*/
function datediff($interval, $datefrom, $dateto, $using_timestamps = false)
{
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
$difference = $dateto - $datefrom; // Difference in seconds
$months_difference = 0;
switch ($interval) {
case 'yyyy': // Number of full years
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;
case "q": // Number of full quarters
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;
case "m": // Number of full months
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;
case 'y': // Difference between day numbers
$datediff = date("z", $dateto) - date("z", $datefrom);
break;
case "d": // Number of full days
$datediff = floor($difference / 86400);
break;
case "w": // Number of full weekdays
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;
case "ww": // Number of full weeks
$datediff = floor($difference / 604800);
break;
case "h": // Number of full hours
$datediff = floor($difference / 3600);
break;
case "n": // Number of full minutes
$datediff = floor($difference / 60);
break;
default: // Number of full seconds (default)
$datediff = $difference;
break;
}
return $datediff;
}
Здесь альтернативное решение с использованием DateTime: -
function datediffInWeeks($date1, $date2)
{
if($date1 > $date2) return datediffInWeeks($date2, $date1);
$first = DateTime::createFromFormat('m/d/Y', $date1);
$second = DateTime::createFromFormat('m/d/Y', $date2);
return floor($first->diff($second)->days/7);
}
var_dump(datediffInWeeks('1/2/2013', '6/4/2013'));// 21
$diff = strtotime($dateto, 0) - strtotime($datefrom, 0);
echo floor($diff / 604800);
Следующая функция вычисляет "разговорные недели" между двумя временными метками (т.е. на следующей неделе, если вы находитесь в субботу).
function days_between($datefrom,$dateto){
$fromday_start = mktime(0,0,0,date("m",$datefrom),date("d",$datefrom),date("Y",$datefrom));
$diff = $dateto - $datefrom;
$days = intval( $diff / 86400 ); // 86400 / day
if( ($datefrom - $fromday_start) + ($diff % 86400) > 86400 )
$days++;
return $days;
}
function weeks_between($datefrom, $dateto)
{
$day_of_week = date("w", $datefrom);
$fromweek_start = $datefrom - ($day_of_week * 86400) - ($datefrom % 86400);
$diff_days = days_between($datefrom, $dateto);
$diff_weeks = intval($diff_days / 7);
$seconds_left = ($diff_days % 7) * 86400;
if( ($datefrom - $fromweek_start) + $seconds_left > 604800 )
$diff_weeks ++;
return $diff_weeks;
}
Эта работа отличная
function weeks_between($datefrom, $dateto)
{
$datefrom = DateTime::createFromFormat('d/m/Y H:i:s',$datefrom);
$dateto = DateTime::createFromFormat('d/m/Y H:i:s',$dateto);
$interval = $datefrom->diff($dateto);
$week_total = $interval->format('%a')/7;
return floor($week_total);
}
weeks_between("25/02/2000 11:30:00","05/06/2015 11:29:59")
Что-то вроде этого сделало бы работу:
$now = strtotime(date('Y-m-d'));
$end = strtotime(date('2019-06-15'));
$weeksago = date('W', $end) - date('W', $now);
Показывает 9 недель.
Я обновил Том-код сверху, чтобы функция автоматически определяла строку или int дату/время.
<?php
/**
* @param $interval
* @param $datefrom
* @param $dateto
* @param bool $using_timestamps // Removed 08-29-2019 Jay Simons - Now auto-detects
* @return false|float|int|string
*/
function datediff($interval, $datefrom, $dateto)
{
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/
/*Remove
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
*/
// Auto-detect string date or int date:
$dateto_str = strtotime($dateto);
$datefrom_str = strtotime($datefrom);
if ($dateto_str) $dateto = $dateto_str;
if ($datefrom_str) $datefrom = $datefrom_str;
$difference = $dateto - $datefrom; // Difference in seconds
$months_difference = 0;
switch ($interval) {
case 'yyyy': // Number of full years
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;
case "q": // Number of full quarters
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;
case "m": // Number of full months
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$months_difference--;
$datediff = $months_difference;
break;
case 'y': // Difference between day numbers
$datediff = date("z", $dateto) - date("z", $datefrom);
break;
case "d": // Number of full days
$datediff = floor($difference / 86400);
break;
case "w": // Number of full weekdays
$days_difference = floor($difference / 86400);
$weeks_difference = floor($days_difference / 7); // Complete weeks
$first_day = date("w", $datefrom);
$days_remainder = floor($days_difference % 7);
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?
if ($odd_days > 7) { // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;
case "ww": // Number of full weeks
$datediff = floor($difference / 604800);
break;
case "h": // Number of full hours
$datediff = floor($difference / 3600);
break;
case "n": // Number of full minutes
$datediff = floor($difference / 60);
break;
default: // Number of full seconds (default)
$datediff = $difference;
break;
}
return $datediff;
}
?>
Проверить полный код Нажмите здесь
Все номера недели между двумя датами в PHP
getNoOfWeek() вернет массив недели no. с годом. Вы можете изменить форматирование этого массива из week_text_alter().
function getNoOfWeek($startDate, $endDate){
// convert date in valid format
$startDate = date("Y-m-d", strtotime($startDate));
$endDate = date("Y-m-d", strtotime($endDate));
$yearEndDay = 31;
$weekArr = array();
$startYear = date("Y", strtotime($startDate));
$endYear = date("Y", strtotime($endDate));
if($startYear != $endYear) {
$newStartDate = $startDate;
for($i = $startYear; $i <= $endYear; $i++) {
if($endYear == $i) {
$newEndDate = $endDate;
} else {
$newEndDate = $i."-12-".$yearEndDay;
}
$startWeek = date("W", strtotime($newStartDate));
$endWeek = date("W", strtotime($newEndDate));
if($endWeek == 1){
$endWeek = date("W", strtotime($i."-12-".($yearEndDay-7)));
}
$tempWeekArr = range($startWeek, $endWeek);
array_walk($tempWeekArr, "week_text_alter",
array('pre' => 'Week ', 'post' => " '". substr($i, 2, 2) ));
$weekArr = array_merge($weekArr, $tempWeekArr);
$newStartDate = date("Y-m-d", strtotime($newEndDate . "+1 days"));
}
} else {
$startWeek = date("W", strtotime($startDate));
$endWeek = date("W", strtotime($endDate));
$endWeekMonth = date("m", strtotime($endDate));
if($endWeek == 1 && $endWeekMonth == 12){
$endWeek = date("W", strtotime($endYear."-12-".($yearEndDay-7)));
}
$weekArr = range($startWeek, $endWeek);
array_walk($weekArr, "week_text_alter",
array('pre' => 'Week ', 'post' => " '". substr($startYear, 2, 2)));
}
$weekArr = array_fill_keys($weekArr, 0);
return $weekArr;
}
function week_text_alter(&$item1, $key, $prefix)
{
$item1 = $prefix['pre']. $item1 . $prefix['post'];
}
Output 1 -
$weekArr = getNoOfWeek('2014-01-01', '2014-02-10');
Array
(
[Week 1 '14] => 0
[Week 2 '14] => 0
[Week 3 '14] => 0
[Week 4 '14] => 0
[Week 5 '14] => 0
[Week 6 '14] => 0
[Week 7 '14] => 0
)
Output 2 -
$weekArr = getNoOfWeek('2013-12-01', '2014-02-10');
Array
(
[Week 48 '13] => 0
[Week 49 '13] => 0
[Week 50 '13] => 0
[Week 51 '13] => 0
[Week 52 '13] => 0
[Week 1 '14] => 0
[Week 2 '14] => 0
[Week 3 '14] => 0
[Week 4 '14] => 0
[Week 5 '14] => 0
[Week 6 '14] => 0
[Week 7 '14] => 0
)
Надеюсь, это поможет вам.
Ниже приведено решение (исправленное решение для одного вопроса, заданного в сообщении - https://stackoverflow.com/info/27560850/php-number-of-week-between-2-dates-issue), чтобы узнать количество недель между диапазоном дат.
Поскольку в приведенном ниже решении используется разность дат, для включения начальной даты в неделю нужно использовать функцию пола, а для включения даты окончания дня необходимо использовать ceil, тогда только она возвращает правильное количество недель
$strtDate = '2014-01-01';
$endDate = '2015-03-17';
$startDateWeekCnt = round(floor( date('d',strtotime($strtDate)) / 7)) ;
// echo $startDateWeekCnt ."\n";
$endDateWeekCnt = round(ceil( date('d',strtotime($endDate)) / 7)) ;
//echo $endDateWeekCnt. "\n";
$datediff = strtotime(date('Y-m',strtotime($endDate))."-01") - strtotime(date('Y-m',strtotime($strtDate))."-01");
$totalnoOfWeek = round(floor($datediff/(60*60*24)) / 7) + $endDateWeekCnt - $startDateWeekCnt ;
echo $totalnoOfWeek ."\n";