1pub use iso8601::ISO8601UTC;
3
4use std::time::SystemTime;
5
6use consts::*;
7
8#[derive(Debug, Clone, Copy)]
10pub struct DateTime {
11 pub year: u16,
12 pub month: u8,
13 pub day: u16,
14
15 pub hour: u8,
16 pub minute: u8,
17 pub second: u8,
18
19 pub ms: u16,
20}
21
22impl DateTime {
23 #[inline]
25 pub fn utc() -> Self {
26 let since_anchor = SystemTime::now().duration_since(ANCHOR).unwrap_or_default();
27
28 let mut rem_secs = since_anchor.as_secs();
29
30 let mut rem_days = rem_secs / SPD;
31 rem_secs -= rem_days * SPD;
32
33 let leaps = rem_days / DP4Y;
34 rem_days -= leaps * DP4Y;
35
36 let mut years = rem_days / 365;
37 rem_days -= years * 365;
38
39 let mut month = 0u8;
40 for d in DM {
41 if d > rem_days {
42 break;
43 }
44
45 rem_days -= d;
46 month += 1;
47 }
48
49 if month >= 10 {
50 month -= 12;
51 years += 1;
52 }
53
54 let year = (ANCHOR_YEAR + years + leaps * 4) as u16;
55 let month = month + 3;
56 let day = rem_days as u16 + 1;
57
58 let hour = (rem_secs / SPH) as u8;
59 let minute = (rem_secs / SPM % SPM) as u8;
60 let second = (rem_secs % 60) as u8;
61
62 let ms = since_anchor.subsec_millis() as u16;
63
64 Self {
65 year,
66 month,
67 day,
68
69 hour,
70 minute,
71 second,
72
73 ms,
74 }
75 }
76}
77
78#[inline(always)]
86pub fn iso8601utc() -> String {
87 iso8601::ISO8601UTC::now().to_string()
88}
89
90#[inline(always)]
92pub fn utc() -> DateTime {
93 DateTime::utc()
94}
95
96mod consts;
97mod iso8601;
98mod utils;