Преобразование стандартной даты в текущее время в часах / минутах/

#php #variables #date #time

#php #переменные #Дата #время

Вопрос:

Допустим, у меня есть функция даты, которая выдает

вывод: 2011-10-03

PHP:

 $todayDt = date('Y-m-d');
  

В любом случае, чтобы вместо этого показать эту дату 2 days 1 hour ago

Комментарии:

1. date_diff nz.php.net/manual/en/function.date-diff.php

2. Вы можете использовать DateTime::diff и [DateInterval](php.net/manual/class.dateinterval.php ).

3. Был бы признателен за пример с использованием моего кода

4. Просто для пояснения, как вы получаете 1 час из предоставленных вами данных? Ни вывод вашей функции, ни ваш пример вызова date для получения сегодняшней даты не обеспечивают достаточной точности для получения результата, включающего часы.

5. Php должен иметь возможность вычислять это … исходя из текущей даты и времени на сервере… верно?

Ответ №1:

Эта функция может быть полезна. Возможно, вы захотите немного уточнить проверку на месяцы, но это всего лишь краткий пример:

 function RelativeTime($iTimestamp, $iLevel = 2)
{
    !ctype_digit($iTimestamp)
        amp;amp; $iTimestamp = strtotime($iTimestamp);

    $iSecondsInADay = 86400;
    $aDisplay = array();

    // Start at the largest denominator
    $iDiff = time() - $iTimestamp;
    $aPeriods = array(
        array('Period'  => $iSecondsInADay * 356,   'Label'   => 'year'),
        array('Period'  => $iSecondsInADay * 31,    'Label'   => 'month'),
        array('Period'  => $iSecondsInADay,         'Label'   => 'day'),
        array('Period'  => 3600,                    'Label'   => 'hour'),
        array('Period'  => 60,                      'Label'   => 'minute'),
        array('Period'  => 1,                       'Label'   => 'second'),
    );

    foreach ($aPeriods as $aPeriod)
    {
        $iCount = floor($iDiff / $aPeriod['Period']);
        if ($iCount > 0)
        {
            $aDisplay[] = $iCount . ' ' . $aPeriod['Label'] . ($iCount > 1 ? 's' : '');
            $iDiff -= $iCount * $aPeriod['Period'];
        }
    }

    $iRange = count($aDisplay) > $iLevel
                ? $iLevel
                : count($aDisplay);
    return implode(' ', array_slice($aDisplay, 0, $iRange)) . ' ago';
}
  

И некоторые примеры использования:

 echo RelativeTime(time() - 102, 1);
// Will output: 1 minute ago

echo RelativeTime(time() - 2002);
// Will output: 33 minutes 22 seconds ago

echo RelativeTime(time() - 100002002, 6);
// Will output: 3 years 2 months 27 days 10 hours 20 minutes 2 seconds ago

echo RelativeTime('2011-09-05');
// Will output: 30 days 22 hours ago
  

Комментарии:

1. Спасибо за это! Можете ли вы объяснить, что RelativeTime(time() - 100002002, 6); делает echo

2. RelativeTime(time() - 100002002, 6); принимает указанную временную метку (которая сейчас равна — 100002002 секундам) и создает метку. Число 6 указывает требуемый уровень детализации (6 уровней детализации означают, что вы получаете, начиная с самой большой единицы измерения даты, 6 уровней детализации: год, месяц, день, час, минуты, секунды. Если бы вы указали только 2, вы получили бы только год, месяц).

3. С меньшей разницей во времени… как и time() — 102 секунды, вы получите только минуты и секунды. Если вы укажете уровень детализации 1, вы получите только минуты.

4. О, и, наконец, вы тоже можете это сделать: RelativeTime('2011-09-05'); что даст вам 30 days 22 hours ago

5. проблема с вышесказанным заключается в том, что если это было меньше, чем через день, значение не выводится. Это дает вам 2 назад, а не, например, 2 часа или 2 минуты…

Ответ №2:

Это сообщение предназначено только для решения, которое не использует DateTime::diff метод. Он также использует входные данные с большей точностью, так что имейте это в виду.

 $now = date('Y-m-d H:i:s');
$then = '2011-10-03 00:00:00';  // This will calculate the difference 
                                // between now and midnight October 3rd
$nowTime = strtotime($now);
$thenTime = strtotime($then);

$diff = $nowTime - $thenTime;

$secs = $diff % 60;
$diff = intval($diff / 60);
$minutes = $diff % 60;
$diff = intval($diff / 60);
$hours = $diff % 24;
$diff = intval($diff / 24);
$days = $diff;


echo($days . ' days ' . $hours . ' hours ' . $minutes . ' minutes ' . $secs . ' seconds ago');
  

На данный момент, когда я его тестировал, результат был:

2 дня 16 часов 6 минут 2 секунды назад

Если все, что вам нужно, это дни и часы, то вы можете просто выбрать повторение этих двух:

 echo($days . ' days ' . $hours . ' hours ago');
  

2 дня 16 часов назад