やってみる

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

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

 標準モジュールにも時刻を扱うのがあったみたい。

成果物

コード

現在のエポックを生成する: now()

fn main() {
    let now = std::time::SystemTime::now();
    println!("{:?}", now);
}
$ cargo run
...
SystemTime { tv_sec: 1564098289, tv_nsec: 702339081 }

現在のエポックを取得する: as_secs()

fn main() {
    let now = std::time::SystemTime::now();
    println!("{:?}", now);
    if let Ok(epoch) = now.duration_since(std::time::SystemTime::UNIX_EPOCH) {
        println!("epoch = {}.{:09}", epoch.as_secs(), epoch.subsec_nanos())
    }
}
SystemTime { tv_sec: 1564099025, tv_nsec: 939518615 }
epoch = 1564099025.939518615

 as_secsDurationのメソッド。ほかにもas_millis, as_micros, as_nanosなどがある。残念ながら、minutes, hours, days, weeks, months, yearsなどの単位はない。

時間差: duration_since()

fn main() {
    let t1 = std::time::SystemTime::now();
    std::thread::sleep(std::time::Duration::new(1,0));
    let t2 = std::time::SystemTime::now();
    println!("{:?}", t1);
    println!("{:?}", t2);

    if let Ok(epoch) = t2.duration_since(t1) {
        println!("epoch = {}.{:09}", epoch.as_secs(), epoch.subsec_nanos())
    }
}
SystemTime { tv_sec: 1564100079, tv_nsec: 586393355 }
SystemTime { tv_sec: 1564100080, tv_nsec: 586512471 }
epoch = 1.000119116

 t1.duration_since(t2)だとErrが返ってきた。selfのほうが大きくないとエラーになるらしい。マイナス値で返して欲しかった。

経過時間: elapsed()

 生成してからの経過時間を返す。

fn main() {
    let t1 = std::time::SystemTime::now();
    std::thread::sleep(std::time::Duration::from_secs(1));
    println!("{:?}", t1);
    println!("{:?}", t1.elapsed());
    println!("{:?}", t1.elapsed().unwrap());
}
SystemTime { tv_sec: 1564100455, tv_nsec: 22052383 }
Ok(1.000162849s)
1.000183578s

加算・減算

fn main() {
    let t1 = std::time::SystemTime::now();
    println!("{:?}", t1);
    let d1 = std::time::Duration::from_secs(1);
    println!("{:?}", d1);
    let t2 = t1 + d1;
    println!("{:?}", t2);
    let t3 = t1 - d1;
    println!("{:?}", t3);
}
SystemTime { tv_sec: 1564101035, tv_nsec: 755497337 }
1s
SystemTime { tv_sec: 1564101036, tv_nsec: 755497337 }
SystemTime { tv_sec: 1564101034, tv_nsec: 755497337 }

 SystemTimeDurationを加算・減算して、新しいSystemTimeをつくる。

所感

 エポックタイムだけを扱うなら十分。だが、タイムゾーンはないし、書式を指定して文字列化もできない。

参考

 std::time::SystemTimeの存在はchronoのページで知った。というか、Rust公式で標準モジュールの紹介ページとかないの? APIドキュメント見るしかないのか。

対象環境

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

前回まで