fusion_common/time/
mod.rs1pub mod deser;
2pub mod ser;
3
4use std::sync::OnceLock;
5
6use chrono::ParseError;
7pub use chrono::{DateTime, Duration, FixedOffset, Local, NaiveDate, NaiveTime, Offset, TimeDelta, TimeZone, Utc};
8
9pub type OffsetDateTime = DateTime<FixedOffset>;
10pub type UtcDateTime = DateTime<Utc>;
11pub type LocalDateTime = DateTime<Local>;
12
13static LOCAL_OFFSET: OnceLock<FixedOffset> = OnceLock::new();
14
15pub fn local_offset() -> &'static FixedOffset {
16 LOCAL_OFFSET.get_or_init(_local_offset)
17}
18
19fn _local_offset() -> FixedOffset {
20 Local::now().offset().fix()
21}
22
23#[inline]
24pub fn now_utc() -> UtcDateTime {
25 Utc::now()
26}
27
28#[inline]
29pub fn now_offset() -> OffsetDateTime {
30 Local::now().with_timezone(local_offset())
31}
32
33#[inline]
34pub fn now() -> OffsetDateTime {
35 now_offset()
36}
37
38pub fn now_epoch_millis() -> i64 {
39 let now = now_utc();
40 now.timestamp_millis()
41}
42
43#[inline]
44pub fn now_epoch_seconds() -> i64 {
45 now_utc().timestamp()
46}
47
48pub fn to_local<Tz: TimeZone>(t: DateTime<Tz>) -> DateTime<FixedOffset> {
49 t.with_timezone(local_offset())
50}
51
52pub fn format_time<Tz: TimeZone>(time: DateTime<Tz>) -> Result<String, ParseError> {
54 Ok(time.to_rfc3339())
55}
56
57pub fn now_utc_plus_sec_str(sec: u64) -> Result<String, ParseError> {
58 let new_time = now_utc() + Duration::seconds(sec as i64);
59 format_time(new_time)
60}
61
62pub fn utc_from_millis(milliseconds: i64) -> DateTime<Utc> {
63 DateTime::<Utc>::UNIX_EPOCH + Duration::milliseconds(milliseconds)
64}
65
66pub fn datetime_from_millis(milliseconds: i64) -> DateTime<FixedOffset> {
67 utc_from_millis(milliseconds).with_timezone(local_offset())
68}
69
70pub fn parse_utc(moment: &str) -> Result<UtcDateTime, ParseError> {
71 let time = moment.parse::<UtcDateTime>()?;
72 Ok(time)
73}
74
75#[cfg(test)]
76mod tests {
77 use std::time::{Instant, SystemTime, UNIX_EPOCH};
78
79 use super::*;
80
81 #[test]
82 fn test_convert() {
83 let now_utc = now_utc();
84 println!("now utc is:\t{}", now_utc);
85
86 let now_offset = now_offset();
87 println!("now offset is:\t{}", now_offset);
88
89 let now = now();
90 println!("now is:\t\t{}", now);
91
92 let offset_datetime: LocalDateTime = "2025-06-04T03:58:19.117041+00:00".parse().unwrap();
93 println!("Offset DateTime is {}", offset_datetime);
94 }
95
96 #[test]
97 fn test_convert_std() {
98 let sys_now = SystemTime::now();
99 let sys_inst = Instant::now();
100 let now: UtcDateTime = sys_now.into();
101 println!("SystemTime: {sys_now:?}, Instant: {sys_inst:?}, Utc DateTime: {now}");
102
103 let sys_epoch_millis = sys_now.duration_since(UNIX_EPOCH).unwrap().as_millis() as i64;
104 let epoch_millis = now.timestamp_millis();
105 println!("System epoch millis: {}, Chrono epoch millis: {}", sys_epoch_millis, epoch_millis);
106 assert_eq!(sys_epoch_millis, epoch_millis);
107 }
108}