Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

Функция 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.

Это способ получения разности во времени по показаниям часов, поэтому результат на час превышает результат предыдущего рецепта. 10 мая находится в пределах DST, а 11 ноября находится в пределах стандартного времени.

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

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