2017-11-14 30 views
0

私はlaravelを使用してプロジェクトを構築しました。選択した日付範囲にある四半期をすべてカウントする関数を作成する必要があります。 10 09四半期 - - 03第一四半期 04 - - 06第二四半期 07ここ2つの日付間の(年)四半期を計算する

は四半期(iはヶ月の数値表現を使用)

01である等12四半期

I希望本当にあなたの助けに感謝しています。なぜなら、私は今一日それを見ていて、基本的に何も見せていないからです。私はとても頑張っています。私は本当に疲れています。まっすぐ考えることはできません。

私はいくつかのコードを持っていますが、役に立たないのは無駄です。何らかのアイデアやコードスニペットを歓迎します。

ご協力いただきありがとうございます。

+0

を必要な数ヶ月を取得することは、あなたは私たちに何をしたいのいくつかの例を提供することはできますか?テキストだけで、コードはありません。コードを表示することもできます。私たちはあなたのロジックに何が間違っているのかを確認するのを手伝ってくれます – iArcadia

答えて

0

私はこれを複数の機能を使用して管理しました。基本的にこれがチャートの統計に必要な場合は、より具体的なアプローチが考えられます。 私は(TISコードは、それが動作し、既にテストされて:)また、学期を取得するために適合させることができる)を入力として、タイムスタンプの日付とLaravelでこれを行っている:

public static function getYearsBetween($start_ts, $end_ts, $full_period = false) 
{ 
    $return_data = []; 
    $current = mktime(0, 0, 0, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts)); 

    while ($current < $end_ts) { 
     $temp_date = $current; 
     $year = new Date($temp_date); 
     $return_data[] = $year; 
     $current = strtotime("+1 year", $current); // add a year 
    } 

    if ($full_period) { 
     $return_data[] = $end_ts; 
    } 

    return $return_data; 
} 

public static function getQuartersBetween($start_ts, $end_ts) 
{ 
    $quarters = []; 
    $months_per_year = []; 
    $years = self::getYearsBetween($start_ts, $end_ts); 
    $months = self::getMonthsBetween($start_ts, $end_ts); 

    foreach ($years as $year) { 
     foreach ($months as $month) { 
      if ($year->format('Y') == $month->format('Y')) { 
       $months_per_year[$year->format('Y')][] = $month; 
      } 
     } 
    } 

    foreach ($months_per_year as $year => $months) { 
     $january = new Date('01-01-' . $year); 
     $march = new Date('01-03-' . $year); 
     $april = new Date('01-04-' . $year); 
     $june = new Date('01-06-' . $year); 
     $july = new Date('01-07-' . $year); 
     $september = new Date('01-09-' . $year); 
     $october = new Date('01-10-' . $year); 
     $december = new Date('01-12-' . $year); 

     if (in_array($january, $months) && in_array($march, $months)) { 
      $quarter_per_year['label'] = 'T1/' . $year; 
      $quarter_per_year['start_day'] = $january->startOfMonth(); 
      $quarter_per_year['end_day'] = $march->endOfMonth()->endOfDay(); 
      array_push($quarters, $quarter_per_year); 
     } 

     if (in_array($april, $months) && in_array($june, $months)) { 
      $quarter_per_year['label'] = 'T2/' . $year; 
      $quarter_per_year['start_day'] = $april->startOfMonth(); 
      $quarter_per_year['end_day'] = $june->endOfMonth()->endOfDay(); 
      array_push($quarters, $quarter_per_year); 
     } 

     if (in_array($july, $months) && in_array($september, $months)) { 
      $quarter_per_year['label'] = 'T3/' . $year; 
      $quarter_per_year['start_day'] = $july->startOfMonth(); 
      $quarter_per_year['end_day'] = $september->endOfMonth()->endOfDay(); 
      array_push($quarters, $quarter_per_year); 
     } 

     if (in_array($october, $months) && in_array($december, $months)) { 
      $quarter_per_year['label'] = 'T4/' . $year; 
      $quarter_per_year['start_day'] = $october->startOfMonth(); 
      $quarter_per_year['end_day'] = $december->endOfMonth()->endOfDay(); 
      array_push($quarters, $quarter_per_year); 
     } 
    } 

    return $quarters; 
} 

