command_vault/utils/
time.rs

1use chrono::{DateTime, TimeZone, Utc, NaiveDate};
2
3pub fn parse_datetime(s: &str) -> Option<DateTime<Utc>> {
4    // Try RFC3339 format first
5    if let Ok(dt) = DateTime::parse_from_rfc3339(s) {
6        return Some(dt.with_timezone(&Utc));
7    }
8
9    // Try common date formats
10    let date_formats = [
11        "%Y-%m-%d",
12        "%Y/%m/%d",
13        "%d-%m-%Y",
14        "%d/%m/%Y",
15    ];
16
17    let datetime_formats = [
18        "%Y-%m-%d %H:%M",
19        "%Y-%m-%d %H:%M:%S",
20        "%Y-%m-%d %H:%M:%S UTC",
21        "%d/%m/%Y %H:%M",
22        "%d/%m/%Y %H:%M:%S",
23    ];
24
25    // Try date-only formats first
26    for format in date_formats {
27        if let Ok(naive_date) = NaiveDate::parse_from_str(s, format) {
28            let naive_datetime = naive_date.and_hms_opt(0, 0, 0).unwrap();
29            return Some(Utc.from_utc_datetime(&naive_datetime));
30        }
31    }
32
33    // Then try datetime formats
34    for format in datetime_formats {
35        if let Ok(naive) = chrono::NaiveDateTime::parse_from_str(s, format) {
36            return Some(Utc.from_utc_datetime(&naive));
37        }
38    }
39
40    None
41}