Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中获取每个月的两个日期全天_Php_Arrays_Date_Days_Monthcalendar - Fatal编程技术网

在PHP中获取每个月的两个日期全天

在PHP中获取每个月的两个日期全天,php,arrays,date,days,monthcalendar,Php,Arrays,Date,Days,Monthcalendar,我如何在这样的数组中获得每个月两天之间的所有天数 $dateStart = "2016/12/14"; $dateFin = "2017/04/21" [2016/12/14 - 2016/12/31] => 17 days [2017/01/01 - 2017/01/31] => 31 days [2017/02/01 - 2017/02/28] => 28 days [2017/03/01 - 2017/03/30] => 31 days [2017/04/0

我如何在这样的数组中获得每个月两天之间的所有天数

$dateStart = "2016/12/14"; 
$dateFin =   "2017/04/21"

[2016/12/14 - 2016/12/31] => 17 days
[2017/01/01 - 2017/01/31] => 31 days
[2017/02/01 - 2017/02/28] => 28 days
[2017/03/01 - 2017/03/30] => 31 days
[2017/04/01 - 2017/04/21] => 21 days

要获取两个日期的日期差(以天为单位),可以执行以下操作:

function daysDiff($d1, $d2) 
{
    $x1 = days($d1);
    $x2 = days($d2);

    if ($x1 && $x2) {
        return abs($x1 - $x2);
    }
}

function days(DateTime $x) 
{
    $y = $x->format('Y') - 1;
    $days = $y * 365;
    $z = (int)($y / 4);
    $days += $z;
    $z = (int)($y / 100);
    $days -= $z;
    $z = (int)($y / 400);
    $days += $z;
    $days += $x->format('z');

    return $days;
}
$d1和$d2应该是DateTime类型,我从这里复制了这段代码:并做了一个小的修改,使用类型暗示,而不是使用get_类验证变量类型

查看演示

您可以使用function plus DateTime类:

<?php
$dateStart = new DateTime("2016/12/14");
$dateFin = new DateTime("2017/04/21");
$firstDay = $dateStart->format('Y/m/d');
$lastDay = $dateStart->format('Y/m/t');
$totalMonths = $dateStart->diff($dateFin)->m + ($dateStart->diff($dateFin)->y*12);
$result = [];
for ($i = 0; $i <= $totalMonths; $i++)
{
    if ($i != 0){
        $dateStart->modify('first day of next month');
        $firstDay = $dateStart->format('Y/m/d');
        $dateStart->modify('last day of month');
        $lastDay = $dateStart->format('Y/m/t');
    }

    $nextDate = explode('/', $firstDay);

    $totalDays = cal_days_in_month(CAL_GREGORIAN, $nextDate[1], $nextDate[2]);
    if ($i == 0){
        $totalDays -= $dateStart->format('d');
    } else if ($i == $totalMonths) {
        $totalDays = $dateFin->format('d');
    }

    $result["$firstDay - $lastDay"] = $totalDays;
}

var_dump($result);

请根据上述描述尝试执行以下代码片段作为解决方案

$start_date = new DateTime('2016/12/14');
$start_date=$start_date->modify('+1 day');
$end_date = new DateTime('2017/04/21');
$end_date = $end_date->modify('+1 day');

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($start_date, $interval ,$end_date);
$month_days=array();
foreach($daterange as $date)
{
  $date_month=$date->format('m');
  $month_days[$date_month][]=$date->format('Y/m/d');
}
$result=array();
foreach($month_days as $days)
{
  $begin=reset($days);
  $end=end($days);
  $result[$begin.'-'.$end]=count($days);
}
echo '<pre>';
print_r($result);
$start_date=新日期时间('2016/12/14');
$start_date=$start_date->修改(“+1天”);
$end_date=新日期时间('2017/04/21');
$end_date=$end_date->modify(“+1天”);
$interval=新的日期间隔('P1D');
$daterange=新的日期周期($start\u date,$interval,$end\u date);
$month_days=array();
foreach($daterange作为$date)
{
$date\u month=$date->format('m');
$month\u days[$date\u month][]=$date->format('Y/m/d');
}
$result=array();
foreach($month\u days作为$days)
{
$begin=重置(天);
$end=结束($days);
$result[$begin.'-'.$end]=计数($days);
}
回声';
打印(结果);

我会改进,等一会儿:)请检查我的改进,我想我必须再增加一次循环,所以我必须在总共几个月内应用+1才能得到准确的结果。
$dateStart = new DateTime("2016/12/14");
$dateFin = new DateTime("2017/04/21");
$totalMonths = $dateStart->diff($dateFin)->m + ($dateStart->diff($dateFin)->y*12);
$result = [];
for ($i = 0; $i <= $totalMonths; $i++)
{
    if ($i != 0){
        $obj = $dateStart->modify('first day of next month');
    }

    $firstDay = $dateStart->format('Y/m/d');
    if ($i == $totalMonths){
        $lastDay = $dateFin->format('Y/m/d');
    } else {
        $lastDay = $dateStart->format('Y/m/t');
    }
    $firstDayObj = strtotime($firstDay);
    $lastDayObj = strtotime($lastDay);
    $totalDays = (int) ceil(($lastDayObj - $firstDayObj) / 86400);
    $totalDays = ((int) $dateStart->format('d') == 1) ? $totalDays + 1 : $totalDays;
    $result["$firstDay - $lastDay"] = $totalDays;
}

var_dump($result);

//array(5) { ["2016/12/14 - 2016/12/31"]=> int(17) ["2017/01/01 - 2017/01/31"]=> int(31) ["2017/02/01 - 2017/02/28"]=> int(28) ["2017/03/01 - 2017/03/31"]=> int(31) ["2017/04/01 - 2017/04/21"]=> int(21) }
$start_date = new DateTime('2016/12/14');
$start_date=$start_date->modify('+1 day');
$end_date = new DateTime('2017/04/21');
$end_date = $end_date->modify('+1 day');

$interval = new DateInterval('P1D');
$daterange = new DatePeriod($start_date, $interval ,$end_date);
$month_days=array();
foreach($daterange as $date)
{
  $date_month=$date->format('m');
  $month_days[$date_month][]=$date->format('Y/m/d');
}
$result=array();
foreach($month_days as $days)
{
  $begin=reset($days);
  $end=end($days);
  $result[$begin.'-'.$end]=count($days);
}
echo '<pre>';
print_r($result);