[PHP]:具有日期差异的逻辑

时间:2009-12-28 23:45:13

标签: php date logic

我正在寻找一种优雅的解决方案,可以根据现在的时间长度和数据库中的ISO格式化日期来更改时间格式。

我希望输出看起来像这样

//less than an hour
'X minutes have gone by'
//less than 24 hours
'X hours have gone by'
//greater than 24 hours
ISO date

这是我到目前为止所拥有的......

$now = date("o-m-d H:i:s")  //now = something like '2009-12-28 16:39:00'

$dateExample = '2009-12 16:37:00'

$timeSpan = round(strtotime($now) - strtotime($dateExample));

if(($timeSpan/60)<=60)
{
  echo $timeSpan." minutes";
}
if(($timeSpan/(60*60))<=24)
{
  echo ($timeSpan/(60*60))." Hours";
}
else
{
  echo $dateExample;
}

草率的if语句真的困扰着我,我似乎无法找到更好的方法来做到这一点....

5 个答案:

答案 0 :(得分:1)

稍作改进:

$dateExample = '2009-12 16:37:00'

function timepass($dt){
  $dt = (is_int($dt) ? $dt : strtotime($dt));
  $timeSpan = round(time() - $dt);

  if(($timeSpan/60)<=60){
    return $timeSpan." minutes";
  }elseif(($timeSpan/(60*60))<=24){
    return ($timeSpan/(60*60))." hours";
  }else{
    return date('o-m-d H:i:s',$dt);
  }
}

echo timepass($dateExample);

答案 1 :(得分:0)

你真的无法摆脱if语句,但如果你的意思是压缩代码,那就是同样的事情:

function timePassed($date) {
     $diff = time() - strtotime($date);
     return $diff > 86400 ? $date : ($diff > 3600 ? ($diff / 3600).' hours' : ($diff / 60).' minutes');
}

echo timePassed('2009-12-29 16:30:00');

不确定这是否有利于提高可读性。

答案 2 :(得分:0)

如果您关心布局,可以简单地将if改为开关。

例如:

$now = date("o-m-d H:i:s")  //now = something like '2009-12-28 16:39:00'
$dateExample = '2009-12 16:37:00'
$timeSpan = round(strtotime($now) - strtotime($dateExample));

switch(true) {
    case (($timeSpan/60)<=60): { echo $timeSpan." minutes"; break; }
    case (($timeSpan/(60*60))<=24): { echo ($timeSpan/(60*60))." Hours"; break; }
    default: { echo $dateExample; }
}

那就是说,这只是语法糖。

答案 3 :(得分:0)

如果你担心读者清楚你的图书馆日期转换功能的代码,那么你可能想要考虑这种方式(重写由theppdeveloper发布的功能):

function timepass($dt){
    $timeSpan = round(time() - (is_int($dt) ? $dt : strtotime($dt)));
    $hours = intval($timeSpan / SECONDS_PER_HOUR); // define this somewhere
    $minutes = intval($timeSpan / SECONDS_PER_MINUTE); // define this somewhere

    if($hours == 0) {
        return $minutes.' minutes';
    }
    else if($hours < 24) {
        return $hours.' hours';
    }
    else {
        return ''; // your ISO date logic here
    }
}

我不知道如何摆脱if,但我个人觉得这段代码非常清楚选择返回格式的逻辑是什么,以及每种情况下返回的值是什么。

答案 4 :(得分:0)

以下是我最终如何做到这一点。

$now = date("o-m-d H:i:s");

$timeSpan = round(strtotime($now) - strtotime($lastCheckIn));

$minuteCheck = round($timeSpan/60);
$hourCheck   = round($timeSpan/(60*60));

if($minuteCheck<=60)
{
  echo $minuteCheck." minutes";
}
else if($hourCheck<=24)
{
    echo $hourCheck." hours";
}
else
{
    echo $lastCheckIn;
}

整个分钟/小时检查确实让IMO更加清晰