我正在寻找一种优雅的解决方案,可以根据现在的时间长度和数据库中的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语句真的困扰着我,我似乎无法找到更好的方法来做到这一点....
答案 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更加清晰