との間の年を取得

、また

public static function getMonthsBetween($start_ts, $end_ts, $full_period = false) 
{ 
    $return_data = $month_list = []; 
    $current = mktime(0, 0, 0, date('m', $start_ts), date('d', $start_ts), date('Y', $start_ts)); 

    while ($current <= $end_ts) { 
     $temp_date = $current; 
     $date = new Date($temp_date); 
     $month_list[] = $date; 

     $current = strtotime("+1 month", $current); // add a month 
    } 

    $start_date_last_month = new Date(array_first($month_list)); 
    $start_date_last_month = $start_date_last_month->startOfMonth()->format('m-d'); 
    $temp_end_date = new Date($start_ts); 
    $temp_end_date = $temp_end_date->format('m-d'); 

    if ($start_date_last_month < $temp_end_date) { 
     array_shift($month_list); 
    } 

    $end_date_last_month = new Date(end($month_list)); 
    $current_day_month = $end_date_last_month->endOfMonth()->format('m-d'); 
    $temp_end_date = new Date($end_ts); 
    $end_day_of_month = $temp_end_date->format('m-d'); 

    if ($end_day_of_month < $current_day_month) { 
     array_pop($month_list); 
    } 

    if (count($month_list) == 0) { 
     $month_list[] = $end_date_last_month->subMonth(); 
    } 

    $return_data = $month_list; 
    if ($full_period) { 
     $return_data[] = $end_ts; 
    } 

    return $return_data; 
} 
0

あなたは、この例のように何かを行うことができます:

$February = 2; 
$October = 10; 

$completedQuarters = ceil($October/3) - ceil($February/3); // = 3 

どう日付範囲が開始した四半期について、それも数える必要がありますか?それは四半期の最初の月に始まる場合にのみカウントする必要がある場合は、このようにそれを確認することができます。

$completedQuarters = ceil($October/3) - ceil($February/3) -1; // = 2 
if($February-1%3 == 0) $completedQuarters += 1; 

You'reの説明は非常に明確ではありません、that'sあなたが持っていたものなら、私に知らせてマインド。

0

わからない以下の場合は、あなたが意味しているが、機能的に、このような

$date_start='2015/03/12'; 
$date_end='2017/11/14'; 

$timezone=new DateTimeZone('Europe/London'); 
$start=new DateTime($date_start, $timezone); 
$end=new DateTime($date_end, $timezone); 


$difference = $end->diff($start); 
$months = (($difference->format('%y') * 12) + $difference->format('%m')); 
$quarters = intval($months/3); 

printf('Quarters between %s and %s is %d covering %d months', $start->format('l, jS F Y'), $end->format('l, jS F Y'), $quarters, $months); 

/* 
    This will output 
    ---------------- 

    Quarters between Thursday, 12th March 2015 and Tuesday, 14th November 2017 is 10 covering 32 months 
*/ 
+0

私は '$ quarters = intval($ months/3);'が間違っていると思います。あなたの例の日付は12分の3です。 –

0

何か役に立つかもしれない、あなたが設定されるべきものです。

use Carbon\Carbon; 

$first = Carbon::parse('2012-1-1'); //first param 
$second = Carbon::parse('2014-9-15'); //second param 

$fY = $first->year; //2012 
$fQ = $first->quarter; //1 

$sY = $second->year; //2014 
$sQ = $second->quarter; //3 

$n = 0; //the number of quarters we have counted 
$i = 0; //an iterator we will use to determine if we are in the first year 

for ($y=$fY; $y < $sY; $y++, $i++) { //for each year less than the second year (if any) 
    $s = ($i > 0) ? 1 : $fQ; //determine the starting quarter 
    for ($q=$s; $q <= 4; $q++) { //for each quarter 
     $n++; //count it 
    } 
} 

if ($sY > $fY) { //if both dates are not in the same year 
    $n = $n + $sQ; //total is the number of quarters we've counted plus the second quarter value 
} else { 
    for ($q=$fQ; $q <= $sQ; $q++) { //for each quarter between the first quarter and second 
     $n++; //count it 
    } 
} 

print $n; //the value to return (11) 
関連する問題