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

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

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

$diff_date = gregoriantojd($date_1_mo, $date_1_dy, $date_1_yr) -
gregoriantojd($date_2_mo, $date_2_dy, $date_2_yr);
$diff_time = $date_1_hr * 3600 + $date_1_mn * 60 + $date_1_sc -
$date_2_hr * 3600 - $date_2_mn * 60 - $date_2_sc;
if ($diff_time < 0) {
$diff_date--;
$diff_time = 86400 - $diff_time;
}

Обсуждение
Определение разности на основе юлианского представления дат позволяет работать за пределами диапазона секунд эпохи UNIX, а также учитывать переход на летнее время.
Если компоненты двух дат находятся в массивах:

// 7:32:56 pm 10 мая 1965 года
list($date_1_yr, $date_1_mo, $date_1_dy, $date_1_hr, $date_1_mn, $date_1_sc)=
array(1965, 5, 10, 19, 32, 56);
// 4:29:11 am 20 ноября 1962 года
list($date_2_yr, $date_2_mo, $date_2_dy, $date_2_hr, $date_2_mn, $date_2_sc)=
array(1962, 11, 20, 4, 29, 11);
$diff_date = gregoriantojd($date_1_mo, $date_1_dy, $date_1_yr) -
gregoriantojd($date_2_mo, $date_2_dy, $date_2_yr);
$diff_time = $date_1_hr * 3600 + $date_1_mn * 60 + $date_1_sc -
$date_2_hr * 3600 - $date_2_mn * 60 - $date_2_sc;
if ($diff_time < 0) {
$diff_date--;
$diff_time = 86400 - $diff_time;
}
$diff_weeks = floor($diff_date/7); $diff_date -= $diff_weeks * 7;
$diff_hours = floor($diff_time/3600); $diff_time -= $diff_hours * 3600;
$diff_minutes = floor($diff_time/60); $diff_time -= $diff_minutes * 60;
print "The two dates have $diff_weeks weeks, $diff_date days, ";
print "$diff_hours hours, $diff_minutes minutes, and $diff_time ";
print "seconds between them.";
The two dates have 128 weeks, 6 days, 15 hours, 3 minutes,
and 45 seconds between them.

Это способ получения разности во времени по показаниям часов, поэтому результат на час превышает результат рецепта 3.5.


10 мая находится в пределах DST, а 11 ноября находится в пределах стандартного времени. Функция gregoriantojd() – часть модуля calendar и поэтому доступна, только если PHP собран с его поддержкой (версия для Windows имеет встроенную поддержку данного расширения).

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

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

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