【问题标题】:How do I get a Duration as a number of milliseconds in Rust如何在 Rust 中以毫秒为单位获得持续时间
【发布时间】:2019-01-02 00:39:39
【问题描述】:

我有一个time::Duration。我怎样才能得到这个持续时间表示的毫秒数作为一个整数?曾经有一个num_milliseconds() 函数,但它不再可用。

【问题讨论】:

标签: rust


【解决方案1】:

从 Rust 1.33.0 开始,有一个 as_millis() 函数:

use std::time::SystemTime;

fn main() {
    let now = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).expect("get millis error");
    println!("now millis: {}", now.as_millis());
}

从 Rust 1.27.0 开始,有一个 subsec_millis() 函数:

use std::time::SystemTime;

fn main() {
    let since_the_epoch = SystemTime::now().duration_since(SystemTime::UNIX_EPOCH).expect("get millis error");
    let seconds = since_the_epoch.as_secs();
    let subsec_millis = since_the_epoch.subsec_millis() as u64;
    println!("now millis: {}", seconds * 1000 + subsec_millis);
}

从 Rust 1.8 开始,有一个 subsec_nanos 函数:

let in_ms = since_the_epoch.as_secs() * 1000 +
            since_the_epoch.subsec_nanos() as u64 / 1_000_000;

另见:

【讨论】:

  • Rust 2018 与这个问题有什么关系?为什么要使用SystemTime 而不是直接使用Duration
  • Rust 新手;上述解决方案与更简单的解决方案相比有什么优势:duration.as_secs_f64() * 1000f64?它比duration.as_millis() 精确得多(即,它给我的结果类似于6.716969ms 而不仅仅是一个整数),同时比其他两个选项更简单。
【解决方案2】:

这是我想出的解决方案,就是将秒乘以十亿,再加上纳秒,然后除以 1e6。

let nanos = timeout_duration.subsec_nanos() as u64;
let ms = (1000*1000*1000 * timeout_duration.as_secs() + nanos)/(1000 * 1000);

【讨论】:

  • 我宁愿将秒数乘以 1000,然后加上 nanos/1000000。溢出风险更小。
  • subsec_nanos 不返回经过的纳秒数。它代表了 Duration 的精度。
  • @w.brian 文档doc.rust-lang.org/std/time/… 中的示例支持该方法以纳秒为单位返回持续时间的小数部分的事实,所以答案对我来说似乎是正确的。
【解决方案3】:

使用 crates.io 上 time crate 中的 time::Duration,它提供了一个 num_milliseconds() 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多