1use anomaly::solar_mean_anomaly;
2use center::equation_of_center;
3use declination::declination;
4use hourangle::hour_angle;
5use julian::julian_to_unix;
6use longitude::ecliptic_longitude;
7use noon::mean_solar_noon;
8use transit::solar_transit;
9
10pub fn sunrise_sunset(
12 latitude: f64,
13 longitude: f64,
14 year: i32,
15 month: u32,
16 day: u32,
17) -> (i64, i64) {
18 let day: f64 = mean_solar_noon(longitude, year, month, day);
19 let solar_anomaly: f64 = solar_mean_anomaly(day);
20 let equation_of_center: f64 = equation_of_center(solar_anomaly);
21 let ecliptic_longitude: f64 = ecliptic_longitude(solar_anomaly, equation_of_center, day);
22 let solar_transit: f64 = solar_transit(day, solar_anomaly, ecliptic_longitude);
23 let declination: f64 = declination(ecliptic_longitude);
24 let hour_angle: f64 = hour_angle(latitude, declination);
25 let frac: f64 = hour_angle / 360.;
26 (
27 julian_to_unix(solar_transit - frac),
28 julian_to_unix(solar_transit + frac),
29 )
30}
31
32#[cfg(test)]
33mod tests {
34 #[test]
35 fn test_prime_meridian() {
36 assert_eq!(super::sunrise_sunset(0., 0., 1970, 1, 1), (21594, 65227),)
37 }
38}