Я пишу функцию time Since для возврата времени, прошедшего с заданного mysql datetime. При использовании $ oldtime из current time () он возвращает отрицательное int, когда мне нужно положительное int. Раньше я писал аналогичные функции на других языках, но я не заметил этой проблемы, поэтому любая помощь будет очень признательна.

function timeSince($time){
        $today = date("Y");
        $oldtime = strtotime($time);
        $time = time() - $oldtime;
        $tokens = array (
            3600 => 'h',
            60 => 'm',
            1 => 's'
        );

        if($time >= 86400){
        }
    }

echo timeSince('2016-02-25 14:35:00');
1
user2784408 25 Фев 2016 в 21:25

3 ответа

Лучший ответ

strtotime использует часовой пояс в настройках PHP. В зависимости от установленного часового пояса он может конвертироваться во время, которое еще не произошло. Например, на моем украинском сервере strtotime('2016-02-25 14:35:00') преобразуется в 1456403700, на сервере в другом часовом поясе (США / Тихоокеанский регион) он преобразуется в 1456439700.

Цитата из документов PHP:

Функция ожидает получить строку, содержащую английский формат даты, и попытается преобразовать этот формат в метку времени Unix (количество секунд с 00:00:00 UTC 1 января 1970 года) относительно метки времени, указанной в now, или текущее время, если сейчас не указано.

Каждый параметр этой функции использует часовой пояс по умолчанию, если часовой пояс не указан в этом параметре. Будьте осторожны, не используйте разные часовые пояса в каждом параметре, если это не предусмотрено. См. Date_default_timezone_get () о различных способах определения часового пояса по умолчанию.

Вы можете добавить смещение UTC / GMT к дате и времени (1-й параметр), например strtotime('2016-02-25 14:35:00 +0800') или ('2016-02-25 14:35:00 GMT+08:00') преобразуется в 1456382100

2
Community 20 Июн 2020 в 09:12

В вашем примере $oldtime должно быть меньше текущего значения time().

Итак, если вы хотите посчитать время между большим значением, просто переверните уравнение:

Эта строка: $time = time() - $oldtime;

Становится: $time = $oldtime - time();

0
Patrick Moore 25 Фев 2016 в 18:31

Было бы намного удобнее, если бы вы использовали классы PHP DateTime и DateInterval и их методы:

function timeSince($datetime) {
    $now        = strtotime("now");
    $then       = strtotime($datetime);
    $dt_now     = new DateTime("@" . $now);
    $dt_then    = new DateTime("@" . $then);

    //DateTime's diff method returns a DateInterval object which got a format method:
    return $dt_now->diff($dt_then)->format('%a days, %h hours, %i minutes and %s seconds');
}


некоторые тестовые примеры:

//my local date & time is around "2016-02-25 19:49:00" when testing
echo '<pre>';

echo timeSince('2016-02-25 19:30:00');
//0 days, 0 hours, 19 minutes and 11 seconds
echo PHP_EOL;

echo timeSince('2013-11-02 15:43:12'); 
//845 days, 4 hours, 4 minutes and 3 seconds
echo PHP_EOL;

echo timeSince('2017-01-31 00:22:45'); 
//340 days, 4 hours, 35 minutes and 30 seconds
echo PHP_EOL;

echo timeSince('1950-05-14 07:10:05');
//24028 days, 12 hours, 37 minutes and 10 seconds
echo PHP_EOL;


код, частично основанный на этом ответе: https://stackoverflow.com/a/19680778/3391783

3
Community 23 Май 2017 в 12:07