从typecho中剥了一段词义化时间代码并按需做了修改,在测试中发现有个问题很纳闷:(
假如Unix时间戳$form与$now相差300, 而它们处于不同的小时段idate(H), 这样5分钟前的操作却显示为1小时前, 然而在TE中却没有发现这现象^-!,
现在的问题是$between < 3600 而idate(H)相差1,请问如何修正?本人PHP门外汉,特不耻上问!
function dateWord($from) {
$now = time();
$between = $now - $from;
$s = date('Y年m月d日 H:i', $from);
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
if ($between < 3600 && idate('H', $from) == idate('H', $now)) {
if ($between < 60 && idate('i', $from) == idate('i', $now)) {
$second = idate('s', $now) - idate('s', $from);
if (0 == $second) {
return '刚刚';
} else {
return ''.$second.' 秒前';
}
}
$min = idate('i', $now) - idate('i', $from);
return ''.$min.' 分钟前';
}
$hour = idate('H', $now) - idate('H', $from);
return ''.$hour.' 小时前';
}
登录后复制登录后复制
}
源码如下
/**
* 词义化时间
*
* @access public
* @param string $from 起始时间
* @param string $now 终止时间
* @return string
*/
public static function dateWord($from, $now)
{
$between = $now - $from;
/** 如果是一天 */
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
/** 如果是一小时 */
if ($between < 3600 && idate('H', $from) == idate('H', $now)) {
/** 如果是一分钟 */
if ($between 0 && $between 2 + idate('z', $now))) {
return _t('昨天 %s', date('H:i', $from));
}
/** 如果是一个星期 */
if ($between > 0 && $between 0 && $between < 31622400 && idate('Y', $from) == idate('Y', $now)) {
return date(_t('n月j日'), $from);
}
return date(_t('Y年m月d日'), $from);
}
登录后复制登录后复制
回复内容:
从typecho中剥了一段词义化时间代码并按需做了修改,在测试中发现有个问题很纳闷:(
假如Unix时间戳$form与$now相差300, 而它们处于不同的小时段idate(H), 这样5分钟前的操作却显示为1小时前, 然而在TE中却没有发现这现象^-!,
现在的问题是$between < 3600 而idate(H)相差1,请问如何修正?本人PHP门外汉,特不耻上问!
function dateWord($from) {
$now = time();
$between = $now - $from;
$s = date('Y年m月d日 H:i', $from);
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
if ($between < 3600 && idate('H', $from) == idate('H', $now)) {
if ($between < 60 && idate('i', $from) == idate('i', $now)) {
$second = idate('s', $now) - idate('s', $from);
if (0 == $second) {
return '刚刚';
} else {
return ''.$second.' 秒前';
}
}
$min = idate('i', $now) - idate('i', $from);
return ''.$min.' 分钟前';
}
$hour = idate('H', $now) - idate('H', $from);
return ''.$hour.' 小时前';
}
登录后复制登录后复制
}
源码如下
/**
* 词义化时间
*
* @access public
* @param string $from 起始时间
* @param string $now 终止时间
* @return string
*/
public static function dateWord($from, $now)
{
$between = $now - $from;
/** 如果是一天 */
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
/** 如果是一小时 */
if ($between < 3600 && idate('H', $from) == idate('H', $now)) {
/** 如果是一分钟 */
if ($between 0 && $between 2 + idate('z', $now))) {
return _t('昨天 %s', date('H:i', $from));
}
/** 如果是一个星期 */
if ($between > 0 && $between 0 && $between < 31622400 && idate('Y', $from) == idate('Y', $now)) {
return date(_t('n月j日'), $from);
}
return date(_t('Y年m月d日'), $from);
}
登录后复制登录后复制
因为你剥离出来的代码对小时只对同一小时的情况进行了判断,并未判断相邻小时但相差60分钟内的情况,因此,我加了一个 gapHour
的变量用来代表小时差,当时间相差60分钟内,做一个 if
判断,如果同一小时默认处理($gapHour == 0)
,相差一个小时时($gapHour == 1)
,再做相应的处理。
function dateWord($from) {
$now = time();
$between = $now - $from;
$s = date('Y年m月d日 H:i', $from);
$fromHour = idate('H', $from);
$nowHour = idate('H', $now);
$gapHour = $nowHour - $fromHour;
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
if ($between < 3600) {
if ($gapHour == 0) {
if ($between < 60 && idate('i', $from) == idate('i', $now)) {
$second = idate('s', $now) - idate('s', $from);
if (0 == $second) {
return '刚刚';
} else {
return ''.$second.' 秒前';
}
}
$min = idate('i', $now) - idate('i', $from);
return ''.$min.' 分钟前';
}
else if ($gapHour == 1) {
if ($between < 60 && idate('i', $from) == idate('i', $now)) {
$second = idate('s', $now) + (60 - idate('s', $from));
if (0 == $second) {
return '刚刚';
} else {
return ''.$second.' 秒前';
}
}
$min = idate('i', $now) + (60 - idate('i', $from));
return ''.$min.' 分钟前';
}
}
$hour = idate('H', $now) - idate('H', $from);
return ''.$hour.' 小时前';
}
}
登录后复制
额一来大段代码看着头晕,二来官方现在也不是很推荐用date()
函数来操作时间对象了,所以我把整个的代码都改写了一下:
function dateWord($from, $now) {
$timezone = new DateTimeZone('Asia/Shanghai');
$now = new DateTime($now, $timezone);
$from = new DateTime($from, $timezone);
$between = $now->diff($from);
if(!$between->invert) return false;
/** 如果超过了一年 **/
if($between->y)
return $from->format('Y年m月d日');
/** 一年内大于七天 **/
if($between->days > 6)
return $from->format('n月j日');
/** 一个礼拜内但是大于两天**/
if($between->days > 1)
return $between->format('%d天前');
/** 如果是昨天 **/
if($between->days)
return $from->format('昨天 H:i');
/** 如果一天之内超过一个小时 **/
if($between->h > 1)
return $between->format('%h小时前');
if($between->i > 1)
return $between->format('%i分钟前');
return $between->s ? $between->format('%s秒前') : '刚刚';
}
function dateWordToHtml($from, $now = 'now') {
$dateWord = dateWord($from, $now);
$from = new DateTime($from, new DateTimeZone('Asia/Shanghai'));
$fromWord = $from->format('Y年m月d日 H:i');
return "$dateWord";
}
echo dateWordToHtml("2014/4/14 9:32");
登录后复制
dateWord()
函数对应的是Typecho原版的返回,dateWordToHtml()
函数则是对应你修改的那个函数(另外新建一个函数主要是方便其他人参考调用)。
最新评论