Click here to Skip to main content
15,890,506 members
Articles / Desktop Programming / Win32
Article

C# Class for Calculating Sunrise and Sunset Times

Rate me:
Please Sign up or sign in to vote.
4.28/5 (18 votes)
13 Sep 2008Public Domain1 min read 155.1K   4.8K   43   36
A class for calculating sunrise and sunset times, implemented as a thread-safe Singleton

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:

C#
...

DateTime date = DateTime.Today;
bool isSunrise = false;
bool isSunset = false;
DateTime sunrise = DateTime.Now;
DateTime sunset = DateTime.Now;

// Print out the Sunrise and Sunset times for the next 20 days
for (int i=0; i<20; i++)
{
                                                // Coordinates of Tel-Aviv
     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); // Move to the next day
}

...

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

License

This article, along with any associated source code and files, is licensed under A Public Domain dedication


Written By
CEO Homee
Israel Israel
With 15 years of experience in the IT/High-Tech industry, as developer, team-leader and product manager.

Fields of expertise include: Networks, Security, Gaming, Embedded/Real Time and Web applications.

I have written many applications, both in structural languages (C, Pascal, Fortran, VB) and OO languages (C++, C#, J2SE/J2EE) as well as in scripting/interpreted/web languages (HTML, JavaScript, LUA Script, PHP, VBScript).

Today, Co-Founder and CEO of Robo Smart Solutions (www.robo.co.il).

Comments and Discussions

 
GeneralProblem getting sunrise and sunset to output. Pin
newb2vb4-Nov-08 5:05
newb2vb4-Nov-08 5:05 
GeneralRe: Problem getting sunrise and sunset to output. Pin
Medlan4-Nov-08 5:52
Medlan4-Nov-08 5:52 
Generalerror Pin
harrifer31-Oct-08 8:19
harrifer31-Oct-08 8:19 
GeneralRe: error Pin
rsam_london31-Oct-08 15:19
rsam_london31-Oct-08 15:19 
GeneralProblem with rounding the UtcOffset Pin
rsam_london29-Oct-08 17:11
rsam_london29-Oct-08 17:11 
GeneralRe: Problem with rounding the UtcOffset Pin
RedFraggle4-Feb-12 0:46
RedFraggle4-Feb-12 0:46 
QuestionTwilight times? Pin
acasia29-Oct-08 13:07
acasia29-Oct-08 13:07 
AnswerRe: Twilight times? Pin
Kenv31-Oct-08 6:54
Kenv31-Oct-08 6:54 
AnswerRe: Twilight times? Pin
Rafone16-Mar-09 20:26
Rafone16-Mar-09 20:26 
GeneralGreat code BUT ... need to fix ... Pin
on_your_62-Oct-08 14:33
on_your_62-Oct-08 14:33 
GeneralRe: Great code BUT ... need to fix ... Pin
Zacky Pickholz7-Oct-08 1:17
Zacky Pickholz7-Oct-08 1:17 
NewsRe: Great code BUT ... need to fix ... Pin
Zacky Pickholz3-Mar-11 0:24
Zacky Pickholz3-Mar-11 0:24 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.