use anyhow::{anyhow, Result};
use chrono::{DateTime, Datelike, FixedOffset, TimeZone, Timelike, Utc};
pub fn diff_between_datetimes(
datetime1: DateTime<FixedOffset>,
datetime2: DateTime<FixedOffset>,
) -> Result<(i32, i32, i32, i32, i32, i32)> {
let datetime2 = datetime2.with_timezone(&datetime1.timezone());
let (datetime1, datetime2) = if datetime1 > datetime2 {
(datetime2, datetime1)
} else {
(datetime1, datetime2)
};
let mut year = datetime2.year() - datetime1.year();
let mut month = datetime2.month() as i32 - datetime1.month() as i32;
let mut day = datetime2.day() as i32 - datetime1.day() as i32;
let mut hour = datetime2.hour() as i32 - datetime1.hour() as i32;
let mut min = datetime2.minute() as i32 - datetime1.minute() as i32;
let mut sec = datetime2.second() as i32 - datetime1.second() as i32;
if sec < 0 {
sec += 60;
min -= 1;
}
if min < 0 {
min += 60;
hour -= 1;
}
if hour < 0 {
hour += 24;
day -= 1;
}
if day < 0 {
let t = Utc
.with_ymd_and_hms(datetime1.year(), datetime1.month(), 32, 0, 0, 0)
.single()
.ok_or(anyhow!("Could not convert `ns1` to datetime"))?;
day += 32 - t.day() as i32;
month -= 1;
}
if month < 0 {
month += 12;
year -= 1;
}
Ok((year, month, day, hour, min, sec))
}