Click here to Skip to main content
Licence Public Domain
First Posted 13 Sep 2008
Views 39,119
Downloads 529
Bookmarked 31 times

C# Class for Calculating Sunrise and Sunset Times

By Zacky Pickholz | 13 Sep 2008
A class for calculating sunrise and sunset times, implemented as a thread-safe Singleton
1 vote, 11.1%
1

2
1 vote, 11.1%
3
2 votes, 22.2%
4
5 votes, 55.6%
5
4.07/5 - 9 votes
μ 4.07, σa 2.39 [?]

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

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionisSunset and isSunrise PinmemberDNZ_at23:50 28 Dec '11  
GeneralEast/West Bug Pinmembersorgal1:49 3 Mar '11  
QuestionWhat about elevation and twilight? PinmemberMark Kestenbaum3:19 24 Feb '10  
GeneralKILLER BUG [modified] PinmemberJools55714:09 26 Apr '09  
GeneralRe: KILLER BUG PinmemberZacky Pickholz23:54 5 May '09  
GeneralNice but one question [modified] PinmemberRafone20:50 16 Mar '09  
GeneralRe: Nice but one question PinmemberZacky Pickholz23:51 21 Apr '09  
GeneralRe: Nice but one question PinmemberPIEBALDconsult5:13 22 Apr '09  
GeneralRe: Nice but one question PinmemberRafone8:05 22 Apr '09  
GeneralRe: Nice but one question PinmemberZacky Pickholz23:49 5 May '09  
GeneralRe: Nice but one question PinmemberRafone3:46 6 May '09  
GeneralRe: Nice but one question PinmemberZacky Pickholz11:29 6 May '09  
GeneralRe: Nice but one question PinmemberRafone12:26 6 May '09  
QuestionWhy not static? PinmemberPIEBALDconsult18:08 9 Jan '09  
AnswerRe: Why not static? PinmemberZacky Pickholz23:41 21 Apr '09  
GeneralRe: Why not static? PinmemberPIEBALDconsult5:02 22 Apr '09  
QuestionHow do I reference this in VB.Net? Pinmemberpmannino0:52 9 Jan '09  
AnswerRe: How do I reference this in VB.Net? PinmemberZacky Pickholz23:43 21 Apr '09  
I don't have an answer for that, but surely someone more acquainted with VB will have an answer.
 
Perhaps you need to tweak my package/classes definitions and make them available to "outsiders".
 
Essentially it should be pretty straightforward to reuse my code from VB.
GeneralProblem getting sunrise and sunset to output. Pinmembernewb2vb6:05 4 Nov '08  
GeneralRe: Problem getting sunrise and sunset to output. PinmemberMedlan6:52 4 Nov '08  
Generalerror Pinmemberharrifer9:19 31 Oct '08  
GeneralRe: error Pinmemberrsam_london16:19 31 Oct '08  
GeneralProblem with rounding the UtcOffset Pinmemberrsam_london18:11 29 Oct '08  
GeneralRe: Problem with rounding the UtcOffset PinmemberRedFraggle1:46 4 Feb '12  
QuestionTwilight times? Pinmemberacasia214:07 9 Oct '08  

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

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

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