やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Rust自習(std::time::Duration)

 時間(span)を表す。

成果物

生成: new()

fn main() {
    let du = std::time::Duration::new(1, 0);
    println!("{:?}", du);
}
$ cargo run
...
1s

秒数・ナノ秒の取得: as_secs(), subsec_nanos()

fn main() {
    let du = std::time::Duration::new(1, 0);
    println!("{:?}", du);
    println!("{:?}", du.as_secs());
    println!("{:?}", du.subsec_nanos());
}
$ cargo run
...
1s
1
0

 他にもas_millis(), as_micros(), as_nanos(), subsec_millis(), subsec_micros()があるが同じことなので省略。

数値→Duration: from_secs()

fn main() {
    let du = std::time::Duration::from_secs(1);
    println!("{:?}", du);
    println!("{:?}", du.as_secs());
    println!("{:?}", du.subsec_nanos());
}
$ cargo run
...
1s
1
0

 ナノ秒単位なら以下。

fn main() {
    let du = std::time::Duration::from_nanos(12345678901);
    println!("{:?}", du);
    println!("{:?}", du.as_secs());
    println!("{:?}", du.subsec_nanos());
}
$ cargo run
...
12.345678901s
12
345678901

 他にもfrom_millis(), from_micros()があるが同じことなので省略。

加算・減算

fn main() {
    let du = std::time::Duration::from_secs(1) + std::time::Duration::from_nanos(234567890);
    println!("{:?}", du);
    println!("{:?}", du.as_secs());
    println!("{:?}", du.subsec_nanos());

    let du = std::time::Duration::from_secs(5) - std::time::Duration::from_secs(2); // thread 'main' panicked at 'overflow when subtracting durations'
    println!("{:?}", du);
    println!("{:?}", du.as_secs());
    println!("{:?}", du.subsec_nanos());
}
1.23456789s
1
234567890
3s
3
0

 なお、減算は負数になるとエラーになる。

    let du = std::time::Duration::from_secs(1) - std::time::Duration::from_secs(2);
thread 'main' panicked at 'overflow when subtracting durations', src/libcore/option.rs:1036:5
note: Run with `RUST_BACKTRACE=1` environment variable to display a backtrace.

まとめ

単位系

単位
secs 1
millis 10^-3
micros 10^-6
nanos 10^-9

 それぞれに以下メソッドがある。

単位系メソッド 意味
as_ 各単位における整数値を返す
from_ 各単位における整数値からDurationを生成して返す
subsec_ 各単位における整数値からその時間を減らした整数値を返す

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux

前回まで