php 2个日期之间的php周
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3028491/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
php weeks between 2 dates
提问by ArK
hi how to find no of weeks and each mondays date between 2 dates. for ex 10-07-2009 to today .
嗨,如何在两个日期之间找到周数和每个星期一的日期。例如从 10-07-2009 到今天。
Note:consider leap year and other date related constrains also.
注意:还要考虑闰年和其他与日期相关的约束。
采纳答案by Tom Gullen
echo datediff('ww', '9 July 2003', '4 March 2004', false);
Find the function on the site below: http://www.addedbytes.com/code/php-datediff-function/
在以下网站上找到该功能:http: //www. addedbytes.com/code/php-datediff-function/
UPDATE
更新
Link is now broken (Sept 2017), so function below pulled from webarchive:
链接现已断开(2017 年 9 月),因此从 webarchive 中提取以下功能:
<?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;
}
回答by vascowhite
Here's an alternative solution using DateTime:-
这是使用 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
回答by silent
$diff = strtotime($dateto, 0) - strtotime($datefrom, 0);
echo floor($diff / 604800);
回答by Mat
The following function computes the "spoken weeks" between two timestamps (i.e. monday is next week if you are on saturday).
以下函数计算两个时间戳之间的“口语周”(即,如果您在星期六,则星期一是下周)。
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;
}
回答by Cyril Giacopino
This work great
这部作品很棒
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")
回答by Jay
I updated Tom's code from above to make the function auto-detect string or int date/time.
我从上面更新了 Tom 的代码,使函数自动检测字符串或 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;
}
?>
回答by Aditi Joshi
This will count a single day as one week and if you select sunday of one week and monday of another. though only 2 days are there but of different weeks therefore 2 weeks will be counted.
Also works for different years
function return_week($datee){
$duedt = explode("-", $datee);
$date = mktime(0, 0, 0, $duedt[1], $duedt[2], $duedt[0]);
$week = (int)date('W', $date);
return $week ;
}
function weeks_between($strtDate, $endDate){
// input dates of format yyyy-mm-dd between which you want to get number of weeks
$start_date = DateTime::createFromFormat("Y-m-d", $strtDate);
$end_date = DateTime::createFromFormat("Y-m-d", $endDate);
$start_year = $start_date->format("Y");
$end_year = $end_date->format("Y");
$start_month = $start_date->format("m");
$end_month = $end_date->format("m");
$week1 = return_week($strtDate);
$week2 = return_week($endDate);
$diff = $end_year - $start_year;;
if($end_month<$start_month && $start_year!=$end_year ){
$week_diff = (52*$diff-$week1)+$week2+1;
return ($start_year==$end_year)?$week_diff:abs($week_diff);
}else{
$week_diff = $week2-$week1+1;
return ($start_year==$end_year)?$week_diff:abs($week_diff)+52*$diff;
}
}
//call to function
weeks_between(""2018-10-21,"2019-10-21");
回答by Rajendra Rajput
$formt_start_date = new DateTime($start_date);
$formt_end_date = new DateTime($end_date);
for ($i = $formt_start_date; $i < $formt_end_date; $i->modify('+7 day')) {
$week_frequency[] = new DateTime($i->format("Y-m-d"));
}
回答by Gaurav Porwal
All the week numbers between two dates in PHP
PHP中两个日期之间的所有周数
getNoOfWeek() will return array of week no. with year. You can change formatting of this array from week_text_alter().
getNoOfWeek() 将返回周数数组。与年。您可以从 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
)
Hope this will help you.
希望这会帮助你。
回答by Rakesh Lamp Stack
PHP number of week between 2 dates issue
两个日期之间的 PHP 周数问题
Below is the solution (corrected solution for one question asked in the post - https://stackoverflow.com/questions/27560850/php-number-of-week-between-2-dates-issue) to find out the no of weeks between the date range.
以下是解决方案(针对帖子中提出的一个问题的更正解决方案 - https://stackoverflow.com/questions/27560850/php-number-of-week-between-2-dates-issue)找出周数日期范围之间。
As the below solution uses the date difference , for inclusion of the start date week one will have to use the floor function and for the inclusion of the end date week ceil has to be used then only it returns the correct number of weeks
由于下面的解决方案使用日期差异,为了包含开始日期周一将必须使用 floor 函数,并且必须使用结束日期周 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";

