use std::time::{SystemTime, UNIX_EPOCH};
pub use crate::types::data::time::{Time, Uptime};
use crate::types::{
data::zone::{Sign, Zone},
planets::earth::calendar::{
constants::{
seconds::{SECONDS_IN_MINUTE, SECONDS_IN_HOUR, SECONDS_IN_DAY}
}
}
};
#[cfg(any(
feature = "platform_specific_functions_darwin",
feature = "platform_specific_functions_unix",
feature = "platform_specific_functions_windows"
))]
use crate::platform::{
time::{uptime},
tz::{local_timezone},
};
impl Time {
pub fn utc() -> Time {
let unix_time: u128 = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Error calling SystemTime::now().duration_since(UNIX_EPOCH)").as_secs() as u128;
return Self::to_time(
unix_time,
Zone {
sign: Sign::Unsigned,
hours: 0, minutes: 0,
seconds: 0
},
true
);
}
pub fn now(timezone: Zone) -> Time {
let unix_time: u128 = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Error calling SystemTime::now().duration_since(UNIX_EPOCH)").as_secs() as u128;
return Self::to_time(unix_time, timezone, false);
}
#[cfg(any(
feature = "platform_specific_functions_darwin",
feature = "platform_specific_functions_unix",
feature = "platform_specific_functions_windows"
))]
pub fn local() -> Time {
let unix_time: u128 = SystemTime::now()
.duration_since(UNIX_EPOCH)
.expect("Error calling SystemTime::now().duration_since(UNIX_EPOCH)").as_secs() as u128;
return Self::to_time(unix_time, local_timezone(), false);
}
pub fn from(unix_time: u128, timezone: Zone, timezone_in_unix_time: bool) -> Time {
return Self::to_time(unix_time, timezone, timezone_in_unix_time);
}
fn to_time(mut unix_time: u128, timezone: Zone, timezone_in_unix_time: bool) -> Time {
if !timezone_in_unix_time {
let timezone_seconds: u128 = timezone.to_seconds();
if unix_time < timezone_seconds && timezone.sign == Sign::Signed {
panic!("[ERROR]: Overflow, signed timezone override unix_time!")
}
if timezone.sign == Sign::Signed {
unix_time -= timezone_seconds;
} else if timezone.sign == Sign::Unsigned {
unix_time += timezone_seconds;
}
}
return Time {
hours: ((unix_time % SECONDS_IN_DAY) / SECONDS_IN_HOUR) as u8,
minutes: ((unix_time % SECONDS_IN_HOUR) / SECONDS_IN_MINUTE) as u8,
seconds: (unix_time % SECONDS_IN_MINUTE) as u8,
timezone: timezone,
unix_time: unix_time
};
}
#[cfg(any(
feature = "platform_specific_functions_darwin",
feature = "platform_specific_functions_unix",
feature = "platform_specific_functions_windows"
))]
pub fn absolute() -> Uptime {
let seconds: u128 = uptime() as u128;
return Uptime {
hours: (seconds / SECONDS_IN_HOUR),
minutes: ((seconds % SECONDS_IN_HOUR) / SECONDS_IN_MINUTE) as u8,
seconds: (seconds % SECONDS_IN_MINUTE) as u8
}
}
}