Datetime 转换成单词的月份

Datetime 转换成单词的月份,datetime,php,Datetime,Php,我在数组中存储了项目完成状态的日期,如下所示 前两个字母是月,其他四个字母是年 2012年5月5日(年月日) 我希望将此数组转换为如下所示的文字 $arrDates = array('Completed', 'Next Six Months', 'Next Year', 'Next Year', 'After 2 Years'); 我使用下面这样的for循环来检查是否已完成,如下所示 for($i=0;$i<count($arrDates);$i++) { if((date('m')

我在数组中存储了项目完成状态的日期,如下所示

前两个字母是月,其他四个字母是年

2012年5月5日(年月日)

我希望将此数组转换为如下所示的文字

$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';
}
for($i=0;$i substr($i,0,2))&&(date('y')==substr($i,2,6)))
$strStatus=‘已完成’;
}
我搞砸了明年和其他两年的工作


有人能帮我解决这个问题吗?

我想你可以用
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';
}

我想您可以使用
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';
}

我认为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';
    }
}
并得到以下输出:-

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个月,而不是使用
strotime()

我认为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';
    }
}
并得到以下输出:-

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个月,而不是使用
strotime()

请澄清可用的一组词语(这4种情况都可以吗?最后一种情况是否通用?即“x年后”)。它们的应用规则是什么?例如,如果日期同时在“下6个月”和“下一年”下,会发生什么情况?(假设“下一年”是指“下一个日历年”,而不是“从现在起的未来12个月”)。如果它不属于任何情况(例如,现在是2012年2月12日,日期是122012?这是同一个日历年,但未来>6个月)。只有4个情况不超过这一点。如果日期属于下一个6个月,则应视为下一个6个月。现在是2012年2月12日,日期是122012?-它应该显示为已完成的“现在是2012年2月12日,日期是2012年12月12日?”-不,它还没有完成,它是在未来-事实上,在未来10个月(即>6个月,但仍然是同一年)请澄清可用的一套措辞(这4种情况都可以吗?最后一种情况是否通用-即“x年后”)。它们的应用规则是什么?例如,如果日期同时在“下6个月”和“下一年”下,会发生什么情况?(假设“下一年”是指“下一个日历年”,而不是“从现在起的未来12个月”)。如果它不属于任何情况(例如,现在是2012年2月12日,日期是122012?这是同一个日历年,但未来>6个月)。只有4个情况不超过这一点。如果日期属于下一个6个月,则应视为下一个6个月。现在是2012年2月12日,日期是122012?-它应该显示为已完成“现在是2012年2月12日,日期是2012年12月12日?”-不,它没有完成,它在未来-事实上,未来10个月(即>6个月,但仍然是同一年)@artragis您的解决方案似乎不错。但是1)
elseif
是PHP中的一个单词;2) 我不明白为什么你有这么复杂的“两年后”的案例——一个简单的
$interval->y>=2
就足够了,因为现在你在错误处理y=2和m=0的案例——在这种情况下,你会返回“未来六个月”;3) 在php elseif和else if中,您缺少了很多结尾的花括号(更好的代码样式将有助于更容易地发现这一点)。我将编辑关于花括号的2年idem“它不起作用”是什么意思?现在我已经编辑了我的答案,它有效吗?@artragis你的解决方案似乎不错。但是1)
elseif
是PHP中的一个单词;2) 我不明白为什么你有这么复杂的“两年后”的案例——一个简单的
$interval->y>=2
就足够了,因为现在你在错误处理y=2和m=0的案例——在这种情况下,你会返回“未来六个月”;3) 在php elseif和else if中,您缺少了很多结尾的花括号(更好的代码样式将有助于更容易地发现这一点)。我将编辑关于花括号的2年idem“它不起作用”是什么意思?现在,我已经编辑了我的答案,它是否有效?我没有使用函数,因为我不知道他是否正在使用POO,如果这个名字没有保留在他的应用程序中。。。我提供了Functional代码,他必须以最干净的方式在他的应用程序中插入它。关于php行为和相对日期。(请不要使用strotime,DateTime理解相对格式…)。你错了一个月不是30天,而是28-29-30或31天。PHP有很好的表现。@artragis我不是说一个月就是30天。POO?POO=OOP在法语中,这只是一个打字错误。。。6个月=183天表示3个月31天+3个月30天。这是完全错误的。我没有使用函数,因为我不知道他是否在使用POO,他的应用程序中是否保留了这个名字。。。我提供了Functional代码,他必须以最干净的方式在他的应用程序中插入它。关于php行为和相对日期。(请不要使用strotime,DateTime理解相对格式…)。你错了一个月不是30天,而是28-29-30或31天。PHP有很好的表现。@artragis我不是说一个月就是30天。POO?POO=法语中是j