Rust中如何格式化SystemTime

在Rust中,如何将SystemTime格式化为可读的日期时间字符串?比如我想把它转换成"YYYY-MM-DD HH:MM:SS"这样的格式。有没有标准库的方法可以直接实现,或者需要借助第三方库?如果能给出示例代码就更好了。

2 回复

format!配合SystemTime::now(),比如:

use std::time::SystemTime;
let now = SystemTime::now();
println!("{:?}", now);

或者转成DateTimechrono库格式化。


在 Rust 中,可以使用 std::time::SystemTime 来获取系统时间,但 SystemTime 本身不直接提供格式化方法。要格式化 SystemTime,通常需要将其转换为 std::time::Durationchrono 库中的类型。以下是两种常用方法:

1. 使用标准库(转换为 UNIX 时间戳)

SystemTime 转换为自 UNIX 纪元以来的秒数,然后使用 chrono 库进行格式化(推荐):

use std::time::{SystemTime, UNIX_EPOCH};
use chrono::{DateTime, Utc, TimeZone};

fn main() {
    let now = SystemTime::now();
    let since_epoch = now.duration_since(UNIX_EPOCH).expect("Time went backwards");
    
    // 转换为 DateTime<Utc>
    let datetime: DateTime<Utc> = Utc.timestamp(since_epoch.as_secs() as i64, since_epoch.subsec_nanos());
    
    // 格式化输出
    let formatted = datetime.format("%Y-%m-%d %H:%M:%S").to_string();
    println!("{}", formatted); // 例如:2023-10-05 14:30:00
}

2. 直接使用 chrono 库(更简洁)

如果项目已依赖 chrono,可以直接用 chrono::Utc::now() 获取当前时间并格式化:

use chrono::{Utc, DateTime};

fn main() {
    let now: DateTime<Utc> = Utc::now();
    let formatted = now.format("%Y-%m-%d %H:%M:%S").to_string();
    println!("{}", formatted);
}

格式化说明:

  • %Y:年份(4 位数)
  • %m:月份(01-12)
  • %d:日期(01-31)
  • %H:小时(00-23)
  • %M:分钟(00-59)
  • %S:秒(00-59)

注意事项:

  • 使用 chrono 需在 Cargo.toml 中添加依赖:chrono = { version = "0.4", features = ["serde"] }
  • 如果仅需简单时间戳,可用 since_epoch.as_secs() 直接获取秒数。

选择哪种方法取决于项目需求和对第三方库的依赖偏好。

回到顶部