sunrise_lite/
sunrise.rs

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
10/// Calculates the sunrise and sunset times for the given location and date.
11pub 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}