PHP: дата «вчера», «сегодня» - PullRequest
13 голосов
/ 11 августа 2010

У меня есть небольшая функция, которая показывает последние действия, она получает метку времени в формате unix из БД, а затем выводит следующую строку:

 date("G:i:s j M -Y", $last_access)

Теперь я хотел бы заменить дату (j M -Y) до вчера и сегодня, если последняя активность была в течение сегодняшнего дня, и то же самое относится ко вчерашнему дню.

Как я могу это сделать?

Ответы [ 9 ]

36 голосов
/ 11 августа 2010

Я бы нашел временную метку для последней полуночи и предыдущую, если $last_access находится между двумя временными метками, а затем отобразить вчера , что-либо большее, чем метка времени прошлой полуночи, будет сегодня ...

Я считаю, что это будет быстрее, чем арифметика с датой.

На самом деле, я только что протестировал этот код, и он, кажется, отлично работает:

<?php
    if ($last_access >= strtotime("today"))
        echo "Today";
    else if ($last_access >= strtotime("yesterday"))
        echo "Yesterday";
?>
15 голосов
/ 11 августа 2010
function get_day_name($timestamp) {

    $date = date('d/m/Y', $timestamp);

    if($date == date('d/m/Y')) {
      $date = 'Today';
    } 
    else if($date == date('d/m/Y',now() - (24 * 60 * 60))) {
      $date = 'Yesterday';
    }
    return $date;
}
print date('G:i:s', $last_access).' '.get_day_name($last_access);
8 голосов
/ 24 июля 2013

Вы должны сравнивать день с днем, сравнение секунд абсолютно неверно:

Если мы сегодня утром, это означает, что вчерашняя ночь сегодня (минус 24 часа) ^^

Здесьметод, который я использую для Kinoulink (французский стартап):

public function formatDateAgo($value)
{
    $time = strtotime($value);
    $d = new \DateTime($value);

    $weekDays = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'];
    $months = ['Janvier', 'Février', 'Mars', 'Avril',' Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre'];

    if ($time > strtotime('-2 minutes'))
    {
        return 'Il y a quelques secondes';
    }
    elseif ($time > strtotime('-30 minutes'))
    {
        return 'Il y a ' . floor((strtotime('now') - $time)/60) . ' min';
    }
    elseif ($time > strtotime('today'))
    {
        return $d->format('G:i');
    }
    elseif ($time > strtotime('yesterday'))
    {
        return 'Hier, ' . $d->format('G:i');
    }
    elseif ($time > strtotime('this week'))
    {
        return $weekDays[$d->format('N') - 1] . ', ' . $d->format('G:i');
    }
    else
    {
        return $d->format('j') . ' ' . $months[$d->format('n') - 1] . ', ' . $d->format('G:i');
    }
}
3 голосов
/ 21 ноября 2017

Я улучшил ответ Томаса Деко, чтобы придумать этот

function formatTimeString($timeStamp) {
$str_time = date("Y-m-d H:i:sP", $timeStamp);
$time = strtotime($str_time);
$d = new DateTime($str_time);

$weekDays = ['Mon', 'Tue', 'Wed', 'Thur', 'Fri', 'Sat', 'Sun'];
$months = ['Jan', 'Feb', 'Mar', 'Apr', ' May', 'Jun', 'Jul', 'Aug', 'Sept', 'Oct', 'Nov', 'Dec'];

if ($time > strtotime('-2 minutes')) {
  return 'Just now';
} elseif ($time > strtotime('-59 minutes')) {
  $min_diff = floor((strtotime('now') - $time) / 60);
  return $min_diff . ' min' . (($min_diff != 1) ? "s" : "") . ' ago';
} elseif ($time > strtotime('-23 hours')) {
  $hour_diff = floor((strtotime('now') - $time) / (60 * 60));
  return $hour_diff . ' hour' . (($hour_diff != 1) ? "s" : "") . ' ago';
} elseif ($time > strtotime('today')) {
  return $d->format('G:i');
} elseif ($time > strtotime('yesterday')) {
  return 'Yesterday at ' . $d->format('G:i');
} elseif ($time > strtotime('this week')) {
  return $weekDays[$d->format('N') - 1] . ' at ' . $d->format('G:i');
} else {
  return $d->format('j') . ' ' . $months[$d->format('n') - 1] .
  (($d->format('Y') != date("Y")) ? $d->format(' Y') : "") .
  ' at ' . $d->format('G:i');
}

}

Он принимает метку времени в качестве аргумента, он добавляет год времени, если он был издругой год и т.д ...

2 голосов
/ 11 августа 2010

Если вы идете по дороге, как предложено выше, с отметками времени unix на сегодня / вчера, взгляните на strtotime, одно из величайших изобретений XX (или 21-го?) Века:

echo strtotime("yesterday"); // midnight
1281391200

echo strtotime("today"); // midnight
1281477600

echo strtotime("today, 1:30");
1281483000
1 голос
/ 11 августа 2010
something like:

$now = time();

$last_midnight = $now - ($now % (24*60*60));

if ($last_access >= $last_midnight)
{
 print "Today";
}    
elseif ($last_access >= ($last_midnight-(24*60*60))
{
 Print "Yesterday";
}
0 голосов
/ 11 апреля 2019
echo date("Y:m:d",strtotime("today"));
echo date("Y:m:d",strtotime("yesterday")); 
0 голосов
/ 11 апреля 2019
$today=new DateTime('now');
$yesterday=date($today,strtotime("-1 day"));
0 голосов
/ 31 января 2017

вот рабочая функция

    function minus_one_day($date){
      $date2 = formatDate4db($date);
      $date1 = str_replace('-', '/', $date2);
      $yesterday = date('Y-m-d',strtotime($date1 . "-1 days"));
      return $yesterday; }

надеюсь, что работа для вас ...

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