如何在Rust中将SystemTime转换为ISO 8601?

问题描述

我有一个SystemTime变量,我想从该日期开始获取ISO 8601格式。

解决方法

chrono软件包是此处工作的正确工具。 SystemTime可能是UTC,也可能不是UTC,而chrono会处理许多令人烦恼的小细节。

use chrono::prelude::{DateTime,Utc};

fn iso8601(st: &std::time::SystemTime) -> String {
    let dt: DateTime<Utc> = st.clone().into();
    format!("{}",dt.format("%+"))
    // formats like "2001-07-08T00:34:60.026490+09:30"
}

要以其他方式自定义格式,请参见chrono::format::strftime文档。

,

将其转换为chrono::DateTime,然后使用to_rfc3339

use chrono::{DateTime,Utc}; // 0.4.15
use std::time::SystemTime;

fn main() {
    let now = SystemTime::now();
    let now: DateTime<Utc> = now.into();
    let now = now.to_rfc3339();

    println!("{}",now);
}
2020-10-01T01:47:12.746202562+00:00

方法的文档explain the naming choice

ISO 8601允许在语法和RFC 3339练习上有一定的自由度,以自由地严格定义固定格式

另请参阅: