datetime - PHP词义化时间 idate
從typecho中剝了一段詞義化時(shí)間代碼并按需做了修改,在測試中發(fā)現(xiàn)有個(gè)問題很納悶:(
假如Unix時(shí)間戳$form與$now相差300, 而它們處于不同的小時(shí)段idate(H), 這樣5分鐘前的操作卻顯示為1小時(shí)前, 然而在TE中卻沒有發(fā)現(xiàn)這現(xiàn)象^-!,
現(xiàn)在的問題是$between < 3600 而idate(H)相差1,請(qǐng)問如何修正?本人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.' 小時(shí)前';
}
登錄后復(fù)制登錄后復(fù)制
}
源碼如下
/**
* 詞義化時(shí)間
*
* @access public
* @param string $from 起始時(shí)間
* @param string $now 終止時(shí)間
* @return string
*/
public static function dateWord($from, $now)
{
$between = $now - $from;
/** 如果是一天 */
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
/** 如果是一小時(shí) */
if ($between < 3600 && idate('H', $from) == idate('H', $now)) {
/** 如果是一分鐘 */
if ($between 0 && $between 2 + idate('z', $now))) {
return _t('昨天 %s', date('H:i', $from));
}
/** 如果是一個(gè)星期 */
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);
}
登錄后復(fù)制登錄后復(fù)制
回復(fù)內(nèi)容:
從typecho中剝了一段詞義化時(shí)間代碼并按需做了修改,在測試中發(fā)現(xiàn)有個(gè)問題很納悶:(
假如Unix時(shí)間戳$form與$now相差300, 而它們處于不同的小時(shí)段idate(H), 這樣5分鐘前的操作卻顯示為1小時(shí)前, 然而在TE中卻沒有發(fā)現(xiàn)這現(xiàn)象^-!,
現(xiàn)在的問題是$between < 3600 而idate(H)相差1,請(qǐng)問如何修正?本人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.' 小時(shí)前';
}
登錄后復(fù)制登錄后復(fù)制
}
源碼如下
/**
* 詞義化時(shí)間
*
* @access public
* @param string $from 起始時(shí)間
* @param string $now 終止時(shí)間
* @return string
*/
public static function dateWord($from, $now)
{
$between = $now - $from;
/** 如果是一天 */
if ($between > 0 && $between < 86400 && idate('d', $from) == idate('d', $now)) {
/** 如果是一小時(shí) */
if ($between < 3600 && idate('H', $from) == idate('H', $now)) {
/** 如果是一分鐘 */
if ($between 0 && $between 2 + idate('z', $now))) {
return _t('昨天 %s', date('H:i', $from));
}
/** 如果是一個(gè)星期 */
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);
}
登錄后復(fù)制登錄后復(fù)制
因?yàn)槟銊冸x出來的代碼對(duì)小時(shí)只對(duì)同一小時(shí)的情況進(jìn)行了判斷,并未判斷相鄰小時(shí)但相差60分鐘內(nèi)的情況,因此,我加了一個(gè) gapHour 的變量用來代表小時(shí)差,當(dāng)時(shí)間相差60分鐘內(nèi),做一個(gè) if 判斷,如果同一小時(shí)默認(rèn)處理($gapHour == 0),相差一個(gè)小時(shí)時(shí)($gapHour == 1),再做相應(yīng)的處理。
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.' 小時(shí)前';
}
}
登錄后復(fù)制
額一來大段代碼看著頭暈,二來官方現(xiàn)在也不是很推薦用date()函數(shù)來操作時(shí)間對(duì)象了,所以我把整個(gè)的代碼都改寫了一下:
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日');
/** 一年內(nèi)大于七天 **/
if($between->days > 6)
return $from->format('n月j日');
/** 一個(gè)禮拜內(nèi)但是大于兩天**/
if($between->days > 1)
return $between->format('%d天前');
/** 如果是昨天 **/
if($between->days)
return $from->format('昨天 H:i');
/** 如果一天之內(nèi)超過一個(gè)小時(shí) **/
if($between->h > 1)
return $between->format('%h小時(shí)前');
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");
登錄后復(fù)制
dateWord()函數(shù)對(duì)應(yīng)的是Typecho原版的返回,dateWordToHtml()函數(shù)則是對(duì)應(yīng)你修改的那個(gè)函數(shù)(另外新建一個(gè)函數(shù)主要是方便其他人參考調(diào)用)。
總結(jié)
以上是生活随笔為你收集整理的datetime - PHP词义化时间 idate的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 访问 GitHub 的速度很慢?试试这几
- 下一篇: 35岁真的是程序员的坎儿吗?