//! Human-readable times. use std::time::{SystemTime, UNIX_EPOCH}; pub fn now() -> i64 { SystemTime::now() .duration_since(UNIX_EPOCH) .map_or(0, |d| d.as_secs() as i64) } /// "3 hours ago", relative to `now` (both unix seconds). Future times /// (clock skew) read as "just now". pub fn relative(then: i64, now: i64) -> String { const MIN: i64 = 60; const HOUR: i64 = 60 * MIN; const DAY: i64 = 24 * HOUR; const WEEK: i64 = 7 * DAY; const MONTH: i64 = 30 * DAY; const YEAR: i64 = 365 * DAY; let delta = now - then; let (n, unit) = match delta { d if d < MIN => return "just now".into(), d if d < HOUR => (d / MIN, "minute"), d if d < DAY => (d / HOUR, "hour"), d if d < 2 * WEEK => (d / DAY, "day"), d if d < 2 * MONTH => (d / WEEK, "week"), d if d < YEAR => (d / MONTH, "month"), d => (d / YEAR, "year"), }; format!("{n} {unit}{} ago", if n == 1 { "" } else { "s" }) } /// RFC 3339 UTC timestamp, for `