PHP: Bir insan okunabilir biçimde bir tarih dizesi dönüştüren bir işlevi var mı?

3 Cevap php

Ben ya da "2 gün" "1 hafta" "2 dakika boyunca" gibi artık o çağa "19.11.2009 14:00" gibi bir tarih dizesi dönüştürmek ya da istediğiniz

Etrafında bazı kod var mı?

3 Cevap

PHP 5.3 iseniz siz de kullanabilirsiniz DateTime:diff.

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

Böyle bir şey

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";

Bu tabii ki ne istediğinizi% 100 olmayabilir - Başkaları size büyük cevap verdik - ama böyle bir şey, bir "insan okunabilir" tarih biçimine iyi bir alternatif olabilir.

Ben uzunca bir süre önce kullanılan bazı kod bu kadar kazdık. Ben bir süre bu test değil, ama geçen ben o amele büyük hatırlıyorum. Ben "5 saniye önce" gibi, Facebook kullanan ne gibi bir şey çoğaltmak istedim, ama aynı zamanda kullanarak, gelecek için çalışıyor "in ..." yerine "... önce" arasında. Muhtemelen istediğiniz kadar çok veya az ayrıntı almak için bu değiştirebilirsiniz.

/**
 * 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;
}

Muhtemelen biraz özensiz, ama daha iyi yapmak için çekinmeyin.