我有一个函数,从帖子中获取日期,并且应该写多久以前发布的日期。当我使用该功能时,它说它是在43年零4个月前发布的,原因有些奇怪。
function relativeTime($date,$precision=2)
{
$times=array(365*24*60*60 => "year",
30*24*60*60 => "month",
7*24*60*60 => "week",
24*60*60 => "day",
60*60 => "hour",
60 => "minute",
1 => "second");
$passed=time()-$date;
if($passed<5)
{
$output='less than 5 seconds ago';
}
else
{
$output=array();
$exit=0;
foreach($times as $period=>$name)
{
if($exit>=$precision || ($exit>0 && $period<60)) break;
$result = floor($passed/$period);
if($result>0)
{
$output[]=$result.' '.$name.($result==1?'':'s');
$passed-=$result*$period;
$exit++;
}
else if($exit>0) $exit++;
}
$output=implode(' and ',$output).' ago';
}
return $output;
}
我使用以下方式输入日期:
$date = date("Y-m-d H:i:s");
$passed=time()-$date
关闭了吗?
谢谢大家!
答案 0 :(得分:2)
time()
为您提供一个时间戳,即一个整数,表示自1970-01-01 00:00:00 UTC以来的秒数。
date("Y-m-d H:i:s")
会为您提供一个字符串,例如2013-05-13 02:04:34
当你减去这两个值时,字符串将根据字符串的初始字符转换为整数。这会产生2013年,这不会对时间戳产生太大影响。
使用输入参数的通用格式以及要从中减去的值。在对时间实例进行计算时,时间戳通常比任何字符串格式(用于表示而不是计算)更容易处理。我将函数定义更改为接受时间戳。
答案 1 :(得分:1)
您正在使用$date = date("Y-m-d H:i:s");
作为输入,现在将返回类似于2013-05-13 02:04:05
的内容。对time()
的调用目前会返回1368403494
附近的值。从彼此中减去这两个,并且日期字符串将由PHP隐式地静态转换为整数,因此2013
。这意味着它会在1368403494秒之前看到你的帖子,而不是完全意外地在1970年1月的某个地方结束,这是Unix时间戳时代的开始。所以,这将是43岁零几个月。
不要混用字符串和整数运算,PHP的无声转换会让它们变得很糟糕。
答案 2 :(得分:1)
有一个很多更好的方法来做到这一点。使用DateTime and its associated classes。代码更简单,更准确,因为它需要考虑时区和日光的节省时间。
$datetime1 = new DateTime();
$datetime2 = new DateTime('2013-01-03 17:13:00');
$interval = $datetime1->diff($datetime2);
$elapsed = $interval->format('%y years, %m months, %a days, %h hours,
%i minutes, %S seconds');
$elapsed = str_replace(array('0 years,', ' 0 months,', ' 0 days,',
' 0 hours,', ' 0 minutes,'), '', $elapsed);
$elapsed = str_replace(array('1 years, ', ' 1 months, ', ' 1 days, ',
' 1 hours, ', ' 1 minutes'), array('1 year, ',
'1 month, ', ' 1 day, ', ' 1 hour, ', ' 1 minute'),
$elapsed);
echo $elapsed;