我将日期存储在数组中,以便完成以下项目的完成状态
前两个字母是月份,其他四个字母是年份
052012(mmyyyy)
$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';
}
我在明年和其他两个人中搞砸了。
有人可以帮我解决这个问题吗?
答案 0 :(得分: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';
}
答案 1 :(得分: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个月之间每个月的天数(如果这是有道理的)。这就是为什么我将一年除以2得到6个月,而不是使用strtotime()
。