kip
Astro - astronomy calculations (sunrise, sunset, moonrise, moonset, moon phase equinox, solstice, ...)
Please say hi to a new lib, Astro that aims to deliver easy-to-consume astronomy calculations of practical use. For now it only calculates sunrise and sunset. In testing its precision is within 1 minute of the results returns from DateAndTime.com.
It makes use of tz_world to dereference geo coordinates to a timezone and tzdata for time zone conversions.
This lib started our as a requirement to support certain solar, lunar and lunisolar calendars but it has wider applicability.
Examples
# Sunrise in Sydney on December 4th
iex> Astro.sunrise({151.20666584, -33.8559799094}, ~D[2019-12-04])
{:ok, #DateTime<2019-12-04 05:37:00.000000+11:00 AEDT Australia/Sydney>}
# Sunset in Sydney on December 4th
iex> Astro.sunset({151.20666584, -33.8559799094}, ~D[2019-12-04])
{:ok, #DateTime<2019-12-04 19:53:00.000000+11:00 AEDT Australia/Sydney>}
# Sunset in the town of Alert in Nunavut, Canada
# ...doesn't exist since there is no sunset in summer
iex> Astro.sunset({-62.3481, 82.5018}, ~D[2019-07-01])
{:error, :no_time}
# ...or sunrise in winter
iex> Astro.sunrise({-62.3481, 82.5018}, ~D[2019-12-04])
{:error, :no_time}
Next steps (as of 0.5.0)
- Sunrise
- Sunset
- Solstice
- Equinox
- Moon phase
- Moon rise
- Moon set
Most Liked
kip
A small update resulting in Astro version 0.9.0 that adds Astro.lunar_phase_emoji/1 to return the phase of the moon as an emoji. For example:
iex> Astro.lunar_phase_emoji 0
"π"
iex> Astro.lunar_phase_emoji 45
"π"
iex> Astro.lunar_phase_emoji 90
"π"
iex> Astro.lunar_phase_emoji 135
"π"
iex> Astro.lunar_phase_emoji 180
"π"
iex> Astro.lunar_phase_emoji 245
"π"
iex> Astro.lunar_phase_emoji 270
"π"
iex> Astro.lunar_phase_emoji 320
"π"
iex> Astro.lunar_phase_emoji 360
"π"
iex> ~U[2021-08-22 12:01:02.170362Z]
...> |> Astro.lunar_phase_at()
...> |> Astro.lunar_phase_emoji()
"π"
kip
Iβve released Astro 1.0 almost exactly a year after the last published version. This indicates API stability for existing functions (stable in most cases for at least 3 years). There is only one new function in this release:
Enhancements
-
Release 1.0. This library was started four years ago and the public API has been stable for at least three of those years.
-
Adds
Astro.sun_azimuth_altitude/2. Thanks to @kimlai for the suggestion. Closes #3.
kip
Astro version 0.6.0 is now out. This version avoids requiring some dependencies which makes the footprint smaller and compilation much faster. I have been using it to support the upcoming Chinese calendar with all tests passing so I consider the basic solar and lunar algorithms to be in solid shape.
Please note that Elixir 1.11 or later is required.
Roadmap
Roadmap to version 1.0 is to add Astro.moonrise/2 and Astro.moonset/2.
Additional development proposals or suggestions are very welcome.
Bug Fixes
-
Fix
Astro.Math.atan_r/2 -
Fix
Astro.Earth.ephemeris/1
Breaking changes
- Change
Astro.Time.date_time_{from, to}_iso_days/1toAstro.Time.date_time_{from, to}_moment/1
Enhancements
-
Remove dependency on
ex_cldr_calendarandjason -
Add
Astro.sun_position_at/1which is a public API for returning the right ascension, declination and radius (distance to the sun) at a given date/time. -
Add
Astro.moon_position_at/1which is a public API for returning the right ascension, declination and radius (distance to the moon) at a given date/time. -
Add
Astro.illuminated_fraction_of_moon_at/1to return the fraction of the moon that is lit at a given date/time.
kip
Astro version 0.5.0 is now out. The release adds functions that calculate the phase of the moon which, apart from anything else, is needed to calculate the Chinese calendar. Please note that Elixir 1.11 or later is required.
Bug Fixes
-
Updates documentation to be clear about installation and setup requirements for
tz_world -
Fixes test data for SΓ£o Paulo now that it no longer uses DST
-
Ensure
:astrois started in test mode
Enhancements
This primary focus of this release is to add lunar calculations for moon phase.
-
Adds
Astro.date_time_new_moon_before/1 -
Adds
Astro.date_time_new_moon_at_or_after/1 -
Adds
Astro.lunar_phase_at/1 -
Adds
Astro.date_time_lunar_phase_at_or_before/2 -
Adds
Astro.date_time_lunar_phase_at_or_after/2
kip
New version 0.2.0 is now out:
Enhancements
-
Add
Astro.equinox/2andAstro.solstice/2to calculate solstices and equinoxes for a year. From these can be derived the seasons. -
Add
Astro.Time.datetime_from_julian_days/1 -
Add
Astro.Time.utc_datetime_from_terrestrial_datetime/1
Now on to lunar calculations (phase, moonrise, moonset)β¦ And to implement the Persian calendar (which is a Solar based calendar).







