日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

datetime - PHP词义化时间 idate

發布時間:2023/12/19 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 datetime - PHP词义化时间 idate 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從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()函數則是對應你修改的那個函數(另外新建一個函數主要是方便其他人參考調用)。

總結

以上是生活随笔為你收集整理的datetime - PHP词义化时间 idate的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。