The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.


DateTime::Util::Astro::Moon - Functions To Calculate Lunar Data


 use DateTime::Util::Astro::Moon 
       qw(nth_new_moon lunar_phase lunar_longitude);

 my $dt        = nth_new_moon(24773); # should be 2003/12/23 UTC
 my $phase     = lunar_phase($dt);
 my $longitude = lunar_longitude($dt);


This module provides functions to calculate lunar data, but its main focus is to provide just enough functionality that allows us to create lunisolar calendars and other DateTime related modules.

This module is a *straight* port from "Calendrical Calculations" [1] -- and therefore there are places where things can probably be "fixed" so that they look more like Perl, as well as places where we could leverage the DateTime functionalities better. If you see things that doesn't quite look right (in Perl), that's probably because of that.

Notes On Accuracy

Before you use this module, please be aware that this module was originally created solely for the purpose of creating a lunisolar calendar for the DateTime project (

We used [1] as basis for our calculations. While for most purposes the results are accurate enough, you should note that the calculations from this book are approximations.

Obviously we would like to make this module as good as possible, but there's only so much you can do in the accuracy department. However, having GMP and Math::BigInt::GMP may help a little bit.

This module by default uses Perl's arbitrary precision calculation module Math::BigFloat. However, this adds a fair amount of overhead, and you will see a noticeable difference in execution speed. This is true even if you use GMP.

Caching Results

DateTime::Util::Astro::Moon can use Cache::MemoryCache to cache results of certain functions.

This is always turned on. For example, nth_new_moon() is basically a constant function for the given n, and therefore should not need to recalculate values ever again.

DateTime::Util::Astro::Moon uses Cache::Cache for its cache intetface, and by defaults to using Cache::MemoryCache. If you would like to use a different type of cache, or tweak its behavior, you can either assign or call methods on this cache object:

  my $cache = DateTime::Util::Astro::Moon->cache();

For example, if you want to forcibly expire this cache, do this:


Or for maximum efficiency, you could use a FileCache with EXPIRES_NEVER set on (new moons don't change from for a given $n, so it's safe to do this -- however, you probably want to clear it when you upgrade this module)

      namespace => 'MoonCache',
      default_expires_in => $Cache::Cache::EXPIRES_NEVER



The mean time between new moons



Given a DateTime object $dt, calculates the lunar longitude.


Given a DateTime object $dt, calculates the lunar phase (in degrees)


Given an integer $n, returns a DateTime object representing the moment of $n-th new moon after R.D. 0. The 0th new moon was on January 11, 1 (Gregorian)


Copyright (c) 2004-2007 Daisuke Maki <>


  [1] Edward M. Reingold, Nachum Dershowitz
      "Calendrical Calculations (Millenium Edition)", 2nd ed.
       Cambridge University Press, Cambridge, UK 2002


DateTime DateTime::Event::Lunar DateTime::Event::SolarTerm DateTime::Util::Astro::Common DateTime::Util::Astro::Sun