cftime_rs/datetimes/
julian.rs1use 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}