pub(super) fn now_utc() -> String {
let d = std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap_or_default();
let secs = d.as_secs();
let (days, rem) = (secs / 86_400, secs % 86_400);
let (h, rem) = (rem / 3_600, rem % 3_600);
let (m, s) = (rem / 60, rem % 60);
let (mut y, mut mo, mut day) = (1970i64, 1u32, 1u32);
let mut remaining = days as i64;
loop {
let yd = if y % 4 == 0 && (y % 100 != 0 || y % 400 == 0) {
366
} else {
365
};
if remaining < yd {
break;
}
remaining -= yd;
y += 1;
}
let leap = y % 4 == 0 && (y % 100 != 0 || y % 400 == 0);
let mdays = [
31,
if leap { 29 } else { 28 },
31,
30,
31,
30,
31,
31,
30,
31,
30,
31,
];
for md in mdays {
if remaining < md as i64 {
break;
}
remaining -= md as i64;
mo += 1;
}
day += remaining as u32;
format!("{:04}-{:02}-{:02} {:02}:{:02}:{:02}", y, mo, day, h, m, s)
}