Я долгое время искал эту проблему. Я думаю, что я слишком стараюсь и бегаю по кругу.Алгоритм расчета ночных часов лунного света
Проблеме
мне нужно вычислить часы лунных в ночное время, т.е. количества времени Луны над горизонтом вне часов дневного света. Известны времена восхода/захода солнца и лунного восхода/луны в UTC на заданную дату. Самый простой сценарий (hypthetical) заключается в следующем:
sunrise: 06:45
sunset: 18:20
moonrise: 02:30
moonset: 19:50
алгоритма для расчета лунных часов будет:
if(moonrise<sunset && sunrise<moonset) {
moonlighthours = (sunrise-moonrise)-(moonset-sunset);
}
Столь же легко:
sunrise: 06:45
sunset: 18:20
moonrise: 10:30
moonset: 19:50
if(moonrise>sunset && sunrise<moonset) {
moonlighthours = (moonset-sunset);
}
Но, как мы имеем дело с UTC он может стать довольно сложным в зависимости от часового пояса, поскольку восход/установка и время восхода/захода могут быть растянуты на три разные даты:
sunrise: 2014-02-05 23:30
sunset: 2014-02-06 12:20
moonrise: 2014-02-06 11:00
moonset: 2014-03-07 00:50
Так рассчитать лунные часы для 2014-02-06 Я хотел бы попробовать что-то свернутое, как это:
if(sunrise<midnight) { sunrise = midnight; }
if(sunset>midnight+24) { sunset = midnight+24; }
if(moonrise<midnight) { moonrise = midnight; }
if(moonset>midnight+24) { moonset = midnight+24 }
if(moonrise<sunset && sunrise<moonset) {
moonlighthours = (sunrise-moonrise)-(moonset-sunset);
} else if (moonrise>sunset && sunrise<moonset) {
moonlighthours = (moonset-sunset);
} else if (moonrise<sunset && sunrise>moonset) {
moonlighthours = (sunrise-moonrise);
} else {
moonlighthours=0;
}
Попытку охватить все возможные сценарии в результате фазового сдвига между лунными и дневными часами использование структур if... else
- кошмар. Поэтому я надеюсь, что есть кто-то со свежим решением проблемы. Любая помощь будет принята с благодарностью.
EDIT
Вот решение, которое я придумал на основе предложений @Ilmari Karonen
«s. Это Расчитайте лунными часов в течение заданного календарной даты (с использованием синтаксиса PHP):
$mid00 = midnight; // unixtimestamp , e.g. 1391558400 (2014-02-05 00:00:00)
$mid24 = midnight+86399; // 1399075199 (2014-02-05 23:59:59)
$mr = moonrise;
$ms = moonset;
$sr = sunrise;
$ss = sunset;
$mr = $mr < $mid00 ? $mid00 : $mr;
$ms = $ms > $mid24 ? $mid24 : $ms;
$sr = $sr < $mid00 ? $mid00 : $sr;
$ss = $ss > $mid24 ? $Mid24 : $ss;
$ml_morn = 0; // moonlight hours during morning night
$ml_even = 0; // moonlight hours during evening night
if($ms > $mr) { // moon set later than moon rise
$ml_morn = $mr < $sr ? $sr-$mr : 0; // moon rises before sunrise?
$ml_even = $ms > $ss ? $ms-$ss : 0; // moon sets after sunset?
} else { // moon set before moon rise
$ml_even = $mr > $ss ? $mid24-$mr : $mid24 - $ss; // moon rises before sunset?
$ml_morn = $ms < $sr ? $ms-$mid00 : $sr - $mid00; // moon sets before sunrise?
}
moonlight_hours = $ml_morn = $ml_even;
Лунный свет? – bonCodigo
??? -Я этого не понимаю. – Tomm
До сегодняшнего дня я знал только летнее время ... думал, что Солнце всегда было важным, по сравнению с редко встречающимися кругами Луны, когда-то 28 дней ..;) – bonCodigo