Add relative_time() helper for human-readable timestamps
This commit is contained in:
@@ -338,6 +338,51 @@ fn crash_explanation(stderr: &str) -> String {
|
|||||||
may help identify the cause.".to_string()
|
may help identify the cause.".to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Format a timestamp string as a human-readable relative time.
|
||||||
|
/// Accepts RFC3339, "YYYY-MM-DD HH:MM:SS", or ISO8601 formats.
|
||||||
|
pub fn relative_time(timestamp: &str) -> String {
|
||||||
|
let parsed = chrono::DateTime::parse_from_rfc3339(timestamp)
|
||||||
|
.map(|dt| dt.with_timezone(&chrono::Utc))
|
||||||
|
.or_else(|_| {
|
||||||
|
chrono::NaiveDateTime::parse_from_str(timestamp, "%Y-%m-%d %H:%M:%S")
|
||||||
|
.map(|ndt| ndt.and_utc())
|
||||||
|
});
|
||||||
|
|
||||||
|
let dt = match parsed {
|
||||||
|
Ok(dt) => dt,
|
||||||
|
Err(_) => return timestamp.to_string(),
|
||||||
|
};
|
||||||
|
|
||||||
|
let now = chrono::Utc::now();
|
||||||
|
let duration = now.signed_duration_since(dt);
|
||||||
|
|
||||||
|
if duration.num_seconds() < 0 {
|
||||||
|
return "Just now".to_string();
|
||||||
|
}
|
||||||
|
|
||||||
|
if duration.num_seconds() < 60 {
|
||||||
|
"Just now".to_string()
|
||||||
|
} else if duration.num_minutes() < 60 {
|
||||||
|
let m = duration.num_minutes();
|
||||||
|
format!("{} min ago", m)
|
||||||
|
} else if duration.num_hours() < 24 {
|
||||||
|
let h = duration.num_hours();
|
||||||
|
format!("{} hr ago", h)
|
||||||
|
} else if duration.num_days() == 1 {
|
||||||
|
"Yesterday".to_string()
|
||||||
|
} else if duration.num_days() < 7 {
|
||||||
|
format!("{} days ago", duration.num_days())
|
||||||
|
} else if duration.num_weeks() == 1 {
|
||||||
|
"Last week".to_string()
|
||||||
|
} else if duration.num_days() < 30 {
|
||||||
|
format!("{} weeks ago", duration.num_weeks())
|
||||||
|
} else if duration.num_days() < 60 {
|
||||||
|
"Last month".to_string()
|
||||||
|
} else {
|
||||||
|
format!("{} months ago", duration.num_days() / 30)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a screen-reader live region announcement.
|
/// Create a screen-reader live region announcement.
|
||||||
/// Inserts a hidden label with AccessibleRole::Alert into the given container,
|
/// Inserts a hidden label with AccessibleRole::Alert into the given container,
|
||||||
/// which causes AT-SPI to announce the text to screen readers.
|
/// which causes AT-SPI to announce the text to screen readers.
|
||||||
|
|||||||
Reference in New Issue
Block a user