1

以下のようなプロジェクトの完了ステータスのために日付を配列に保存しています

最初の 2 文字は月、残りの 4 文字は年です。

052012(ミーイイ)

$arrDates = array('052012', '042013', '082013', '122013', '022014');

この配列が欲しい 以下のように文言に変換するには

$arrDates = array('Completed', 'Next Six Months', 'Next Year', 'Next Year', 'After 2 Years');

以下のように完了したことを確認するために、以下のような for ループを使用しました

for($i=0;$i<count($arrDates);$i++)
{
  if((date('m') > substr($arrDates[$i], 0,2)) && (date('y') == substr($arrDates[$i], 2,6)))           
  $strStatus = ' Completed';
}

そして、来年と他の2つを見つけるのを台無しにしました。

誰かがこれを修正するのを手伝ってくれますか?

4

2 に答える 2

1

私はあなたが使用できると思いますDateTimeそしてdateIntervalこれのために:

$currentDate = DateTime::createFromFormat('mY',$arrDates[0]);
$interval = $currentDate->diff(new DateTime('now'),true);
if($interval->invert){
   echo 'Completed';
else if($interval->y >= 2 ){
   echo 'After 2 Years';
}
else if($interval->y == 1){
   echo 'Next Year';
}
else if($interval->m > 6){
   echo 'what you want here';
}
else {
   echo 'Next six months';
}
于 2012-11-28T06:52:08.657 に答える
0

artragis は彼の答え (+1) で正しい軌道に乗っていたと思いますが、再利用のためにすべてを関数にカプセル化する必要があります。

/**
 * @param string $expectedDate
 * @return string Text summary of time to completion
 */
function completionTimeInWords($expectedDate)
{
    $now = new DateTime();
    $date = new DateTime();
    $date->setTimestamp(strtotime('+1 year'));
    $oneYear = $date->diff($now)->days;
    $sixMonths = round($oneYear/2);
    $date->setTimestamp(strtotime('+2 years'));
    $twoYears = $date->diff($now)->days;

    $date = DateTime::createFromFormat('mY', $expectedDate);
    $interval = $now->diff($date);
    $completed = (bool)$interval->invert;
    $days = $interval->days;
    if($completed){
        return 'Completed';
    } elseif($days <= $sixMonths){
        return 'Next Six Months';
    } elseif($days > $sixMonths && $days <= $oneYear){
        return 'Within a year';
    } elseif($days > $oneYear && $days <= $twoYears){
        return 'Next Year';
    } elseif($days > $twoYears){
        return 'After Two Years';
    }
}

私は次のコードでこれをテストしました:-

$date = new DateTime();
$date->setTimestamp(strtotime('two weeks ago'));
$arrDates[] = $date->format('mY');
$date->setTimestamp(strtotime('+ 5 months 27 days'));
$arrDates[] = $date->format('mY');
$date->setTimestamp(strtotime('+ 6 months 4 days'));
$arrDates[] = $date->format('mY');
$date->setTimestamp(strtotime('+ 12 months 4 days'));
$arrDates[] = $date->format('mY');
$date->setTimestamp(strtotime('+ 24 months 4 days'));
$arrDates[] = $date->format('mY');
foreach($arrDates as $date){
    var_dump(completionTimeInWords($date));
}

そして、次の出力を得ました:-

string(9) "Completed"
string(15) "Next Six Months"
string(13) "Within a year"
string(9) "Next Year"
string(15) "After Two Years"

これらは問題になる可能性があるため、エッジケースでさらにテストを行う必要がある場合があります。たとえば、私たちのほとんどは 6 か月が 183 日であることに同意しますが、PHP は、現在から 6 か月後までの各月の日数によっては、同意しない場合があります (それが理にかなっている場合)。strtotime(). _

于 2012-11-28T22:46:57.097 に答える