2011-12-25 197 views
6

是否有一些函數timetostr在PHP中,將輸出today/tomorrow/next sunday/etc.從給定的時間戳?因此,timetostr(strtotime(x))=xphp strtotime反向

+2

date()。見http://php.net/manual/en/function.date.php – 2011-12-25 13:29:07

+0

@Andypandy:我知道'date()'。我的意思是問,有沒有一種直接的功能可以做'strtotime'的反轉? – prongs 2011-12-25 13:35:46

+0

如果沒有日期,我不知道...你能提供更多的上下文嗎?像這樣($ timestring = date('l',$ timestamp)不起作用? – 2011-12-25 13:39:21

回答

9

這可能對來這裏的人有用。

/** 
* Format a timestamp to display its age (5 days ago, in 3 days, etc.). 
* 
* @param int  $timestamp 
* @param int  $now 
* @return string 
*/ 
function timetostr($timestamp, $now = null) { 
    $age = ($now ?: time()) - $timestamp; 
    $future = ($age < 0); 
    $age = abs($age); 

    $age = (int)($age/60);  // minutes ago 
    if ($age == 0) return $future ? "momentarily" : "just now"; 

    $scales = [ 
     ["minute", "minutes", 60], 
     ["hour", "hours", 24], 
     ["day", "days", 7], 
     ["week", "weeks", 4.348214286],  // average with leap year every 4 years 
     ["month", "months", 12], 
     ["year", "years", 10], 
     ["decade", "decades", 10], 
     ["century", "centuries", 1000], 
     ["millenium", "millenia", PHP_INT_MAX] 
    ]; 

    foreach ($scales as list($singular, $plural, $factor)) { 
     if ($age == 0) 
      return $future 
       ? "in less than 1 $singular" 
       : "less than 1 $singular ago"; 
     if ($age == 1) 
      return $future 
       ? "in 1 $singular" 
       : "1 $singular ago"; 
     if ($age < $factor) 
      return $future 
       ? "in $age $plural" 
       : "$age $plural ago"; 
     $age = (int)($age/$factor); 
    } 
} 
+0

我收到一個錯誤:意外的'列表'(T_LIST)。我究竟做錯了什麼? – hozza 2014-09-11 13:54:32

+0

與PHP版本有什麼共同點?我通過聲明列表'list($ singular,$ plural,$ factor)= $ scale;'在foreach中並用'$ list'替換foreach中的列表來工作。 – hozza 2014-09-11 14:08:26

+0

這是正確的。 PHP 5.5增加了「使用list()解包嵌套數組」(http://php.net/manual/en/control-structures.foreach.php) – 2014-09-11 15:27:16

1

不能有strtotime反轉函數,因爲這不是雙射。當您使用strtotime時,您從中獲得UNIX時間戳的源字符串可以採用許多不同的方式進行格式化。所以如果你決定改變功能,你怎麼知道使用什麼字符串格式?這可能是2010年8月5日或2000年9月10日等。這正是爲什麼沒有反向函數,但正如Andypandy所說的,你必須使用date(),它允許你實際定義你想結束的字符串格式與...一起。我知道這個問題很舊,但我認爲它應該得到這個答案,所以其他用戶明白爲什麼PHP中沒有這樣的功能。

+5

雖然技術上「正確」這並不回答OP的問題,而只是促進了所有知道程序員的負面刻板印象,他知道比有人問這個問題,另一種方法是這樣說 - > http://stackoverflow.com/a/3040437/830899 – unsynchronized 2013-12-25 18:59:11

+3

date(「Ymd」,time())可以完成這項工作。 – Qinjie 2014-12-30 05:00:51