Определение разности между датами юлианского календаря при помощи языка программирования 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 имеет встроенную поддержку данного расширения).
Комментарии:
Комментариев нет
|
|
|