<?php
function moon($time = null, $mps = 2551443) {
$time = is_null($time) ? 0 : (time() - $time);
$first_moon = time()-mktime(0, 0, 0, 0, 0, 1923); // first moon (1923)
date_default_timezone_set("UTC");
return [
'date' => date_create_from_format('U', time()-$time)->format('Y-m-d H:i:s'),
'lunation' => ($first_moon-$time)/$mps,
'phase' => ($time - $mps * intval($time / $mps)) / $mps
];
}
$mps = 2551443; // moon phase in seconds (29 days, 12 hours, 44 mins, 3 secs)
$test = function () use ($mps) {
$begin = new DateTime('2001-01-24');
$end = new DateTime('2004-12-12');
$dtia = date_create_from_format('U', 0);
$dtib = date_create_from_format('U', $mps);
$interval = new DateInterval('P'.$dtia->diff($dtib)->format('%aDT%hH%iM%sS'));
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
yield moon($date->format('U'));
}
};
foreach ($test() as $result) {
print_r($result);
}
preferences:
27.23 ms | 402 KiB | 5 Q