Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.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_Date - Fatal编程技术网

Php 获取两个给定日期之间年份和月份列表的微妙方法

Php 获取两个给定日期之间年份和月份列表的微妙方法,php,date,Php,Date,我想得到两个给定日期之间的年和月的列表 这是我的密码 function yearMonth($start_date, $end_date) { $years = array(); $base = 0 ; while(($start_date) < $end_date) { $y = date('Y' , $start_date);

我想得到两个给定日期之间的年和月的列表

这是我的密码

    function yearMonth($start_date, $end_date)  
    {  

        $years = array();
        $base  = 0 ;
        while(($start_date) < $end_date)
        {

                $y           = date('Y' , $start_date);
                // if its the original start_time check the month from 
                //current date else get the first day and month in that year
                $base        = ($base == 0 )  ? $start_date : strtotime("{$y}-1-1"); 

                for($i = 1 ; $i <= 12 ; $i++ )
                {
                   if($base > $end_date)
                   break;
                   $years[date("Y", $start_date)][] = date("F" , $base); 
                   $base += 2629743.83;

                }

               $base += $start_date += 31556926 ;


        }
        return $years;

    }  

    $list  =  yearMonth(strtotime("2010-11-8") , strtotime("2012-11-11") );  
    var_dump($list);
在这里,我检查
start\u date
是否是我传递给函数的原始日期 如果是的话,我会设置一个基数,以确定该年的月份等于开始日期 如果不是原来的,我把基数定为那一年的第一个月

现在我们来解决我的问题

for($i = 1 ; $i <= 12 ; $i++ )

for($i=1;$i我有两种解决方案,要么修改现有代码,要么使用PHP内置的DateTime类

您希望修复代码中的两个问题:

  • 仅列出起始年份的剩余月份-您可以通过添加检查来完成此操作,检查您的
    $base
    日期是否在您输出的年份中
  • 在每个年份数组中获取正确的月份-我们可以通过将
    $base
    增加每月的正确天数来实现这一点。我们可以使用
    date('t')
    获取当月的天数
用于($i=1;$i$end\u日期)
打破
$base_year=日期('Y',$base);
如果($base_year==$y){
$years[日期($Y',$start_date)][]=日期($F',$base);
$base+=60*60*24*日期('t',标准时间('base_year.'-'.$i.'-1”);
}
}
或者,您可以通过使用DateTime对象简化代码。此示例基于对的注释中的一些代码

注意:函数的参数不需要使用
strotime
解析日期

function yearMonth($start_date, $end_date) 
{

    $begin = new DateTime( $start_date );
    $end = new DateTime( $end_date);
    $interval = new DateInterval('P1M'); // 1 month interval

    $period = new DatePeriod($begin, $interval, $end);

    foreach ( $period as $dt )
        $years[$dt->format( "Y" )][] = $dt->format( "F" );

    return $years;

}

$list  =  yearMonth("2010-11-8", "2012-11-11");  
var_dump($list);

我不明白这个问题。你能给我们一些输入和预期输出的样本吗?“但它不是很准确,因为闰年”或者,你知道,月份的长度是如何不同的。@Eric我如何计算给定日期年中的剩余月份?如果有更准确的方法,谢谢DateTime对象看起来非常整洁,我将使用这个方法。
            for($i = 1 ; $i <= 12 ; $i++ )
            {
                   if($base > $end_date)
                   break;
                   $years[date("Y", $start_date)][] = date("F" , $base); 
                   $base += 2629743.83;

            }
function yearMonth($start_date, $end_date) 
{

    $begin = new DateTime( $start_date );
    $end = new DateTime( $end_date);
    $interval = new DateInterval('P1M'); // 1 month interval

    $period = new DatePeriod($begin, $interval, $end);

    foreach ( $period as $dt )
        $years[$dt->format( "Y" )][] = $dt->format( "F" );

    return $years;

}

$list  =  yearMonth("2010-11-8", "2012-11-11");  
var_dump($list);