use chrono::{DateTime, FixedOffset, TimeZone, Utc};
use solar_positioning::{spa, time::DeltaT, RefractionCorrection};
fn main() -> solar_positioning::Result<()> {
let datetime_fixed = "2023-06-21T12:00:00-07:00"
.parse::<DateTime<FixedOffset>>()
.unwrap();
let datetime_utc = Utc.with_ymd_and_hms(2023, 6, 21, 19, 0, 0).unwrap(); let latitude = 37.7749; let longitude = -122.4194;
let delta_t = DeltaT::estimate_from_date(2023, 6)?;
let position_fixed = spa::solar_position(
datetime_fixed,
latitude,
longitude,
0.0, delta_t, Some(RefractionCorrection::new(1013.25, 15.0)?), )?;
let position_utc = spa::solar_position(
datetime_utc,
latitude,
longitude,
0.0, delta_t, Some(RefractionCorrection::new(1013.25, 15.0)?), )?;
println!("Solar position for San Francisco on June 21, 2023 at noon Pacific Time:");
println!("Using FixedOffset timezone:");
println!(" Azimuth: {:.3}°", position_fixed.azimuth());
println!(" Elevation: {:.3}°", position_fixed.elevation_angle());
println!(" Zenith angle: {:.3}°", position_fixed.zenith_angle());
println!("\nUsing UTC timezone (same moment):");
println!(" Azimuth: {:.3}°", position_utc.azimuth());
println!(" Elevation: {:.3}°", position_utc.elevation_angle());
println!(" Zenith angle: {:.3}°", position_utc.zenith_angle());
println!(
"\nBoth calculations produce identical results: {}",
position_fixed.azimuth() == position_utc.azimuth()
&& position_fixed.elevation_angle() == position_utc.elevation_angle()
);
if position_fixed.is_sun_up() {
println!(" Sun is above the horizon");
} else {
println!(" Sun is below the horizon");
}
Ok(())
}