开发者社区> 问答> 正文

请教各位PHP词义化时间 idate的问题

从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)) {

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>';
}

}

源码如下

    /**
 * 词义化时间
 *
 * @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 < 60 && idate('i', $from) == idate('i', $now)) {
                $second = idate('s', $now) - idate('s', $from);
                if (0 == $second) {
                    return _t('刚刚');
                } else {
                    return sprintf(_n('%d秒前', '%d秒前', $second), $second);
                }
            }

            $min = idate('i', $now) - idate('i', $from);
            return sprintf(_n('%d分钟前', '%d分钟前', $min), $min);
        }

        $hour = idate('H', $now) - idate('H', $from);
        return sprintf(_n('%d小时前', '%d小时前', $hour), $hour);
    }

    /** 如果是昨天 */
    if ($between > 0 && $between < 172800 && (idate('z', $from) + 1 == idate('z', $now) || idate('z', $from) > 2 + idate('z', $now))) {
        return _t('昨天 %s', date('H:i', $from));
    }

    /** 如果是一个星期 */
    if ($between > 0 && $between < 604800 && idate('W', $from) == idate('W', $now)) {
        $day = intval($between / (3600 * 24));
        return sprintf(_n('%d天前', '%d天前', $day), $day);
    }

    /** 如果是 */
    if ($between > 0 && $between < 31622400 && idate('Y', $from) == idate('Y', $now)) {
        return date(_t('n月j日'), $from);
    }

    return date(_t('Y年m月d日'), $from);
}

展开
收起
落地花开啦 2016-06-17 17:47:21 2181 0
1 条回答
写回答
取消 提交回答
  • 喜欢技术,喜欢努力的人

    因为你剥离出来的代码对小时只对同一小时的情况进行了判断,并未判断相邻小时但相差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 '<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>';
      }
    }
    2019-07-17 19:43:20
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载
复杂PHP系统性能瓶颈排查及优化 立即下载