baseunits_rs/time/
calendar_date_time.rs

1use crate::time::{CalendarDate, TimeOfDay};
2use chrono::{DateTime, TimeZone, Timelike, Datelike};
3
4#[derive(Debug, Clone, Eq, PartialEq, PartialOrd, Hash)]
5pub struct CalendarDateTime {
6  date: CalendarDate,
7  time: TimeOfDay,
8}
9
10impl<T> From<DateTime<T>> for CalendarDateTime
11where
12  T: TimeZone,
13{
14  fn from(value: DateTime<T>) -> Self {
15    let cd = CalendarDate::from((value.year(), value.month(), value.day()));
16    let tod = TimeOfDay::from((value.hour(), value.minute()));
17    Self::new(cd, tod)
18  }
19}
20
21impl From<(i32, u32, u32, u32, u32)> for CalendarDateTime {
22  fn from((year, month, day, hour, minute): (i32, u32, u32, u32, u32)) -> Self {
23    let cd = CalendarDate::from((year, month, day));
24    let tod = TimeOfDay::from((hour, minute));
25    Self::new(cd, tod)
26  }
27}
28
29impl CalendarDateTime {
30  pub fn new(date: CalendarDate, time: TimeOfDay) -> Self {
31    Self { date, time }
32  }
33
34  pub fn is_after(&self, other: &Self) -> bool {
35    !self.is_before(other) && self != other
36  }
37
38  pub fn is_before(&self, other: &Self) -> bool {
39    if self.date.is_before(&other.date) {
40      true
41    } else if self.date.is_after(&other.date) {
42      false
43    } else {
44      self.time.is_before(&other.time)
45    }
46  }
47}