Skip to main content

kaizen/shell/
fmt.rs

1// SPDX-License-Identifier: AGPL-3.0-or-later
2//! Timestamp formatting — no chrono dep, pure stdlib.
3
4/// Ms since epoch → `YYYY-MM-DD HH:MM`. Returns `(unknown)` when ms is 0.
5pub fn fmt_ts(ms: u64) -> String {
6    if ms == 0 {
7        return "(unknown)".to_string();
8    }
9    let secs = ms / 1000;
10    let days = secs / 86400;
11    let time_secs = secs % 86400;
12    let h = time_secs / 3600;
13    let m = (time_secs % 3600) / 60;
14    let (y, mo, d) = days_to_ymd(days);
15    format!("{y:04}-{mo:02}-{d:02} {h:02}:{m:02}")
16}
17
18/// Gregorian date from days since 1970-01-01.
19fn days_to_ymd(days: u64) -> (u64, u64, u64) {
20    let z = days + 719468;
21    let era = z / 146097;
22    let doe = z % 146097;
23    let yoe = (doe - doe / 1460 + doe / 36524 - doe / 146096) / 365;
24    let y = yoe + era * 400;
25    let doy = doe - (365 * yoe + yoe / 4 - yoe / 100);
26    let mp = (5 * doy + 2) / 153;
27    let d = doy - (153 * mp + 2) / 5 + 1;
28    let mo = if mp < 10 { mp + 3 } else { mp - 9 };
29    let y = if mo <= 2 { y + 1 } else { y };
30    (y, mo, d)
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn zero_returns_unknown() {
39        assert_eq!(fmt_ts(0), "(unknown)");
40    }
41
42    #[test]
43    fn known_epoch() {
44        // 2026-04-22 00:00 UTC = 1776816000000 ms
45        assert_eq!(fmt_ts(1776816000000), "2026-04-22 00:00");
46    }
47}