Introduction
This simple C# Singleton class calculates the sunrise and sunset times for a given date.
Background
After searching for a simple and decent implementation for calculating sunrise and sunset times for given dates, and trying several implementations that were either too complicated to migrate to C# or simply not working, I found a simple yet working JavaScript implementation here.
I migrated the code to C#, tweaking it a little so that it provides accurate calculations. Also, I wrapped it as a Singleton class (assuming multiple instances would not be required for such a class) and added a lock to the main calculation method, in order to make it thread safe (via blocking).
Using the Code
The singleton class SunTimes
can be called from anywhere in your code by calling SunTimes.Instance
.
The class contains a single method, with one overload, named CalculateSunRiseSetTimes()
. You simply call this method, provide it with three input parameters: latitude and longitude of the desired location, and date for which to calculate. Moreover, you need to pass it four (4) output (ref
) parameters: riseTime
(sunrise time), setTime
(sunset time), isSunrise
(does the sun rise that day at all?) and isSunset
(does the sun set that day at all?).
The method returns a boolean value if the calculation succeeds (it will fail, if the time zone and longitude are incompatible).
Here is a sample usage of the class:
...
DateTime date = DateTime.Today;
bool isSunrise = false;
bool isSunset = false;
DateTime sunrise = DateTime.Now;
DateTime sunset = DateTime.Now;
for (int i=0; i<20; i++)
{
SunTimes.Instance.CalculateSunRiseSetTimes(new SunTimes.LatitudeCoords
(32, 4, 0, SunTimes.LatitudeCoords.Direction.North),
new SunTimes.LongitudeCoords
(34, 46, 0, SunTimes.LongitudeCoords.Direction.East),
date, ref sunrise, ref sunset,
ref isSunrise, ref isSunset);
Debug.Print(date + '': Sunrise @'' + sunrise.ToString('HH:mm') + ''
Sunset @'' + sunset.ToString(''HH:mm''));
date = date.AddDays(1);
}
...
Points of Interest
This implementation is not in particular fancy, not is it the slickest design, but hey - it does the work (at least as far as I've tested it). I will be happy to get any comments (not on its design, please, only if you detect any actual bugs).
History
- 14-Sep-2008: Uploaded the class implementation