2016-04-19 4 views
0

Программа, которую я пытаюсь написать, достаточно проста, найдите разницу между двумя моментами: сегодняшняя и время, в которое пользователь регистрируется, в который помещается переменная сеанса.PHP Session variable - найти разницу во времени

переменных сессии

$_SESSION['loginTime']; 

устанавливается на текущую дату

$_SESSION['loginTime'] = date('Y-m-d H:i:s'); 

Когда пользователь выходит из продолжительности они были авторизованы найдено с помощью этого кода на отдельной странице:

if(isset($_SESSION['loginTime'])) 
{ 
    $logTime = $_SESSION['loginTime']; 

    $duration = strtotime(date('Y-m-d H:i:s')) - strtotime($logTime); 
    $duration = date('H:i:s', $duration); 

} 

Если бы я должен был войти в систему сейчас (22:15 19/04/2016) и оставаться в системе в течение 1 мин. 10 сек. R eturns 01:01:10. Я не могу понять, откуда приходит дополнительный час, все временные интервалы устанавливаются одинаково.

  • Минуты и секунды рассчитываются в порядке, но 1 час добавляют, казалось бы, без всякой причины

Спасибо за чтение! Любая помощь очень ценится!

+0

Какое значение временной метки unix '$ duration' перед запуском на нем функции' date'? – Martin

+0

@Martin Спасибо за ответ! Вы знаете какой-либо способ учета летнего времени? – ilumo

+0

есть [gmdate] (http://php.net/manual/en/function.gmdate.php) * если * это проблема с летним днем ​​ – Martin

ответ

4

Объект DateTime - ваш друг.

С PHP manual, простой пример выглядит следующим образом:

$datetime1 = new DateTime('2009-10-11'); 
$datetime2 = new DateTime('2009-10-13'); 
$interval = $datetime1->diff($datetime2); 
echo $interval->format('%R%a days'); 

Вы можете легко адаптировать свой код, чтобы что-то вроде этого:

if(isset($_SESSION['loginTime'])) 
{ 
    $logTime = new \DateTime($_SESSION['loginTime']); 
    $currentTime = new \DateTime('now'); 
    $interval = $logTime->diff($currentTime); 
    $duration = $interval->format('%H:%i:%s'); 
} 
echo $duration; 

Пример вывода:

15:48:57

+0

Это время ?! Я здесь слишком долго! Стреляй, я опаздываю !!! – Martin

0

Это не связано с DST. Это связано с часовыми поясами в целом. Разница между $logTime и now() обычно мала, как минуты в OP. Для date, который заканчивается 1 января 1970 года. Но 00:00 GMT - 01:00 в большинстве европейских материковых городов.

Быстрое исправление будет состоять в том, чтобы использовать gmdate() вместо date(), чтобы преобразовать разницу с секунд назад в формат H: i: s. Правильное решение - использовать объекты DateTime и функцию diff, чтобы получить DateInterval, как предложил Дэвид Уайли.

Смежные вопросы