2012-08-13 88 views
1

有这种really nice function from the php.net documentation可让您以Facebook风格的方式格式化时间(例如,2 minutes ago,4 weeks ago3 years ago)。PHP:格式化时间Stackoverflow或Apple Mail风格

不过,我喜欢的方式和#1苹果邮件做它一般是如下:

  1. 当前日期在x seconds agox hours ago或上市时间(例如,4:35pm)。
  2. 昨天被列为“昨天”。
  3. 之后的所有天数均以M/D/Y列出。

是否有人改编此php.net脚本来做到这一点,或可能共享不同的脚本,完成相同的目标?

<?php 

    function nicetime($date) 
{ 
    if(empty($date)) { 
     return "No date provided"; 
    } 

$periods   = array("second", "minute", "hour", "day", "week", "month", "year", "decade"); 
$lengths   = array("60","60","24","7","4.35","12","10"); 

$now    = time(); 
$unix_date   = strtotime($date); 

    // check validity of date 
if(empty($unix_date)) {  
    return "Bad date"; 
} 

// is it future date or past date 
if($now > $unix_date) {  
    $difference  = $now - $unix_date; 
    $tense   = "ago"; 

} else { 
    $difference  = $unix_date - $now; 
    $tense   = "from now"; 
} 

for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) { 
    $difference /= $lengths[$j]; 
} 

$difference = round($difference); 

if($difference != 1) { 
    $periods[$j].= "s"; 
} 

    return "$difference $periods[$j] {$tense}"; 
} 

$date = "2009-03-04 17:45"; 
$result = nicetime($date); // 2 days ago 

?> 
+0

您是否尝试过调整该脚本:

我通过增加变量$i(注意if/elseif/else条款表明各3点我上面提到的)中的nicetime()这个修改后的版本跟踪呢?你遇到问题了吗? – 2012-08-13 20:38:09

+0

@MikeBrant是的,我遇到了问题,我不熟悉支架'{}'表示法:'返回'$差异$句点[$ j] {$时态}“;' – 2012-08-13 20:39:42

+0

括号表示法只是另一个方式引用双引号内的变量。我不知道作者为什么会在$ tense周围使用它,而不是围绕其他变量使用它。我个人,会保持一致的广告做'返回'{$差异} {$句点[$ j]} {$时态}“'或'返回$差异。 ''。 $句点[$ j]。 ''$ tense;' – 2012-08-13 20:43:59

回答

1

好吧,我回答了我自己的问题。

关键是要跟踪for循环多少轮分裂的经过,直到当前时间减去所输入的时间,$difference的商,由$lengths数组项$j个值除以小于$j+1个值这个数组。

 ///http://php.net/manual/en/function.time.php 
    function nicetime($date) 
{ 
    if(empty($date)) { 
     return "No date provided"; 
    } 

$periods   = array("second", "minute", "hour", "day", "week", "month", "year", "decade"); 
$lengths   = array("60","60","24","7","4.35","12","10"); 

$now    = time(); 
$unix_date   = strtotime($date); 

    // check validity of date 
if(empty($unix_date)) {  
    return "Bad date"; 
} 

// is it future date or past date 
if($now > $unix_date) {  
    $difference  = $now - $unix_date; 
    $tense   = "ago"; 

} else { 
    $difference  = $unix_date - $now; 
    $tense   = "from now"; 
} 
$i=0; 
for($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) { 
    $i++; 
    $difference /= $lengths[$j]; 
} 

$difference = round($difference); 

if($difference != 1) { 
    $periods[$j].= "s"; 
} 

if($i<3){ 
    $day="$difference $periods[$j] {$tense}"; 
    return $day; 
    //satisfies case #1 where time is listed as seconds, minutes, hours ago 
} 

elseif($i==3){ 
    $difference == 1 && $periods[$j]=='day' ? $day='yesterday':  
    $day="$difference $periods[$j] {$tense}"; 
    return $day;   
    //satisfies case #2 where time is listed as yesterday if not the current day 

} 
else{ 
    return $date;  
    // satisfies case #3 where date is listed as M/D/Y if greater than a week old 
} 

} 

echo "case#1: ".nicetime('2012-08-13 23:12:16'); 
echo "case#2: ".nicetime('2012-08-12 23:12:16'); 
echo "case#3: ".nicetime('2012-07-07 23:12:16');