baseunits_rs/time/
calendar_date_time.rs1use 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}