#!/usr/bin/perl -w use strict; use Time::Local; use constant PERIOD => 29.530588853; use constant OFFSET => 0; sub moon_age($) { my ($t) = @_; my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = gmtime($t); my $days = $year * 365 + int(($year - 1) / 4) - int(($year - 1) / 100) + int(($year - 1 + 1900) / 400) - 4 + $yday; $days += $hour / 24.0 + $min / (24.0 * 60.0) + $sec / (24.0 * 60.0 * 60.0); my $phase = $days + OFFSET; $phase -= int($phase / PERIOD) * PERIOD; printf '%04d-%02d-%02d %02d:%02d:%02d days = %d, phase = %.10f'."\n", $year + 1900, $mon + 1, $mday, $hour, $min, $sec, $days, $phase; } moon_age(timelocal(0, 0, 0, 1, 1 - 1, 1900)); moon_age(timelocal(0, 0, 0, 11, 8 - 1, 1999 - 1900)); moon_age(timelocal(0, 16, 11, 28, 1 - 1, 2021 - 1900)); moon_age(timelocal(0, 17, 0, 27, 2 - 1, 2021 - 1900)); moon_age(timelocal(0, 48, 11, 28, 3 - 1, 2021 - 1900)); moon_age(timelocal(0, 31, 20, 26, 4 - 1, 2021 - 1900)); moon_age(timelocal(0, 35, 20, 18, 12 - 1, 2021 - 1900)); moon_age(time);