orbital_base_components/form/datetime/
unix_time.rs1use super::convert::{ToUnixSeconds, TryFromUnixSeconds};
2use super::orbital_datetime::OrbitalDateTime;
3use super::timezone::DatetimeTimezone;
4
5#[deprecated(note = "use OrbitalDateTime")]
7#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
8pub struct UnixTime(pub i64);
9
10#[allow(deprecated)]
11impl UnixTime {
12 #[deprecated(note = "use OrbitalDateTime")]
13 pub fn start_of_day(self, use_utc: bool) -> Self {
14 let tz = if use_utc {
15 DatetimeTimezone::Utc
16 } else {
17 DatetimeTimezone::Local
18 };
19 OrbitalDateTime::try_from_unix_seconds(self.0, tz)
20 .map(|dt| Self(dt.start_of_day().to_unix_seconds()))
21 .unwrap_or(self)
22 }
23
24 #[deprecated(note = "use OrbitalDateTime")]
25 pub fn apply_hms(self, hour: u32, minute: u32, second: u32, use_utc: bool) -> Option<Self> {
26 let tz = if use_utc {
27 DatetimeTimezone::Utc
28 } else {
29 DatetimeTimezone::Local
30 };
31 OrbitalDateTime::try_from_unix_seconds(self.0, tz)
32 .ok()?
33 .apply_hms(hour, minute, second)
34 .map(|dt| Self(dt.to_unix_seconds()))
35 }
36
37 #[deprecated(note = "use OrbitalDateTime")]
38 pub fn same_calendar_day(a: Self, b: Self, use_utc: bool) -> bool {
39 let tz = if use_utc {
40 DatetimeTimezone::Utc
41 } else {
42 DatetimeTimezone::Local
43 };
44 let Ok(a_dt) = OrbitalDateTime::try_from_unix_seconds(a.0, tz) else {
45 return false;
46 };
47 let Ok(b_dt) = OrbitalDateTime::try_from_unix_seconds(b.0, tz) else {
48 return false;
49 };
50 a_dt.same_calendar_day(b_dt)
51 }
52
53 #[deprecated(note = "use OrbitalDateTime")]
54 pub fn hour_minute_second(self, use_utc: bool) -> Option<(u32, u32, u32)> {
55 let tz = if use_utc {
56 DatetimeTimezone::Utc
57 } else {
58 DatetimeTimezone::Local
59 };
60 OrbitalDateTime::try_from_unix_seconds(self.0, tz)
61 .ok()?
62 .hour_minute_second()
63 }
64}
65#[cfg(test)]
66#[allow(deprecated)]
67mod tests {
68 use super::UnixTime;
69 use chrono::{TimeZone, Utc};
70
71 #[test]
72 fn start_of_day_utc_resets_time() {
73 let source = Utc
74 .with_ymd_and_hms(2025, 1, 2, 18, 45, 12)
75 .single()
76 .expect("valid dt");
77 let sod = UnixTime(source.timestamp()).start_of_day(true);
78 let expected = Utc
79 .with_ymd_and_hms(2025, 1, 2, 0, 0, 0)
80 .single()
81 .expect("valid dt");
82 assert_eq!(sod.0, expected.timestamp());
83 }
84
85 #[test]
86 fn apply_hms_utc_replaces_time_component() {
87 let source = Utc
88 .with_ymd_and_hms(2025, 2, 11, 1, 2, 3)
89 .single()
90 .expect("valid dt");
91 let updated = UnixTime(source.timestamp())
92 .apply_hms(22, 10, 9, true)
93 .expect("updated dt");
94 let expected = Utc
95 .with_ymd_and_hms(2025, 2, 11, 22, 10, 9)
96 .single()
97 .expect("valid dt");
98 assert_eq!(updated.0, expected.timestamp());
99 }
100
101 #[test]
102 fn same_calendar_day_utc_checks_date_only() {
103 let a = Utc
104 .with_ymd_and_hms(2025, 6, 4, 0, 0, 1)
105 .single()
106 .expect("valid dt");
107 let b = Utc
108 .with_ymd_and_hms(2025, 6, 4, 23, 59, 59)
109 .single()
110 .expect("valid dt");
111 let c = Utc
112 .with_ymd_and_hms(2025, 6, 5, 0, 0, 0)
113 .single()
114 .expect("valid dt");
115
116 assert!(UnixTime::same_calendar_day(
117 UnixTime(a.timestamp()),
118 UnixTime(b.timestamp()),
119 true
120 ));
121 assert!(!UnixTime::same_calendar_day(
122 UnixTime(a.timestamp()),
123 UnixTime(c.timestamp()),
124 true
125 ));
126 }
127}