im试图将mysql时间戳转换为以月、天、小时或分钟为单位的时间。
所以输出看起来是这样的:
1个月前添加/添加:0小时前添加/21分钟前添加/30秒前添加
所以我只想要一种时间格式,取决于多少分钟、多少小时或多少天等等,所以60分钟转换为1小时前,24小时转换为1天前,48小时转换为2天前。
到目前为止,我有这个代码:
<?
$datetime1 = new DateTime();
$datetime2 = new DateTime ($news['date_added']);
$interval = $datetime1->diff($datetime2);
str_replace('0 hours', '', $variable);
echo $interval->format('%h hours %i minutes');
?>
并输出以下内容:
0小时前57分钟前添加。
有人能帮助我或向我展示id需要做什么才能正确显示格式吗?我真的是php新手,不知道如何做到这一点。非常感谢。
来源http://php.net/manual/en/ref.datetime.php
只需在调用函数时将$precision更改为1,并在日期前后添加任何文本即可。您必须确保将日期对象转换为时间戳,但这对您来说应该不是问题。
/**
* this code assumes php >= 5.1.0. if using < 5.1, read
* php.net/strtotime and change the condition for checking
* for failure from strtotime()
*/
// $t1, $t2: unix times, or strtotime parseable
// $precision: max number of units to output
// $abbr: if true, use "hr" instead of "hour", etc.
function date_diff ($t1, $t2, $precision = 6, $abbr = false) {
if (preg_match('/'D/', $t1) && ($t1 = strtotime($t1)) === false)
return false;
if (preg_match('/'D/', $t2) && ($t2 = strtotime($t2)) === false)
return false;
if ($t1 > $t2)
list($t1, $t2) = array($t2, $t1);
$diffs = array(
'year' => 0, 'month' => 0, 'day' => 0,
'hour' => 0, 'minute' => 0, 'second' => 0,
);
$abbrs = array(
'year' => 'yr', 'month' => 'mth', 'day' => 'day',
'hour' => 'hr', 'minute' => 'min', 'second' => 'sec'
);
foreach (array_keys($diffs) as $interval) {
while ($t2 >= ($t3 = strtotime("+1 ${interval}", $t1))) {
$t1 = $t3;
++$diffs[$interval];
}
}
$stack = array();
foreach ($diffs as $interval => $num)
$stack[] = array($num, ($abbr ? $abbrs[$interval] : $interval) . ($num != 1 ? 's' : ''));
$ret = array();
while (count($ret) < $precision && ($item = array_shift($stack)) !== null) {
if ($item[0] > 0)
$ret[] = "{$item[0]} {$item[1]}";
}
return implode(', ', $ret);
}
$t1 = 'Feb 4, 2008 12:16:00';
$t2 = 'Jul 3, 2006 16:15:30';
echo date_diff($t1, $t2), "'n",
date_diff($t1, $t2, 3), "'n",
date_diff($t1, $t2, 2, true), "'n";
?>
这里有一个可能的解决方案。你将时差格式化为一个月、天、小时、分、秒的字符串,然后在该字符串中查找第一个非零数字:这就是你想要的数字。。。
$mdhms = explode('-',$interval->format('%m-%d-%H-%i-%s'));
$labels = Array(' months', ' days', ' hours', ' minutes', ' seconds');
$i = 0;
foreach($mdhms as $t){
if($t > 0) break;
$i+=1;
}
if ($i < 5) echo "It happened ".$t.$labels[$i]." ago";
else echo "It is happening right now!"