Определение разности между двумя датами

Задача
Необходимо определить время, прошедшее между двумя датами. Например, надо сообщить пользователю, сколько прошло времени с момента его последней регистрации на вашем сайте.

Решение
Преобразуйте обе даты в метки времени и вычтите одну из другой. Приведенный ниже код позволяет выделить из результата недели, дни, часы, минуты и секунды:

// 7:32:56 pm 10 мая 1965 года
$epoch_1 = mktime(19,32,56,5,10,1965);
// 4:29:11 am 20 ноября 1962 года
$epoch_2 = mktime(4,29,11,11,20,1962);
$diff_seconds = $epoch_1 - $epoch_2;
$diff_weeks = floor($diff_seconds/604800);
$diff_seconds -= $diff_weeks * 604800;
$diff_days = floor($diff_seconds/86400);
$diff_seconds -= $diff_days * 86400;
$diff_hours = floor($diff_seconds/3600);
$diff_seconds -= $diff_hours * 3600;
$diff_minutes = floor($diff_seconds/60);
$diff_seconds -= $diff_minutes * 60;
print "The two dates have $diff_weeks weeks, $diff_days days, ";
print "$diff_hours hours, $diff_minutes minutes, and $diff_seconds ";
print "seconds elapsed between them.";
The two dates have 128 weeks, 6 days, 14 hours, 3 minutes,
and 45 seconds elapsed between them.

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


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

Обсуждение
В данном случае происходят кое-какие странные вещи, которые необходимо осмыслить. Во-первых, 1962 и 1965 годы предшествуют началу эпохи. К счастью, функция mktime() сбоит элегантно и для каждого года вырабатывает отрицательную метку времени. Это устраивает нас, поскольку необходимо не абсолютное значение каждой из сомнительных меток времени, а только разность между ними. До тех пор пока значения меток времени попадают в допустимый диапазон целого со знаком, их разность вычисляется правильно. Во-вторых, настенные часы (или календарь) покажут немного другую разность во времени между этими двумя датами, поскольку они находятся по разные стороны от момента перехода на летнее время. Результат вычитания меток времени отражает правильное количество прошедшего времени, но изменение времени, воспринимаемое человеком, на час меньше. Например, какова разница между 1:30 A.M. and 4:30 A.M. апрельским воскресным утром, когда вступает в силу летнее время? Нам кажется, что 3 часа, но эти метки времени разделяет лишь 7200 секунд, то есть два часа.


Когда местные часы переводятся на один час вперед (или на час назад в октябре), то равномерный ход меток времени не принимается во внимание. В действительности прошло только два часа, хотя в результате наших манипуляций с часами это выглядит как три.

Если необходимо определить реально прошедшее время (как обычно бывает), то данный метод подходит. Если вас больше интересует разность показаний часов между двумя моментами времени, то для подсчета интервала следует опираться на юлианское представление дат. Чтобы сообщить пользователю о времени, прошедшем с его последне регистрации, необходимо определить разность между временем текущей регистрации и временем его последней регистрации:

$epoch_1 = time();
$r = mysql_query("SELECT UNIX_TIMESTAMP(last_login) AS login
FROM user WHERE id = $id") or die();
$ob = mysql_fetch_object($r);
$epoch_2 = $ob->login;
$diff_seconds = $epoch_1 - $epoch_2;
$diff_weeks = floor($diff_seconds/604800);
$diff_seconds -= $diff_weeks * 604800;
$diff_days = floor($diff_seconds/86400);
$diff_seconds -= $diff_days * 86400;
$diff_hours = floor($diff_seconds/3600);
$diff_seconds -= $diff_hours * 3600;
$diff_minutes = floor($diff_seconds/60);
$diff_seconds -= $diff_minutes * 60;
print "You last logged in $diff_weeks weeks, $diff_days days, ";
print "$diff_hours hours, $diff_minutes minutes, and $diff_seconds ago.";

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Вывод на печать даты и времени в определенном формате
Выделение дат и времен из строк
Выработка высокоточного времени
Определение дня недели, месяца, года или номера недели в году
Определение разности между датами юлианского календаря

Вернуться в раздел: PHP / 3. Дата и время