use crate::types::{
data::{
zone::{Sign, Zone}
},
planets::{
earth::{
calendar::{
constants::{
seconds::{SECONDS_IN_MINUTE, SECONDS_IN_HOUR},
},
}
}
}
};
use libc::{time_t, time, tm, localtime_r};
pub fn local_timezone() -> Zone {
let mut time_zone: Zone = Zone::default();
let (epoch_seconds, mut time_struct): (time_t, tm) = unsafe { (time(std::ptr::null_mut()), std::mem::zeroed::<tm>()) };
if unsafe { localtime_r(&epoch_seconds, &mut time_struct) } == std::ptr::null_mut() {
panic!("[ERROR]: Pointer is NULL (timezone)!")
}
if time_struct.tm_gmtoff < 0 {
time_zone.sign = Sign::Signed;
} else {
time_zone.sign = Sign::Unsigned;
}
let tz_seconds: u32 = time_struct.tm_gmtoff.unsigned_abs() as u32;
(
time_zone.hours,
time_zone.minutes,
time_zone.seconds
) = (
(tz_seconds / (SECONDS_IN_HOUR as u32)) as u8,
((tz_seconds % (SECONDS_IN_HOUR as u32)) / (SECONDS_IN_MINUTE as u32)) as u8,
(tz_seconds % (SECONDS_IN_MINUTE as u32)) as u8
);
return time_zone;
}