Очевидно, что это не 100% того, что вы хотите - другие дали вам отличные ответы - но что-то вроде этого может быть хорошей альтернативой «читабельному» формату даты.
Я выкопал это из некоторого кода, который использовал довольно давно. Я не проверял это некоторое время, но последнее, что я помню, это работало отлично. Я хотел повторить что-то наподобие того, что использует Facebook, например «5 секунд назад», но это также работает на будущее, используя «in ...» вместо «... ago». Вы можете изменить это, чтобы получить как можно больше или меньше деталей.
/**
* 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;
}
Возможно, это немного неаккуратно, но не стесняйтесь, чтобы было лучше.