use std::time::Duration;
use chrono::{DateTime, Local, NaiveDateTime, Utc};
pub fn safe_future_datetime_from_duration(duration: Duration) -> DateTime<Utc> {
let old_duration = chrono::Duration::from_std(duration).unwrap_or(chrono::Duration::MAX);
Utc::now()
.checked_add_signed(old_duration)
.unwrap_or(DateTime::<Utc>::MAX_UTC)
}
pub fn format_duration(duration: Duration) -> String {
let secs = duration.as_secs();
if secs > 60 {
let mins = secs / 60;
if mins > 60 {
let hours = mins / 60;
format!("{}h {}m {}s", hours, mins % 60, secs % 60)
} else {
format!("{}m {}s", mins, secs % 60)
}
} else {
format!("{secs}s")
}
}
pub fn format_local_datetime(datetime: &NaiveDateTime) -> String {
let local_datetime = DateTime::<Local>::from_naive_utc_and_offset(*datetime, Local::now().offset().to_owned());
local_datetime.format("%Y-%m-%d %H:%M:%S").to_string()
}
pub fn is_max_datetime(datetime: &NaiveDateTime) -> bool {
DateTime::<Utc>::MAX_UTC.naive_utc() == *datetime
}
#[cfg(test)]
mod test {
use super::*;
#[test]
fn formats_duration() {
let s = format_duration(Duration::from_secs(5));
assert_eq!(s, "5s");
let s = format_duration(Duration::from_secs(23 * 60 + 10));
assert_eq!(s, "23m 10s");
let s = format_duration(Duration::from_secs(9 * 60 * 60 + 35 * 60 + 45));
assert_eq!(s, "9h 35m 45s");
}
}