1
2use chrono::{DateTime, Duration, Local, NaiveDateTime, ParseError, TimeZone, Utc, NaiveDate};
3use std::cmp::Ordering;
4use std::time::{SystemTime, UNIX_EPOCH};
5
6pub struct DateUtil;
8
9impl DateUtil {
10 pub fn current_date_string() -> String {
13 let now = Local::now();
14 now.format("%Y-%m-%d").to_string()
15 }
16
17 pub fn today_string() -> String {
24 let now = Local::now();
25 now.format("%Y-%m-%d").to_string()
26 }
27
28 pub fn parse_day_string(day_string: &str) -> Result<NaiveDate, ParseError> {
29 NaiveDate::parse_from_str(day_string, "%Y-%m-%d")
30 }
31
32 pub fn day_offset(offset: i64) -> String {
37 let now: DateTime<Local> = Local::now();
38 let duration = Duration::days(offset);
39 let now = now + duration;
40 now.format("%Y-%m-%d").to_string()
41 }
42
43 pub fn yesterday_string() -> String {
58 let now = Local::now();
60 let yesterday = now - Duration::days(1);
62 yesterday.format("%Y-%m-%d").to_string()
64 }
65
66 pub fn tomorrow_string() -> String {
73 let now = Local::now();
75 let tomorrow = now + Duration::days(1);
77 tomorrow.format("%Y-%m-%d").to_string()
79 }
80
81 pub fn cmp_string(time1: &str, time2: &str, fmt: &str) -> Result<Ordering, ParseError> {
99 let naive1 = NaiveDateTime::parse_from_str(time1, fmt)?;
101 let naive2 = NaiveDateTime::parse_from_str(time2, fmt)?;
102 let datetime1: DateTime<Utc> = Utc.from_utc_datetime(&naive1);
103 let datetime2: DateTime<Utc> = Utc.from_utc_datetime(&naive2);
104 let c = datetime1.cmp(&datetime2);
105 Ok(c)
106 }
107
108 pub fn current_time_string() -> String {
111 let now = Local::now();
112 now.format("%Y-%m-%d %H:%M:%S").to_string()
113 }
114
115 pub fn parse_datetime(time: &str) -> Result<NaiveDateTime, chrono::ParseError> {
118 let res = NaiveDateTime::parse_from_str(time, "%Y-%m-%d %H:%M:%S")?;
119 Ok(res)
120 }
121
122 pub fn parse_string(time: &str, fmt: &str) -> Result<NaiveDateTime, chrono::ParseError> {
123 let res = NaiveDateTime::parse_from_str(time, fmt)?;
124 Ok(res)
125 }
126
127 pub fn current_timestamp() -> u64 {
129 let time = Local::now();
130 DateUtil::timestamp(time)
131 }
132
133 pub fn timestamp(time: DateTime<Local>) -> u64 {
135 let system_time: SystemTime = time.into();
136 let duration = system_time.duration_since(UNIX_EPOCH).unwrap();
137 let timestamp = duration.as_secs();
138 timestamp
139 }
140
141 pub fn timestamp_add(time: DateTime<Local>, seconds: i64) -> u64 {
143 let diff = Duration::seconds(seconds);
144 let time = time + diff;
145 DateUtil::timestamp(time)
146 }
147}
148
149#[cfg(test)]
150mod tests {
151
152 use super::*;
153
154 #[test]
155 fn test_current_time_string() {
156 let timestring = DateUtil::current_time_string();
157 println!("timestring = {}", timestring);
158 }
159
160 #[test]
161 fn test_current_timestamp() {
162 let ts = DateUtil::current_timestamp();
163 println!("ts = {}", ts);
164 }
165
166 #[test]
167 fn test_parse_datetime() {
168 let x = DateUtil::parse_datetime("2025-08-30 12:00:00");
169 println!("{:?}", x);
170 }
171
172 #[test]
173 fn test_cmp_string() {
174 let c = DateUtil::cmp_string(
175 "2025-08-30 13:00:00",
176 "2025-08-30 12:00:01",
177 "%Y-%m-%d %H:%M:%S",
178 );
179 println!("{:?}", c);
180 }
181}