Introduction
I was looking for a .NET library to calculate the time the sun rises and sets. There were some libraries available, including here on The Code Project, but they had some problems. After trying some, I decided to create one myself. I needed the sunrise, sunset, and maximum solar radiation for a WordPress plug-in on my blog. The plug-in shows a map of the Netherlands together with the current weather conditions. The top of this post shows a screenshot of the plug-in. The map shows the real-time temperature including an icon. The icon is a translation of the measured solar radiation against the maximum solar radiation.
Background
It is possible to calculate the sunrise, sunset, and maximum solar radiation using some known algorithms. For those of you who are interested in these algorithms, take a look at the following pages at Wikipedia: Declination of the Sun, Sunrise, Sunset. If you just want to calculate the sunrise, sunset, and maximum solar radiation, take a look below at how to use the code.
Using the Code
The code is packed in a Visual Studio 2008 solution. It contains two assemblies: Astronomy
and AstronomyTest
. The assembly Astronomy
contains the SunCalculator
class which performs the actual calculation. The assembly AstronomyTest
contains several unit-tests that validate the calculations against external sources.
SunCalculator
is a single class that does not depend on external classes. Although this somewhat goes against the Single Responsibility Principle, it makes reuse of this class easier. The SunCalculator
class needs the longitude, latitude, and time-zone of your location. You should also indicate whether to use daylight savings. An instance of the SolarCalculator
can be created like this:
const Double Longitute = 5.127869;
const Double Latitude = 52.108192;
const int LongituteTimeZone = 15;
const bool UseSummerTime = true;
SunCalculator sunCalculator = new SunCalculator(Longitute, Latitude,
LongituteTimeZone, UseSummerTime);
You have to supply the longitude and the latitude from the location that you want to calculate the sunrise and sunset time. These are the two first arguments of the constructor. For locations that use daylight savings, you should set UseSummerTime
to the actual daylight savings status. For locations that don't use daylight savings, set it to false
.
The actual calculation of sunrise, sunset, and maximum solar radiation can be seen below:
DateTime sunRise = sunCalculator.CalculateSunRise(new DateTime(2010, 4, 1));
DateTime sunSet = sunCalculator.CalculateSunSet(new DateTime(2010, 4, 1));
Double maximumSolarRadiation =
sunCalculator.CalculateMaximumSolarRadiation(new DateTime(2010, 1, 26, 16, 30, 0));
The DateTime
that is returned from CalculateSunRise
and CalculateSunSet
includes the sunrise and sunset time. For more information, take a look at the unit-tests in the assembly AstronomyTest
.
Points of Interest
The code first calculates the declination of the sun, cosine of the sun position, sinus of the sun position, and the difference between the solar and the actual time. All these parameters are used to calculate the sunrise and sunset times.
If you want to see the plug-in live, see my blog www.semanticarchitecture.net. The data that is retrieved and shown on the map comes from LetsGrow.com, the company that I work for.
History
- v1.0 02/04/2010: Initial and first release
- v1.1 28/05/2010: Added a test case for Los Angeles, and a Console application that demonstrates the library in the source code
- v1.2 08/11/2011: Fixed failing tests