如何在Rust中将std::time::Duration格式化为字符串?
如何在Rust中格式化std::time::Duration为字符串
生成[SECONDS, NANOSECONDS]格式的字符串
std::time::Duration本身提供了直接获取秒数和纳秒部分的方法,结合format!宏就能轻松生成目标格式:
use std::time::Duration; fn main() { // 创建一个Duration实例:123秒 + 456789012纳秒 let duration = Duration::new(123, 456_789_012); // 拼接成目标格式字符串 let formatted = format!("[{}, {}]", duration.as_secs(), duration.subsec_nanos()); println!("{}", formatted); // 输出: [123, 456789012] }
其中:
as_secs()返回Duration包含的总秒数(类型为u64)subsec_nanos()返回不足1秒的纳秒部分(类型为u32,范围0~999_999_999)
其他常见格式化方式
带小数秒的格式(如"123.456789012s")
可以将纳秒部分转换为秒的小数位,或者直接补零拼接:
use std::time::Duration; fn format_with_decimal(dur: Duration) -> String { let secs = dur.as_secs(); let nanos = dur.subsec_nanos(); // 补零确保纳秒部分是9位 format!("{}.{:09}s", secs, nanos) } fn main() { let duration = Duration::new(123, 456_789_012); println!("{}", format_with_decimal(duration)); // 输出: 123.456789012s }
人类可读格式(天/时/分/秒/纳秒)
通过手动计算各时间单位的数值,生成更易读的字符串:
use std::time::Duration; fn format_human_readable(dur: Duration) -> String { let total_secs = dur.as_secs(); let days = total_secs / 86400; let hours = (total_secs % 86400) / 3600; let minutes = (total_secs % 3600) / 60; let seconds = total_secs % 60; let nanos = dur.subsec_nanos(); format!("{}d {}h {}m {}s {}ns", days, hours, minutes, seconds, nanos) } fn main() { let duration = Duration::new(123456, 789012345); println!("{}", format_human_readable(duration)); // 输出: 1d 10h 17m 36s 789012345ns }
如果需要更复杂的格式化逻辑,也可以使用humantime这类第三方库来简化开发(无需额外依赖时,手动计算的方式足够覆盖大部分场景)。
内容的提问来源于stack exchange,提问作者user2138149
相关产品推荐
相关产品推荐

