• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

datetime – PHP词义化时间 idate

php 搞代码 3年前 (2022-01-25) 9次浏览 已收录 0个评论
文章目录[隐藏]

从typecho中剥了一段词义化时间代码并按需做了修改,在测试中发现有个问题很纳闷:(
假如Unix时间戳$form与$now相差300, 而它们处于不同的小时段idate(H), 这样5分钟前的操作却显示为1小时前, 然而在TE中却没有发现这现象^-!,
现在的问题是$between < 3600 而idate(H)相差1,请问如何修正?本人PHP门外汉,特不耻上问!

if ($between < 3600 && idate('H', $from) == idate('H', $now)) {

<code>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 '<span title="'.$s.'">刚刚</span>';            } else {                return '<span title="'.$s.'">'.$second.' 秒前</span>';            }        }        $min = idate('i', $now) - idate('i', $from);        return '<span title="'.$s.'">'.$min.' 分钟前</span>';    }    $hour = idate('H', $now) - idate('H', $from);    return '<span title="'.$s.'">'.$hour.' 小时前</span>';}</code>

}

源码如下

<code>    /** * 词义化时间 * * @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);}</code>

回复内容:

从typecho中剥了一段词义化时间代码并按需做了修改,在测试中发现有个问题很纳闷:(
假如Unix时间戳$form与$now相差300, 而它们处于不同的小时段idate(H), 这样5分钟前的操作却显示为1小时前, 然而在TE中却没有发现这现象^-!,
现在的问题是$between < 3600 而idate(H)相差1,请问如何修正?本人PHP门外汉,特不耻上问!

if ($between < 3600 && idate('H', $from) == idate('H', $now)) {

<code>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 '<span title="'.$s.'">刚刚</span>';            } else {                return '<span title="'.$s.'">'.$second.' 秒前</span>';            }        }        $min = idate('i', $now) - idate('i', $from);        return '<span title="'.$s.'">'.$min.' 分钟前</span>';    }    $hour = idate('H', $now) - idate('H', $from);    return '<span title="'.$s.'">'.$hour.' 小时前</span>';}</code>

}

源码如下

<code>    /** * 词义化时间 * * @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);}</code>

因为你剥离出来的代码对小时只对同一小时的情况进行了判断,并未判断相邻小时但相差60分钟内的情况,因此,我加了一个 gapHour 的变量用来代表小时差,当时间相差60分钟内,做一个 if 判断,如果同一小时默认处理($gapHour == 0),相差一个小时时($gapHour == 1),再做相应的处理。

<code>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 '<span title="'.$s.'">刚刚</span>';                } else {                    return '<span title="'.$s.'">'.$second.' 秒前</span>';                }            }            $min = idate('i', $now) - idate('i', $from);            return '<span title="'.$s.'">'.$min.' 分钟前</span>';          }          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 '<span title="'.$s.'">刚刚</span>';                } else {                    return '<span title="'.$s.'">'.$second.' 秒前</span>';                }            }            $min = idate('i', $now) + (60 - idate('i', $from));            return '<span title="'.$s.'">'.$min.' 分钟前</span>';                    }      }      $hour = idate('H', $now) - idate('H', $from);      return '<span title="'.$s.'">'.$hour.' 小时前</span>';  }}</code>

额一来大段代码看着头晕,二来官方现在也不是很推荐用date()函数来操作时间对象了,所以我把整个的代码都改写了一下:

<code>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日');    /** <mark>6来源gaodaimacom搞#^代%!码网</mark><strong>搞gaodaima代码</strong>一年内大于七天 **/    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 "<span title="$fromWord">$dateWord</span>";}echo dateWordToHtml("2014/4/14 9:32");</code>

dateWord()函数对应的是Typecho原版的返回,dateWordToHtml()函数则是对应你修改的那个函数(另外新建一个函数主要是方便其他人参考调用)。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:datetime – PHP词义化时间 idate

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址