Click here to Skip to main content
Click here to Skip to main content

C# Class for Calculating Sunrise and Sunset Times

By , 13 Sep 2008
 

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;

// 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

About the Author

Zacky Pickholz
CEO Homee
Israel Israel
Member
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).

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
QuestionLong, Lat and time offsetmembershaydr11 Feb '13 - 22:51 
QuestionTimezonesmemberamiller8810 Jan '13 - 4:50 
QuestionisSunset and isSunrisememberDNZ_at28 Dec '11 - 22:50 
GeneralEast/West Bugmembersorgal3 Mar '11 - 0:49 
QuestionWhat about elevation and twilight?memberMark Kestenbaum24 Feb '10 - 2:19 
GeneralKILLER BUG [modified]memberJools55726 Apr '09 - 13:09 
GeneralRe: KILLER BUGmemberZacky Pickholz5 May '09 - 22:54 
GeneralNice but one question [modified]memberRafone16 Mar '09 - 19:50 
GeneralRe: Nice but one questionmemberZacky Pickholz21 Apr '09 - 22:51 
GeneralRe: Nice but one questionmemberPIEBALDconsult22 Apr '09 - 4:13 
GeneralRe: Nice but one questionmemberRafone22 Apr '09 - 7:05 
GeneralRe: Nice but one questionmemberZacky Pickholz5 May '09 - 22:49 
GeneralRe: Nice but one questionmemberRafone6 May '09 - 2:46 
GeneralRe: Nice but one questionmemberZacky Pickholz6 May '09 - 10:29 
GeneralRe: Nice but one questionmemberRafone6 May '09 - 11:26 
GeneralRe: Nice but one questionmemberDeulis18 Dec '12 - 7:14 
QuestionWhy not static?memberPIEBALDconsult9 Jan '09 - 17:08 
AnswerRe: Why not static?memberZacky Pickholz21 Apr '09 - 22:41 
GeneralRe: Why not static?memberPIEBALDconsult22 Apr '09 - 4:02 
QuestionHow do I reference this in VB.Net?memberpmannino8 Jan '09 - 23:52 
AnswerRe: How do I reference this in VB.Net?memberZacky Pickholz21 Apr '09 - 22:43 
GeneralProblem getting sunrise and sunset to output.membernewb2vb4 Nov '08 - 5:05 
GeneralRe: Problem getting sunrise and sunset to output.memberMedlan4 Nov '08 - 5:52 
Generalerrormemberharrifer31 Oct '08 - 8:19 
GeneralRe: errormemberrsam_london31 Oct '08 - 15:19 
GeneralProblem with rounding the UtcOffsetmemberrsam_london29 Oct '08 - 17:11 
GeneralRe: Problem with rounding the UtcOffsetmemberRedFraggle4 Feb '12 - 0:46 
QuestionTwilight times?memberacasia29 Oct '08 - 13:07 
AnswerRe: Twilight times?memberKenv31 Oct '08 - 6:54 
AnswerRe: Twilight times?memberRafone16 Mar '09 - 20:26 
GeneralGreat code BUT ... need to fix ...memberon_your_62 Oct '08 - 14:33 
GeneralRe: Great code BUT ... need to fix ...memberZacky Pickholz7 Oct '08 - 1:17 
NewsRe: Great code BUT ... need to fix ...memberZacky Pickholz3 Mar '11 - 0:24 

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

Permalink | Advertise | Privacy | Mobile
Web03 | 2.6.130516.1 | Last Updated 13 Sep 2008
Article Copyright 2008 by Zacky Pickholz
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid