hel_time/
lib.rs

1//! A simple more of a util crate that deals with time
2pub use iso8601::ISO8601UTC;
3
4use std::time::SystemTime;
5
6use consts::*;
7
8/// Simple struct that holds Date and Time in UTC
9#[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	// Inspiration - https://git.musl-libc.org/cgit/musl/tree/src/time/__secs_to_tm.c
24	#[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/// Will return a [`String`] in `yyyy-MM-ddTHH:mm:ss.fffZ` format
79///
80/// # Example
81/// ```
82/// use hel_time::iso8601utc;
83/// println!("{}", iso8601utc());
84/// ```
85#[inline(always)]
86pub fn iso8601utc() -> String {
87	iso8601::ISO8601UTC::now().to_string()
88}
89
90/// Will return raw [`DateTime`]
91#[inline(always)]
92pub fn utc() -> DateTime {
93	DateTime::utc()
94}
95
96mod consts;
97mod iso8601;
98mod utils;