2012-08-14 23 views
0

我想两个给定日期细腻的方式来获得的年两个给定日期

这里间的年度清单和月份之间的名单和月份是我的代码

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); 

所以这里是问题

$base  = ($base == 0) ? $start_date : strtotime("{$y}-1-1"); 
在这里

我检查start_date是我传递给函数 如果是我设置的基地在这一年Ë找到个月的原QUAL到START_DATE ,如果它不是我所设置的基本等于一年的第一个月

现在我们得到了我的问题原来

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

在这里我假定有12个月在这一年但如果它是最初的start_date,它可能会更少

我如何计算给定日期年的剩余月份?

另一个问题是在这里

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

      } 

所以我想每个月都有2629743.83秒但它不是很准确becuz闰年

的是有没有清洁的方式做到这一点?

+0

我不明白这个问题。你能给我们一些样本输入和预期输出吗? – Eric 2012-08-14 01:53:07

+1

“_但它并不是非常准确的闰年_”或者,你知道,月份的长度是不同的。 – Eric 2012-08-14 01:54:34

+0

@Eric我如何计算给定日期年的剩余月份?并且如果有更准确的方法来做到这一点 – max 2012-08-14 02:16:22

回答

2

我有两个解决方案,要么改变你现有的代码,要么使用PHP的内置DateTime类。

你要修复代码中的两件事情:

  • 只上市的起始年剩下的几个月 - 您可以通过添加一个检查你的$base日期是在你输出年内做到这一点。
  • 在每个年份数组中获取正确的月份 - 我们可以通过将$base增加每个月的正确天数来完成此操作。我们可以使用date('t')获得当月的天数。
for($i = 1 ; $i <= 12 ; $i++) 
{ 
    if($base > $end_date) 
    break; 
    $base_year = date('Y', $base); 
    if ($base_year == $y) { 
    $years[date("Y", $start_date)][] = date("F" , $base); 
    $base += 60*60*24*date('t', strtotime($base_year.'-'.$i."-1")); 
    } 
} 

或者,您也可以使用datetime对象简化代码。这个例子是基于对DatePeriod的评论中的一些代码。

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

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); 
+0

谢谢DateTime对象似乎真的很整洁我会用这个。 – max 2012-08-14 14:03:20

相关问题