From c246b9d92f20b8042b1394b9aee488b4c79c3624 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Thu, 15 Feb 2024 13:03:14 -0800 Subject: [PATCH] time: add time_ago function from Damus iOS Useful relative time formatting Signed-off-by: William Casarin --- src/lib.rs | 1 + src/time.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) create mode 100644 src/time.rs diff --git a/src/lib.rs b/src/lib.rs index 9d40c04b..71d965ca 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -10,6 +10,7 @@ mod result; mod filter; mod ui; mod timecache; +mod time; mod frame_history; mod timeline; diff --git a/src/time.rs b/src/time.rs new file mode 100644 index 00000000..4a30bb3f --- /dev/null +++ b/src/time.rs @@ -0,0 +1,47 @@ +use std::time::{Duration, SystemTime, UNIX_EPOCH}; + +/// Show a relative time string based on some timestamp +pub fn time_ago_since(timestamp: u64) -> String { + let now = SystemTime::now() + .duration_since(UNIX_EPOCH) + .expect("Time went backwards") + .as_secs(); + let duration = now.checked_sub(timestamp).unwrap_or(0); + + let years = duration / 31_536_000; // seconds in a year + if years >= 1 { + return format!("{}yr", years); + } + + let months = duration / 2_592_000; // seconds in a month (30.44 days) + if months >= 1 { + return format!("{}mth", months); + } + + let weeks = duration / 604_800; // seconds in a week + if weeks >= 1 { + return format!("{}wk", weeks); + } + + let days = duration / 86_400; // seconds in a day + if days >= 1 { + return format!("{}d", days); + } + + let hours = duration / 3600; // seconds in an hour + if hours >= 1 { + return format!("{}h", hours); + } + + let minutes = duration / 60; // seconds in a minute + if minutes >= 1 { + return format!("{}m", minutes); + } + + let seconds = duration; + if seconds >= 3 { + return format!("{}s", seconds); + } + + "now".to_string() +}