Click here to Skip to main content
15,900,468 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.4K   4.9K   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

 
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 
Thanks for the input on-your-6!

I believe your first line comment is correct (i.e. DateTime date = DateTime.Now), but the other two lines are irrelevant (these are output params, doesn't matter what value you hold in them initially).

In any case this is only a fix to the example usage, but the engine it working perfectly as far as I know.

Thanks again Laugh | :laugh:

Zacky.
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.