#include <date.h>
#include <iostream>
-int main()
+// Calculate the time of sunrise in timezone UTC.
+
+hour calculate_sunrise(double latitude, double longitude, date when)
{
- // Hardinxveld:
- double latitude = 51.821366;
- double longitude = 4.844401;
- double labda_y = latitude * M_PI / 180.0;
+ float Declanation;
+ float solaroffset;
+ float h0;
- hour utctime = now(false);
- hour localtime = now(true);
+ hour midday(12, 0, 0);
+
+ double labda_y = latitude * M_PI / 180.0;
// Declanation of the sun as determined by the tilt of the earth's axis.
- float Declanation;
- Declanation = -23.44 * cos(2 * M_PI * (today(false).YearDay() + 10) / 365);
- //delta_s = math.radians (Declanation)
- std::cout << "Solar declanation: " << Declanation << "\n";
+ Declanation = -23.44 * cos(2 * M_PI * (when.YearDay() + 10) / 365);
// The earth rotates 15 degrees in 1 hour
- float solaroffset;
solaroffset = longitude / 15.0 * 3600; // In seconds
- std::cout << "Solar offset = " << solaroffset << " seconds.\n";
-
- float h0;
-
h0 = acos ( (-1 * tan (labda_y) * tan (Declanation * M_PI / 180.0)));
- std::cout << " h0 = " << h0 << " h0 hours = " << h0 * 12 / M_PI << "\n";
-
long sunseconds = h0 * 12.0 / M_PI * 3600;
hour sunhours(sunseconds / 3600, (sunseconds / 60) % 60, sunseconds % 60);
- // Calculate the times of sunrise and sunset
+ // Calculate the time of sunrise
+
+ hour sunrise = midday - sunseconds;
+ sunrise = sunrise - hour(long(solaroffset));
+ return sunrise;
+
+}
+
+// Calculate the time of sunset in timezone UTC.
+
+hour calculate_sunset(double latitude, double longitude, date when)
+{
+ float Declanation;
+ float solaroffset;
+ float h0;
hour midday(12, 0, 0);
- hour sunrise = midday - sunseconds;
- sunrise = sunrise - hour(long(solaroffset)) + (localtime - utctime);
- std::cout << "Sunrise at " << sunrise << "\n";
+ double labda_y = latitude * M_PI / 180.0;
+
+ // Declanation of the sun as determined by the tilt of the earth's axis.
+
+ Declanation = -23.44 * cos(2 * M_PI * (when.YearDay() + 10) / 365);
+
+ // The earth rotates 15 degrees in 1 hour
+
+ solaroffset = longitude / 15.0 * 3600; // In seconds
+
+ h0 = acos ( (-1 * tan (labda_y) * tan (Declanation * M_PI / 180.0)));
+
+ long sunseconds = h0 * 12.0 / M_PI * 3600;
+ hour sunhours(sunseconds / 3600, (sunseconds / 60) % 60, sunseconds % 60);
+
+ // Calculate the time of sunset
hour sunset = midday + sunseconds;
- sunset = sunset - hour(long(solaroffset)) + (localtime - utctime);
- std::cout << "Sunset at " << sunset << "\n";
+ sunset = sunset - hour(long(solaroffset));
+ return sunset;
}
--- /dev/null
+/*
+ * test sunrise and sunset functions.
+ */
+
+#include <date.h>
+
+#include <assert.h>
+
+// Hardinxveld:
+const double latitude = 51.821366;
+const double longitude = 4.844401;
+
+extern hour calculate_sunrise(double latitude, double longtitude, date when);
+extern hour calculate_sunset(double latitude, double longtitude, date when);
+
+int main()
+{
+ date when;
+ hour sunrise_at, sunset_at;
+
+ when = date(1, 1, 2020);
+
+ std::cout << "On the date " << when << ":\n";
+ sunrise_at = calculate_sunrise(latitude, longitude, when);
+ std::cout << "Sunrise : " << sunrise_at << " UTC.\n";
+ sunset_at = calculate_sunset(latitude, longitude, when);
+ std::cout << "Sunset : " << sunset_at << " UTC.\n";
+ assert(sunrise_at == hour(7, 51, 29));
+ assert(sunset_at == hour(15, 29, 47));
+
+ when = date(30, 6, 2020);
+
+ std::cout << "On the date " << when << ":\n";
+ sunrise_at = calculate_sunrise(latitude, longitude, when);
+ std::cout << "Sunrise : " << sunrise_at << " UTC.\n";
+ sunset_at = calculate_sunset(latitude, longitude, when);
+ std::cout << "Sunset : " << sunset_at << " UTC.\n";
+ assert(sunrise_at == hour(3, 29, 3));
+ assert(sunset_at == hour(19, 52, 13));
+}