2017-04-12 151 views
0

我有一個日期範圍,我需要它按月分組,但我想繼續開始日期和結束日期。到目前爲止,我有這樣的:PHP - 按月份的日期範圍

$interval['from'] = '2017-01-02 00:00:00'; 
    $interval['to'] = '2017-02-06 23:59:59'; 

    $start = Carbon::createFromFormat('Y-m-d H:i:s', $interval['from'])->startOfMonth(); 
    $end = Carbon::createFromFormat('Y-m-d H:i:s', $interval['to'])->startOfMonth()->addMonth(); 
    $separate = CarbonInterval::month(); 
    $period = new \DatePeriod($start, $separate, $end); 

    foreach ($period as $dt) { 
     dump($dt); 
    } 

但作爲結果我越來越:

Carbon\Carbon(3) { 
    date => "2017-01-01 00:00:00.000000" (26) 
    timezone_type => 3 
    timezone => "Europe/Prague" (13) 
} 
Carbon\Carbon(3) { 
    date => "2017-02-01 00:00:00.000000" (26) 
    timezone_type => 3 
    timezone => "Europe/Prague" (13) 
} 

它是由一個月分組,但我需要整整一個月時間裏,我從

2017-01-02 00:00:00意思到2017-01-31 23:59:59

2017-02-01 00:00:002017-02-06 23:59:59

輸出:

$array = [ 
    0 => [ 
     'from' => '2017-01-02 00:00:00', 
     'to' => '2017-01-31 23:59:59' 
    ], 
    1 => [ 
     'from' => '2017-02-01 00:00:00', 
     'to' => '2017-02-06 23:59:59' 
    ] 
]; 

什麼是才達到它的最簡單的方法?

編輯:這是公認的答案有一點點修飾碳版本,也許有人會需要它:

$interval['from'] = '2017-01-02 00:00:00'; 
$interval['to'] = '2017-04-08 23:59:59'; 

$interval_from = Carbon::createFromFormat('Y-m-d H:i:s', $interval['from']); 
$interval_to = Carbon::createFromFormat('Y-m-d H:i:s', $interval['to']); 

$result = []; 
foreach (range($interval_from->month, $interval_to->month) as $x) { 
    $to = $interval_from->copy()->endOfMonth(); 

    if ($x == $interval_to->month) { 
     $result[] = ["from" => $interval_from, "to" => $interval_to]; 
    } else { 
     $result[] = ["from" => $interval_from, "to" => $to]; 
    } 
    $interval_from = $to->copy()->addSecond(); 

} 
+0

有問題:做完' - > addMonth()'爲什麼你得到的結果不是'2017-03-01'?不知道'碳',但是這不是一個錯誤嗎? – JustOnUnderMillions

+0

我沒有注意到它,但如果我轉儲$期變量,然後我看到結束日期爲'2017-03-01',所以我認爲'CarbonInterval'有一定的魔力。無論如何,當解決方案將在DateTime/DateInterval/DatePeriod類中時不會出現問題。 –

回答

1

PHP code demo

嘗試這種解決方案可以從一個月改變另一個月(不是一年),然後檢查。冗長的解決方案,但希望工作正常,把解釋。

<?php 

ini_set('display_errors', 1); 

$from=$interval['from'] = '2017-01-02 00:00:00'; 
$interval['to'] = '2017-03-07 23:59:59'; 


$month1=date("m", strtotime($interval['from'])); 
$month2=date("m", strtotime($interval['to'])); 

$result=array(); 


foreach(range($month1, $month2) as $x) 
{ 
    $dateTimeObj= new DateTime($from); 
    $dayDifference=($dateTimeObj->format('d')-1); 

    $dateTimeObj= new DateTime($from); 
    $dateTimeObj->add(new DateInterval("P1M")); 
    $dateTimeObj->sub(new DateInterval("P".$dayDifference."DT1S")); 
    $to= $dateTimeObj->format("Y-m-d H:i:s"); 

    if($x==$month2) 
    { 
     $dateTimeObj= new DateTime($interval['to']); 
     $noOfDays=$dateTimeObj->format("d"); 
     $dateTimeObj->sub(new DateInterval("P".($noOfDays-1)."D")); 
     $from=$dateTimeObj->format("Y-m-d H:i:s"); 
     $result[]=array("from"=>$from,"to"=>$interval['to']); 
    } 
    else 
    { 
     $result[]=array("from"=>$from,"to"=>$to); 
    } 
    //adding 1 second to $to for next time to be treated as $from 
    $dateTimeObj= new DateTime($to); 
    $dateTimeObj->add(new DateInterval("PT1S")); 
    $from= $dateTimeObj->format("Y-m-d H:i:s"); 
} 
print_r($result); 
+0

謝謝,它的工作原理。但不是一些現代的方式來做到這一點(PHP 5.6 +)? –

+0

@JaroslavKlimčík是的,你是正確的,好吧沒有問題,我也爲此添加了另一個解決方案。 –

+0

@JaroslavKlimčík我遵循相同的方法,但在這裏我使用'DateTime'' DateInterval' inbuild類的'PHP'。 –

相關問題