deep_time/gregorian_time/
mod.rs1use crate::{AsciiStr, Dt, Weekday};
2
3mod to_str;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
7pub struct YmdHms {
8 pub yr: i64,
9 pub mo: u8,
10 pub day: u8,
11 pub hr: u8,
12 pub min: u8,
13 pub sec: u8, pub attos: u64, pub unix_attosec: i128,
16}
17
18#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
20#[cfg_attr(feature = "js", derive(tsify::Tsify))]
21#[derive(Clone, Copy, Debug, PartialEq, Eq)]
22pub struct GregorianTime {
23 pub(crate) unix_attosec: i128,
25 pub(crate) yr: i64,
27 pub(crate) mo: u8,
29 pub(crate) day: u8,
31 pub(crate) hr: u8,
33 pub(crate) min: u8,
35 pub(crate) sec: u8,
37 pub(crate) attos: u64,
39 pub(crate) iso_yr: i64,
41 pub(crate) iso_wk: u8,
43 pub(crate) iso_wkday: Weekday,
45 pub(crate) day_of_yr: u16,
47 pub(crate) wkday: u8,
49 pub(crate) wk_of_yr_sun: u8,
51 pub(crate) wk_of_yr_mon: u8,
53 pub(crate) offset_sec: Option<i32>,
56 pub(crate) tz: Option<AsciiStr<49>>,
58 pub(crate) tz_abbrev: Option<AsciiStr<49>>,
60}
61
62impl GregorianTime {
63 #[inline]
67 pub const fn new(
68 unix_attosec: i128,
69 yr: i64,
70 mo: u8,
71 day: u8,
72 hr: u8,
73 min: u8,
74 sec: u8,
75 attos: u64,
76 iso_yr: i64,
77 iso_wk: u8,
78 iso_wkday: Weekday,
79 day_of_yr: u16,
80 wkday: u8,
81 wk_of_yr_sun: u8,
82 wk_of_yr_mon: u8,
83 ) -> Self {
84 Self {
85 unix_attosec,
86 yr,
87 mo,
88 day,
89 hr,
90 min,
91 sec,
92 attos,
93 iso_yr,
94 iso_wk,
95 iso_wkday,
96 day_of_yr,
97 wkday,
98 wk_of_yr_sun,
99 wk_of_yr_mon,
100 offset_sec: None,
101 tz: None,
102 tz_abbrev: None,
103 }
104 }
105
106 #[inline]
108 pub const fn unix_attosec(&self) -> i128 {
109 self.unix_attosec
110 }
111
112 #[inline]
118 pub const fn unix_timestamp(&self) -> (i64, u64) {
119 const ATTOS_PER_SEC_I128: i128 = 1_000_000_000_000_000_000;
120 let total = self.unix_attosec;
121 let secs = (total / ATTOS_PER_SEC_I128) as i64;
122 let frac = (total % ATTOS_PER_SEC_I128).unsigned_abs() as u64;
123 (secs, frac)
124 }
125
126 #[inline]
128 pub const fn yr(&self) -> i64 {
129 self.yr
130 }
131
132 #[inline]
134 pub const fn mo(&self) -> u8 {
135 self.mo
136 }
137
138 #[inline]
140 pub const fn day(&self) -> u8 {
141 self.day
142 }
143
144 #[inline]
146 pub const fn hr(&self) -> u8 {
147 self.hr
148 }
149
150 #[inline]
152 pub const fn min(&self) -> u8 {
153 self.min
154 }
155
156 #[inline]
158 pub const fn sec(&self) -> u8 {
159 self.sec
160 }
161
162 #[inline]
164 pub const fn attos(&self) -> u64 {
165 self.attos
166 }
167
168 #[inline]
170 pub const fn iso_yr(&self) -> i64 {
171 self.iso_yr
172 }
173
174 #[inline]
176 pub const fn iso_wk(&self) -> u8 {
177 self.iso_wk
178 }
179
180 #[inline]
182 pub const fn iso_wkday(&self) -> Weekday {
183 self.iso_wkday
184 }
185
186 #[inline]
188 pub const fn day_of_yr(&self) -> u16 {
189 self.day_of_yr
190 }
191
192 #[inline]
194 pub const fn wkday_sun(&self) -> u8 {
195 self.wkday
196 }
197
198 #[inline]
200 pub const fn wkday_mon(&self) -> u8 {
201 self.iso_wkday.wk_mon()
202 }
203
204 #[inline]
206 pub const fn wk_of_yr_sun(&self) -> u8 {
207 self.wk_of_yr_sun
208 }
209
210 #[inline]
212 pub const fn wk_of_yr_mon(&self) -> u8 {
213 self.wk_of_yr_mon
214 }
215
216 #[inline]
217 pub const fn offset_sec(&self) -> Option<i32> {
218 self.offset_sec
219 }
220
221 #[inline]
222 pub const fn tz(&self) -> Option<&AsciiStr<49>> {
223 self.tz.as_ref()
224 }
225
226 #[inline]
227 pub const fn tz_abbrev(&self) -> Option<&AsciiStr<49>> {
228 self.tz_abbrev.as_ref()
229 }
230
231 #[inline]
232 pub(crate) fn set_offset(&mut self, offset_sec: Option<i32>) -> &mut Self {
233 self.offset_sec = offset_sec;
234 self
235 }
236
237 #[inline]
238 pub(crate) fn set_tz(&mut self, tz: Option<&str>) -> &mut Self {
239 self.tz = tz.and_then(|s| AsciiStr::try_from_str(s).ok());
240 self
241 }
242
243 #[inline]
244 pub(crate) fn set_tz_abbrev(&mut self, tz_abbrev: Option<&str>) -> &mut Self {
245 self.tz_abbrev = tz_abbrev.and_then(|s| AsciiStr::try_from_str(s).ok());
246 self
247 }
248
249 #[inline]
253 pub const fn to_dt(&self) -> Dt {
254 Dt::from_ymdhms(self.yr, self.mo, self.day, self.hr, self.min, self.sec, 0)
255 }
256}