2012-05-21 1 views
1

Можно создать дубликат:
Human-readable, current time sensitive date and time formatting in PHP
Human Readable Date Using PHPСсылка на чтение для человека в PHP, например. "Последний понедельник"

Я ищу способ создания читаемых ссылки даты человека, в разговорном стиле, например, следующее:

diff('2012-05-15', '2012-05-21') == "last Tuesday" 
diff('2012-05-15', '2012-05-16') == "yesterday" 
diff('2012-05-15', '2012-05-17') == "on Tuesday" 
diff('2012-04-11', '2012-05-21') == "on the 11th of April" 

Я просмотрел strtotime(), whi ch, кажется, делает обратное к тому, что я хочу. Решение не нужно работать с будущими датами, только прошедшими датами. Я увидел еще один вопрос, задающий то же самое для future dates in JavaScript, но на самом деле это не решило мою проблему.

Любые идеи?

+0

В PHP нет ничего подобного. Однако не должно быть слишком сложно настраивать код из-за множества случаев. 'if (date == today - 1)« вчера »еще (дата <= +1 неделя)« on ». будний день ... – deceze

+0

@Juhana Этот вопрос в основном прошу прославить датифф. Это не связано. – Polynomial

+0

@deceze Я надеялся избежать этого - есть некоторые уродливые угловые случаи, когда вы занимаетесь неделями. – Polynomial

ответ

5

Я думаю PHP: producing relative date/time from timestamps является то, что вы ищете:

Это код из принятого ответа на этот вопрос (скопировал его здесь, так как исходный вопрос только ссылки на Pastebin):

function time2str($ts) 
{ 
    if(!ctype_digit($ts)) 
     $ts = strtotime($ts); 

    $diff = time() - $ts; 
    if($diff == 0) 
     return 'now'; 
    elseif($diff > 0) 
    { 
     $day_diff = floor($diff/86400); 
     if($day_diff == 0) 
     { 
      if($diff < 60) return 'just now'; 
      if($diff < 120) return '1 minute ago'; 
      if($diff < 3600) return floor($diff/60) . ' minutes ago'; 
      if($diff < 7200) return '1 hour ago'; 
      if($diff < 86400) return floor($diff/3600) . ' hours ago'; 
     } 
     if($day_diff == 1) return 'Yesterday'; 
     if($day_diff < 7) return $day_diff . ' days ago'; 
     if($day_diff < 31) return ceil($day_diff/7) . ' weeks ago'; 
     if($day_diff < 60) return 'last month'; 
     return date('F Y', $ts); 
    } 
    else 
    { 
     $diff = abs($diff); 
     $day_diff = floor($diff/86400); 
     if($day_diff == 0) 
     { 
      if($diff < 120) return 'in a minute'; 
      if($diff < 3600) return 'in ' . floor($diff/60) . ' minutes'; 
      if($diff < 7200) return 'in an hour'; 
      if($diff < 86400) return 'in ' . floor($diff/3600) . ' hours'; 
     } 
     if($day_diff == 1) return 'Tomorrow'; 
     if($day_diff < 4) return date('l', $ts); 
     if($day_diff < 7 + (7 - date('w'))) return 'next week'; 
     if(ceil($day_diff/7) < 4) return 'in ' . ceil($day_diff/7) . ' weeks'; 
     if(date('n', $ts) == date('n') + 1) return 'next month'; 
     return date('F Y', $ts); 
    } 
} 
+1

Это относительная разница между датами. OP хочет «человеческую дату». (т. е. «11 июня», а не «в следующем месяце»). – meze