Skip to main content

orbital_base_components/form/datetime/
unix_time.rs

1use super::convert::{ToUnixSeconds, TryFromUnixSeconds};
2use super::orbital_datetime::OrbitalDateTime;
3use super::timezone::DatetimeTimezone;
4
5/// Deprecated unix-seconds newtype — use [`OrbitalDateTime`] instead.
6#[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}