#[derive(Default, Eq, PartialEq, Debug, Clone, Copy)]
pub struct Time {
hours_local: u8,
minutes_local: u8,
seconds_local: u8,
}
impl Time {
pub fn from_values(hours_local: u8, minutes_local: u8, seconds_local: u8) -> Self {
Time {
hours_local,
minutes_local,
seconds_local,
}
}
pub fn from_unix_epoch(epoch: u64, timezone_offset: u64) -> Self {
let local_epoch = epoch + timezone_offset;
Time {
hours_local: (local_epoch / 60 / 60 % 24) as u8,
minutes_local: (local_epoch / 60 % 60) as u8,
seconds_local: (local_epoch % 60) as u8,
}
}
pub fn hours_local(&self) -> u8 {
self.hours_local
}
pub fn minutes_local(&self) -> u8 {
self.minutes_local
}
pub fn seconds_local(&self) -> u8 {
self.seconds_local
}
pub fn round_to_quarters(self) -> Time {
let mut hours = self.hours_local;
let mut minutes = self.minutes_local;
if minutes <= 7 {
minutes = 0;
} else if minutes > 7 && minutes <= 22 {
minutes = 15;
} else if minutes > 22 && minutes <= 37 {
minutes = 30;
} else if minutes > 37 && minutes <= 52 {
minutes = 45;
} else {
hours += 1;
minutes = 0;
}
Self {
hours_local: hours,
minutes_local: minutes,
seconds_local: 0,
}
}
}
#[cfg(feature = "chrono")]
use chrono::prelude::*;
#[cfg(feature = "chrono")]
impl From<DateTime<Local>> for Time {
fn from(time: DateTime<Local>) -> Self {
Time {
hours_local: time.hour() as u8,
minutes_local: time.minute() as u8,
seconds_local: time.second() as u8,
}
}
}