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

Mat*_*iel 9 iso8601 datetime-format rust

我有一个SystemTime变量,我想从那个日期获得 ISO 8601 格式。

She*_*ter 16

将其转换为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);
}
Run Code Online (Sandbox Code Playgroud)
2020-10-01T01:47:12.746202562+00:00
Run Code Online (Sandbox Code Playgroud)

该文档解释了方法的命名选择:

ISO 8601 允许对语法有一定的自由度,而 RFC 3339 则允许严格定义固定格式的自由度

也可以看看:

  • 您还可以使用以下 .format() 字符串来表示类似于 JavaScript 的 .toISOString() 函数的内容: `Utc::now().format("%Y-%m-%dT%H:%M:%S %.3fZ")` 得到类似这样的内容:`2022-12-29T00:00:00.000Z` Playground 链接:https://play.rust-lang.org/?version=stable&amp;mode=debug&amp;edition=2018&amp;gist=7cc9bcdc4022347b8a38bd81c84df3e9 (2认同)

Nov*_*zen 8

计时包是在这里工作的工具。 SystemTime可能是也可能不是 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"
}
Run Code Online (Sandbox Code Playgroud)

要以不同方式自定义格式,请参阅chrono::format::strftime文档。


Yen*_*ang 5

您还可以使用时间箱(doc)。使用最新的 alpha 版本 (0.3.0-ALPHA-0),您可以 format_into()在提供&mut impl io::Write. 或者,您可以简单地使用format()也与较旧的稳定版本兼容的方法。

use time::{
    format_description::well_known::Rfc3339, // For 0.3.0-alpha-0
    // Format::Rfc3339, // For 0.2 stable versions
    OffsetDateTime
};
use std::time::SystemTime;

fn to_rfc3339<T>(dt: T) -> String where T: Into<OffsetDateTime> {
    dt.into().format(&Rfc3339)
}

fn main() {
   let now = SystemTime::now();
   println!("{}", to_rfc3339(now));
}
Run Code Online (Sandbox Code Playgroud)

操场

您必须添加该formatting功能Cargo.toml才能使用format_into()(即在 v0.3+ 上格式化需要启用该功能)。

请注意,您还可以将您自己的格式strftime字符串指定为format/ format_into