cftime_rs/datetimes/
julian.rs

1use crate::calendars::Calendar;
2use crate::datetimes::traits::{CalendarDatetime, IsLeap};
3use crate::timezone::Tz;
4use crate::utils::{
5    get_timestamp_from_hms, get_timestamp_from_ymd, get_ymd_hms_from_timestamp,
6    is_leap_julian,
7};
8
9use super::traits::CalendarDatetimeCreator;
10pub struct JulianDatetime {
11    pub timestamp: i64,
12    pub nanoseconds: u32,
13    pub tz: Tz,
14    pub calendar: Calendar,
15}
16
17impl JulianDatetime {
18    pub fn new(timestamp: i64, nanoseconds: u32, tz: Tz) -> Self {
19        Self {
20            timestamp,
21            nanoseconds,
22            tz,
23            calendar: Calendar::Julian,
24        }
25    }
26}
27impl IsLeap for JulianDatetime {
28    fn is_leap(year: i64) -> bool {
29        is_leap_julian(year)
30    }
31}
32
33impl CalendarDatetime for JulianDatetime {
34    fn timestamp(&self) -> i64 {
35        self.timestamp
36    }
37    fn nanoseconds(&self) -> u32 {
38        self.nanoseconds
39    }
40    fn calendar(&self) -> Calendar {
41        self.calendar
42    }
43    fn timezone(&self) -> Tz {
44        self.tz
45    }
46
47    fn ymd_hms(&self) -> Result<(i64, u8, u8, u8, u8, u8), crate::errors::Error> {
48        Ok(get_ymd_hms_from_timestamp::<JulianDatetime>(self.timestamp))
49    }
50}
51
52impl CalendarDatetimeCreator for JulianDatetime {
53    fn from_timestamp(timestamp: i64, nanoseconds: u32) -> Self {
54        Self {
55            timestamp,
56            nanoseconds,
57            tz: Tz::new(0, 0).unwrap(),
58            calendar: Calendar::Julian,
59        }
60    }
61    fn from_ymd_hms(
62        year: i64,
63        month: u8,
64        day: u8,
65        hour: u8,
66        minute: u8,
67        second: f32,
68    ) -> Result<Self, crate::errors::Error> {
69        let (mut timestamp, nanoseconds) = get_timestamp_from_hms(hour, minute, second)?;
70        timestamp += get_timestamp_from_ymd::<JulianDatetime>(year, month, day)?;
71        Ok(Self {
72            timestamp,
73            nanoseconds,
74            tz: Tz::new(0, 0).unwrap(),
75            calendar: Calendar::Julian,
76        })
77    }
78}