Skip to main content

systemprompt_models/
time_format.rs

1//! Human-readable timestamp and duration formatting.
2//!
3//! Display helpers for rendering [`DateTime<Utc>`] values, date ranges,
4//! period labels, and millisecond durations in dashboards and logs.
5//!
6//! Copyright (c) systemprompt.io — Business Source License 1.1.
7//! See <https://systemprompt.io> for licensing details.
8
9use chrono::{DateTime, Utc};
10
11pub fn format_timestamp(dt: DateTime<Utc>) -> String {
12    dt.format("%Y-%m-%d %H:%M:%S").to_string()
13}
14
15pub fn format_date(dt: DateTime<Utc>) -> String {
16    dt.format("%Y-%m-%d").to_string()
17}
18
19pub fn format_date_range(start: DateTime<Utc>, end: DateTime<Utc>) -> String {
20    format!("{} to {}", format_date(start), format_date(end))
21}
22
23pub fn format_duration_ms(ms: i64) -> String {
24    match ms {
25        ms if ms < 1000 => format!("{}ms", ms),
26        ms if ms < 60_000 => format!("{:.1}s", ms as f64 / 1000.0),
27        ms if ms < 3_600_000 => format!("{:.1}m", ms as f64 / 60_000.0),
28        _ => format!("{:.1}h", ms as f64 / 3_600_000.0),
29    }
30}
31
32pub fn format_optional_duration_ms(ms: Option<i64>) -> String {
33    ms.map_or_else(String::new, |d| format!(" ({}ms)", d))
34}
35
36pub fn format_period_label(dt: DateTime<Utc>, period: &str) -> String {
37    match period {
38        "hour" => dt.format("%Y-%m-%d %H:00").to_string(),
39        "day" => format_date(dt),
40        "week" => format!("Week of {}", format_date(dt)),
41        "month" => dt.format("%Y-%m").to_string(),
42        _ => format_timestamp(dt),
43    }
44}