1use crate::{Dt, LiteStr, Scale, Weekday};
2
3mod to_str;
4
5#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
7#[cfg_attr(feature = "js", derive(tsify::Tsify))]
8#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
9pub struct YmdHms {
10 pub(crate) yr: i64,
11 pub(crate) mo: u8,
12 pub(crate) day: u8,
13 pub(crate) hr: u8,
14 pub(crate) min: u8,
15 pub(crate) sec: u8, pub(crate) attos: u64, pub(crate) unix_attosec: i128,
18}
19
20impl YmdHms {
21 #[inline]
22 pub const fn yr(&self) -> i64 {
23 self.yr
24 }
25
26 #[inline]
27 pub const fn mo(&self) -> u8 {
28 self.mo
29 }
30
31 #[inline]
32 pub const fn day(&self) -> u8 {
33 self.day
34 }
35
36 #[inline]
37 pub const fn hr(&self) -> u8 {
38 self.hr
39 }
40
41 #[inline]
42 pub const fn min(&self) -> u8 {
43 self.min
44 }
45
46 #[inline]
47 pub const fn sec(&self) -> u8 {
48 self.sec
49 }
50
51 #[inline]
52 pub const fn attos(&self) -> u64 {
53 self.attos
54 }
55
56 #[inline]
59 pub const fn unix_attosec(&self) -> i128 {
60 self.unix_attosec
61 }
62
63 pub(crate) const fn to_ymdhms_rich_on(
64 &self,
65 iso_yr: i64,
66 iso_wk: u8,
67 iso_wkday: Weekday,
68 day_of_yr: u16,
69 wkday: u8,
70 wk_of_yr_sun: u8,
71 wk_of_yr_mon: u8,
72 scale: Scale,
73 ) -> YmdHmsRich {
74 YmdHmsRich::new(
75 self.unix_attosec,
76 self.yr,
77 self.mo,
78 self.day,
79 self.hr,
80 self.min,
81 self.sec,
82 self.attos,
83 iso_yr,
84 iso_wk,
85 iso_wkday,
86 day_of_yr,
87 wkday,
88 wk_of_yr_sun,
89 wk_of_yr_mon,
90 scale,
91 )
92 }
93}
94
95#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
97#[cfg_attr(feature = "js", derive(tsify::Tsify))]
98#[derive(Clone, Copy, Debug, PartialEq, Eq)]
99pub struct YmdHmsRich {
100 pub(crate) unix_attosec: i128,
102 pub(crate) yr: i64,
104 pub(crate) mo: u8,
106 pub(crate) day: u8,
108 pub(crate) hr: u8,
110 pub(crate) min: u8,
112 pub(crate) sec: u8,
114 pub(crate) attos: u64,
116 pub(crate) iso_yr: i64,
118 pub(crate) iso_wk: u8,
120 pub(crate) iso_wkday: Weekday,
122 pub(crate) day_of_yr: u16,
124 pub(crate) wkday: u8,
126 pub(crate) wk_of_yr_sun: u8,
128 pub(crate) wk_of_yr_mon: u8,
130 pub(crate) offset_sec: Option<i32>,
133 pub(crate) tz: Option<LiteStr<49>>,
135 pub(crate) tz_abbrev: Option<LiteStr<49>>,
137 pub(crate) scale: Scale,
139}
140
141impl YmdHmsRich {
142 #[inline]
144 pub(crate) const fn new(
145 unix_attosec: i128,
146 yr: i64,
147 mo: u8,
148 day: u8,
149 hr: u8,
150 min: u8,
151 sec: u8,
152 attos: u64,
153 iso_yr: i64,
154 iso_wk: u8,
155 iso_wkday: Weekday,
156 day_of_yr: u16,
157 wkday: u8,
158 wk_of_yr_sun: u8,
159 wk_of_yr_mon: u8,
160 scale: Scale,
161 ) -> Self {
162 Self {
163 unix_attosec,
164 yr,
165 mo,
166 day,
167 hr,
168 min,
169 sec,
170 attos,
171 iso_yr,
172 iso_wk,
173 iso_wkday,
174 day_of_yr,
175 wkday,
176 wk_of_yr_sun,
177 wk_of_yr_mon,
178 offset_sec: None,
179 tz: None,
180 tz_abbrev: None,
181 scale,
182 }
183 }
184
185 #[inline]
187 pub const fn to_dt(&self) -> Dt {
188 Dt::from_ymdhms_on(
189 self.yr, self.mo, self.day, self.hr, self.min, self.sec, self.attos, self.scale,
190 )
191 }
192
193 #[inline]
196 pub const fn unix_attosec(&self) -> i128 {
197 self.unix_attosec
198 }
199
200 #[inline]
207 pub const fn unix_timestamp(&self) -> (i64, u64) {
208 const ATTOS_PER_SEC_I128: i128 = 1_000_000_000_000_000_000;
209 let total = self.unix_attosec;
210 let secs = (total / ATTOS_PER_SEC_I128) as i64;
211 let frac = (total % ATTOS_PER_SEC_I128).unsigned_abs() as u64;
212 (secs, frac)
213 }
214
215 #[inline]
217 pub const fn yr(&self) -> i64 {
218 self.yr
219 }
220
221 #[inline]
223 pub const fn mo(&self) -> u8 {
224 self.mo
225 }
226
227 #[inline]
229 pub const fn day(&self) -> u8 {
230 self.day
231 }
232
233 #[inline]
235 pub const fn hr(&self) -> u8 {
236 self.hr
237 }
238
239 #[inline]
241 pub const fn min(&self) -> u8 {
242 self.min
243 }
244
245 #[inline]
247 pub const fn sec(&self) -> u8 {
248 self.sec
249 }
250
251 #[inline]
253 pub const fn attos(&self) -> u64 {
254 self.attos
255 }
256
257 #[inline]
259 pub const fn iso_yr(&self) -> i64 {
260 self.iso_yr
261 }
262
263 #[inline]
265 pub const fn iso_wk(&self) -> u8 {
266 self.iso_wk
267 }
268
269 #[inline]
271 pub const fn iso_wkday(&self) -> Weekday {
272 self.iso_wkday
273 }
274
275 #[inline]
277 pub const fn day_of_yr(&self) -> u16 {
278 self.day_of_yr
279 }
280
281 #[inline]
283 pub const fn wkday_sun(&self) -> u8 {
284 self.wkday
285 }
286
287 #[inline]
289 pub const fn wkday_mon(&self) -> u8 {
290 self.iso_wkday.wk_mon()
291 }
292
293 #[inline]
295 pub const fn wk_of_yr_sun(&self) -> u8 {
296 self.wk_of_yr_sun
297 }
298
299 #[inline]
301 pub const fn wk_of_yr_mon(&self) -> u8 {
302 self.wk_of_yr_mon
303 }
304
305 #[inline]
306 pub(crate) const fn offset_sec(&self) -> Option<i32> {
307 self.offset_sec
308 }
309
310 #[inline]
311 pub(crate) const fn tz(&self) -> Option<&LiteStr<49>> {
312 self.tz.as_ref()
313 }
314
315 #[inline]
316 pub(crate) const fn tz_abbrev(&self) -> Option<&LiteStr<49>> {
317 self.tz_abbrev.as_ref()
318 }
319
320 #[inline]
321 pub(crate) fn set_offset(&mut self, offset_sec: Option<i32>) -> &mut Self {
322 self.offset_sec = offset_sec;
323 self
324 }
325
326 #[inline]
327 pub(crate) fn set_tz(&mut self, tz: Option<&str>) -> &mut Self {
328 self.tz = tz.and_then(|s| Some(LiteStr::from_str(s)));
329 self
330 }
331
332 #[inline]
333 pub(crate) fn set_tz_abbrev(&mut self, tz_abbrev: Option<&str>) -> &mut Self {
334 self.tz_abbrev = tz_abbrev.and_then(|s| Some(LiteStr::from_str(s)));
335 self
336 }
337}