This simple C# Singleton class calculates the sunrise and sunset times for a given date.
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
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 (
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++)
(32, 4, 0, SunTimes.LatitudeCoords.Direction.North),
(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).
- 14-Sep-2008: Uploaded the class implementation