Потребовалось мне как-то определить время охоты на обортней. Вроде логично - полнолуние. Полез я разыскивать, что такое полнолуние и понял, что понятие "полнолуние" - весьма непродолжительное. Всего-то мгновение. Причем не обязательно в нашей половине планеты будет ночь. Сначала хотел ограничить ночь полнолуния - от заката до рассвета в дату полнолуния. И тут я наступил на ещё один камень, оказывается ночь - не одна дата, а (внезапно) две. Потому решил привязаться к менее дискретному понятию - фазам луны. Итог, ночь полнолуния, когда фаза луны между 14.5 и 15.5 от заката до рассвета. И вот собственно PHP код для определения фазы луны.
function get_moon_phase_normalize( $v ){
$v = $v - floor( $v );
if($v < 0) {
$v = $v + 1;
}
return $v;
}
function get_moon_phase($timestamp){
$date = date("Y-m-d", $timestamp);
list($Y, $M, $D) = explode('-', $date);
$YY = $Y - floor(0.0 + (12 - $M) / 10);
$MM = ($M + 9)%12;
$K1 = floor(365.25 * ($YY + 4712));
$K2 = floor(30.6 * $MM + 0.5);
$K3 = floor(floor(($YY / 100) + 49) * 0.75) - 38;
$JD = $K1 + $K2 + $D + 59;
if($JD > 2299160)
$JD = $JD - $K3;
$IP = get_moon_phase_normalize(($JD - 2451550.1) / 29.530588853);
$AG = $IP*29.53;
return $AG;
}
Алгоритм взят с http://blogs.msdn.com/b/rucoding4fun/archive/2009/09/07/arduino.aspx
function get_moon_phase_normalize( $v ){
$v = $v - floor( $v );
if($v < 0) {
$v = $v + 1;
}
return $v;
}
function get_moon_phase($timestamp){
$date = date("Y-m-d", $timestamp);
list($Y, $M, $D) = explode('-', $date);
$YY = $Y - floor(0.0 + (12 - $M) / 10);
$MM = ($M + 9)%12;
$K1 = floor(365.25 * ($YY + 4712));
$K2 = floor(30.6 * $MM + 0.5);
$K3 = floor(floor(($YY / 100) + 49) * 0.75) - 38;
$JD = $K1 + $K2 + $D + 59;
if($JD > 2299160)
$JD = $JD - $K3;
$IP = get_moon_phase_normalize(($JD - 2451550.1) / 29.530588853);
$AG = $IP*29.53;
return $AG;
}
Алгоритм взят с http://blogs.msdn.com/b/rucoding4fun/archive/2009/09/07/arduino.aspx
4 комментария:
Если я правильно понял, то полнолуние, когда значение между 14.5 и 15.5
Но если рассмотреть на примере августа 2010 года, то этот скрипт дает дату полнолуния 13-14 августа.
А на самом деле полнолуние будет 24 Августа
Вот попробовал вызвать
> php -r 'require_once("lib/common.php"); echo get_moon_phase(strtotime("24 aug 2010 23:00:00"));'; echo;
14.3925732569
Вы правильно используете функцию?
Что это за функция normalize ?
Ни в одной из версий PHP такой функции НЕТ ...
И алгоритм дает существенные сбои,-
полнолуние в августе 2010 было таки 24,
а Ваш результат, 14 - это первая четверть.
И, если уж говорить о Полнолунии, то
это не между 14.5 и 15.5, а между 14,265 и 15,265
Валерий, действительно под normalize понималась get_moon_phase_normalize. Поправил код. Спасибо.
Откуда значения 14,265 и 15,265?
Отправить комментарий