2009-12-28 109 views
1

我正在寻找一个很好的解决方案来改变的时间基础上,现在时间之间的长度的格式,和在DB中一个ISO格式化日期。[PHP]:逻辑与日期差异

我想输出到这个样子

//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语句真正困扰我,我可以似乎找不出一个更好的方式来做到这一点....

+1

那怎么我会太成功了!把它变成一个函数怎么样?并用时间戳调用它。 – mauris 2009-12-28 23:47:52

+1

注意,它会响应分钟以及上课时间,如果它是不到一个小时,因为你没有使用'elseif' – Etan 2009-12-28 23:51:12

回答

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

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); 
+0

downvoters至少应该解释为什么。 – mauris 2009-12-29 01:46:43

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'); 

不知道这是很好的可读性,虽然。

+1

请记住代码是供人阅读的。这样做可能会使代码容易出错。 – mauris 2009-12-29 01:57:43

0

你可以简单的,如果的洗牌到交换机上,如果你关心的布局。

例如:

$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; } 
} 

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

0

如果你是关心的代码是明确到库日期转换功能的读者,那么你可能要考虑这种方式(重写发表thephpdeveloper功能):

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,但是我个人觉得这个代码非常清楚选择返回格式的逻辑是什么,以及每种情况下返回的值是什么。