PHP: есть ли функция, которая преобразует строку даты в удобочитаемый формат? - PullRequest
1 голос
/ 19 ноября 2009

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

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

Ответы [ 4 ]

8 голосов
/ 19 ноября 2009
$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';
5 голосов
/ 19 ноября 2009

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

$start = new DateTime('now');
$time_span = $start->diff(new DateTime($dateString));
var_dump($time_span);
5 голосов
/ 19 ноября 2009

как то так

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";
2 голосов
/ 19 ноября 2009

Очевидно, что это не 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;
}

Возможно, это немного неаккуратно, но не стесняйтесь, чтобы было лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...