PHP: Есть ли функция, которая преобразует строку даты в читаемый человеком формат?

Я хочу преобразовать строку даты, например «19.11.2009 14:00», в возрастную группу теперь как «на 2 минуты» или «на 1 неделю» или «на 2 дня»,

Есть ли какой-нибудь код?

$dateString = strtotime('19.11.2009 14.00'); $now = time(); $time = $dateString - $now; if($time > 60 && $time < 3600) echo $time/60.' minutes remaining'; else if($time > 3600 && $time < 86400) echo $time/3600.' hours remaining'; else if($time > 86400 && $time < 604800) echo $time/86400.' days remaining'; else if($time > 604800 && $time < 18144000) echo $time/604800.' weeks remaining'; else if($time > 18144000 && $time < 217728000) echo $time/18144000.' months remaining'; else if($time > 217728000) echo $time/217728000.' years remaining'; 

Что-то вроде этого

 define('MINUTE',60); define('HOUR',60*MINUTE); define('DAY',24*HOUR); define('WEEK',7*DAY); define('MONTH',30*DAY); $pastDate=strtotime($dateString); $seconds=time()-$pastDate; if ($seconds>MONTH) return $seconds/MONTH . " months"; if ($seconds>WEEK) return $seconds/WEEK . " weeks"; if ($seconds>DAY) return $seconds/DAY . " days"; if ($seconds>HOUR) return $seconds/HOUR . " hours"; if ($seconds>MINUTE) return $seconds/MINUTE . " minutes"; return $seconds . " seconds"; 

Если вы используете PHP 5.3, вы также можете использовать DateTime: diff .

 $start = new DateTime('now'); $time_span = $start->diff(new DateTime($dateString)); var_dump($time_span); 

Это может быть не на 100%, что вы хотите явно – другие дали вам отличные ответы, но что-то вроде этого может быть хорошей альтернативой формату «удобного для чтения».

Я выкопал это из некоторого кода, который я использовал довольно давно. Я не тестировал это некоторое время, но в последнее время я помню, что он отлично работал. Я хотел воспроизвести что-то вроде того, что использует Facebook, например, «5 секунд назад», но оно также работает на будущее, используя «in …» вместо «… назад». Вероятно, вы можете изменить это, чтобы получить как можно больше деталей или деталей.

 /** * Returns the amount of time that has passed from the current date * or the amount of time from the current date until the specified date * * Returns in the form of a partial sentence. Some examples: * * In 25 days * Tomorrow * Yesterday * 4 months ago * Next month * Last month * (etc) * * @param string $date * @return string */ public static function calculateHowLong($date) { // start by converting to unix time $when = date("U", strtotime($date)); $isPast = ($when < time()); $how_long = abs(time() - $when); if ($how_long < 60) { $return = "{$how_long} seconds"; if ($isPast) $return .= " ago"; else $return = "In {$return}"; } elseif ($how_long < 60 * 60) { $return = (int) ($how_long / 60) . " minutes"; if ($isPast) $return .= " ago"; else $return = "In {$return}"; } elseif ($how_long < 60 * 60 * 24) { $return = (int) ($how_long / (60 * 60)) . " hours"; if ($isPast) $return .= " ago"; else $return = "In {$return}"; } elseif ($how_long < 60 * 60 * 24 * 2) { if ($isPast) $return = "Yesterday"; else $return = "Tomorrow"; } elseif ($how_long < 60 * 60 * 24 * 7) { $return = (int) ($how_long / (60 * 60 * 24)) . " days"; if ($isPast) $return .= " ago"; else $return = "In {$return}"; } elseif ($how_long < 60 * 60 * 24 * 13) { if ($isPast) $return = "Last week"; else $return = "Next week"; } elseif ($how_long < 60 * 60 * 24 * 7 * 4) { $return = (int) ($how_long / (60 * 60 * 24 * 7)) . " weeks"; if ($isPast) $return .= " ago"; else $return = "In {$return}"; } elseif ($how_long < 60 * 60 * 24 * 30 * 2) { if ($isPast) $return = "Last month"; else $return = "Next month"; } elseif ($how_long < 60 * 60 * 24 * 30 * 12) { $return = (int) ($how_long / (60 * 60 * 24 * 30)) . " months"; if ($isPast) $return .= " ago"; else $return = "In {$return}"; } else { if ($isPast) $return = "More than 1 year ago"; else $return = "In more than 1 year"; } return $return; } 

Это, наверное, немного неряшливо, но не стесняйтесь делать это лучше.