Для определения положении луны я использовал программу swisseph. Программа swisseph позволяет читать таблицу Эфемерид координат астрономических объектов. После того как разобрался с этой программой, нашел обертку на PHP для swetest.
composer req destinylab/swetest "dev-master"
Немного кода:
$date = new \DateTime();
$separator = ',';
$query = [
'b' => $date->format('d.m.Y'), // Дата на которую необходимо получить позицию планеты
'ut' => $date->format('H:i:s'), // Время
'p' => '1', // Информацию о какой планете надо получить. 1 - луна
'g' => $separator, // Разделитель значений
'e' => 'swe', // Использовать Швейцарскую таблицу Эфемерид
'f' => 'lsZ', // Какие значения необходимо получить. l - долгота, s - широта, Z - в каком знаке зодиака
'head' => '' // Исключить доп. инфу из ответа
];
// Команда будет выглядеть
// ./swetest -b10.02.2018 -ut16:17:20 -p1 -g, -eswe -flsZ -head
$swetest = new Swetest();
// Запрашиваем информацию, о каждой планете на новой строке.
$output = $swetest->query($query)->execute()->getOutput();
// $output[0] - так как луна на первой строке, и разделяем значение разделителем ','
$moon = explode($separator, trim($output[0]));
// $moon[0] - долгота "260.9579881"
// $moon[1] - широта " 11.8415737"
// $moon[2] - в каком знаке "20 sa 57'28.7572"
$zodiac = explode(' ', trim($moon[0]));
// $zodiac[0] - градус "21"
// $zodiac[1] - код знака зодиака "sa"
// $zodiac[2] - минуты и секунды "2'33.1771"
$zodiacCode = [
'ar' => 'в овне',
'aq' => 'в водолее',
'ge' => 'в близнецах',
'sa' => 'в стрельце',
'cp' => 'в козероге',
'vi' => 'в деве',
'pi' => 'в рыбах',
'sc' => 'в скорпионе',
'li' => 'в весах',
'cn' => 'в раке',
'ta' => 'в тельце',
'le' => 'во льве',
];
echo 'Луна в ' . $zodiacCode[$zodiac[1]];