1

コメントが投稿されてからどれくらいの時間が経過したかを表示しようとしています。私は今混乱しています。多くの方法を試していますが、うまくいかないようです。

私のコードは、出力として数年前に与えたばかりです。

ここに私のコードがあります:

$date = new DateTime();
$newtime = $date->format('U');
$oldtime = $row['time'];
$diffrence = $newtime - $oldtime;
$date = new DateTime("@$diffrence");
$sect = round($date->format('s'));
$mint = round($date->format('i'));
$hout = round($date->format('H'));
$dayt = round($date->format('d'));
$mont = round($date->format('m'));
$yeat = round($date->format('Y'));

if ($yeat > 1970){
    $disptime = "years ago";
} else if ($yeat < 1970) {
    $disptime = "$mont months ago";
} else if ($mont < 0) {
    $disptime = "$dayt days ago";
} else if ($dayt < 0) {
    $disptime = "$hout hours $mint min ago";
} else if ($hout < 0) {
    $disptime = "$mint min $sect sec ago";
} else {
    $disptime = "$sect sec ago";
}

0から1970年に変更した後、ソリューションに近づく編集

解決済みですが、他の方法でチュートリアルを見つけて、ここで独自のコードを作成することは解決されました

$start_date = new DateTime($row['timestamp']);
$since_start = $start_date->diff(new DateTime($date->format('Y-m-d H:i:s')));
$yeat = $since_start->y;
$mont = $since_start->m;
$dayt = $since_start->d;
$hout = $since_start->h;
$mint = $since_start->i;
$sect = $since_start->s; 

if ($mint == 0 && $hout == 0 && $dayt == 0 && $mont == 0 && $yeat == 0){
    $disptime = "$sect sec ago";
} else if ($hout == 0 && $dayt == 0 && $mont == 0 && $yeat == 0) {
    $disptime = "$mint min ago";
} else if ($dayt == 0 && $mont == 0 && $yeat == 0) {
    $disptime = "$hout hours ago";
} else if ($mont == 0 && $yeat == 0) {
    $disptime = "$dayt days ago";
} else if ($yeat == 0) {
    $disptime = "$mont months ago";
} else {
    $disptime = "$yeat years ago";
}
4

2 に答える 2

2

PHP の DateTime クラスには、Diff()まさに必要なことを行うメソッドがあります。

コードは次のようになります。

$date    = new DateTime();
$rowDate = DateTime::CreateFromFormat('U',$row['time']);

$interval = $date->diff($rowDate);

if($interval->y) {
    echo $interval->format('%y years');
} elseif($interval->m) {
    echo $interval->format('%m months');
} elseif($interval->d) {
    echo $interval->format('%d days');
} elseif($interval->h) {
    echo $interval->format('%h hours');
} elseif($interval->i) {
    echo $interval->format('%i minutes');
} elseif($interval->s) {
    echo $interval->format('%s seconds');
}
于 2013-05-26T21:12:51.500 に答える
1

Cakephp の TimeHelpers を参照してください。

public static function niceShort($dateString = null, $timezone = null) {
  if (!$dateString) {
   $dateString = time();
  }
$date = self::fromString($dateString, $timezone);

if (self::isToday($dateString, $timezone)) {
  return __d('cake', 'Today, %s', self::_strftime("%H:%M", $date));
}
if (self::wasYesterday($dateString, $timezone)) {
  return __d('cake', 'Yesterday, %s', self::_strftime("%H:%M", $date));
}
if (self::isTomorrow($dateString, $timezone)) {
  return __d('cake', 'Tomorrow, %s', self::_strftime("%H:%M", $date));
}

$d = self::_strftime("%w", $date);
$day = array(
__d('cake', 'Sunday'),
__d('cake', 'Monday'),
__d('cake', 'Tuesday'),
__d('cake', 'Wednesday'),
__d('cake', 'Thursday'),
__d('cake', 'Friday'),
__d('cake', 'Saturday')
);
if (self::wasWithinLast('7 days', $dateString, $timezone)) {
  return sprintf('%s %s', $day[$d], self::_strftime(self::$niceShortFormat, $date));
}
if (self::isWithinNext('7 days', $dateString, $timezone)) {
  return __d('cake', 'On %s %s', $day[$d], self::_strftime(self::$niceShortFormat, $date));
}

$y = '';
if (!self::isThisYear($date)) {
  $y = ' %Y';
}
  return self::_strftime(self::convertSpecifiers("%b %eS{$y}, %H:%M", $date), $date);
}

詳細はこちら:

独自のユーティリティ関数を実装する方法についてのアイデアが得られることを願っています。

于 2013-05-26T18:58:42.663 に答える