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_secsはDurationのメソッド。ほかにも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 }
SystemTimeにDurationを加算・減算して、新しいSystemTimeをつくる。
所感
エポックタイムだけを扱うなら十分。だが、タイムゾーンはないし、書式を指定して文字列化もできない。
参考
std::time::SystemTimeの存在はchronoのページで知った。というか、Rust公式で標準モジュールの紹介ページとかないの? APIドキュメント見るしかないのか。
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- rustc 1.36.0 (a53f9df32 2019-07-03)
- cargo 1.36.0 (c4fcfb725 2019-05-15)
$ uname -a Linux raspberrypi 4.19.42-v7+ #1219 SMP Tue May 14 21:20:58 BST 2019 armv7l GNU/Linux
前回まで
- Rust学習まとめ(ドキュメント)
- Rust自習(じゃんけんゲーム1)
- Rust自習(双方向リスト1)
- Rust自習(単方向リスト1)
- Rust自習(単方向リスト2)
- Rust自習(単方向リスト3)
- Rust自習(単方向リスト4)
- Rust自習(単方向リスト5)
- Rust自習(単方向リスト6)
- Rust自習(単方向リスト7)
- Rust自習(リストのインタフェースを考える)
- Rust自習(連結リスト1)
- Rust自習(連結リスト2)
- Rust自習(連結リスト3)
- Rust自習(連結リスト4)
- Rust自習(連結リストの取得系インタフェース考察)
- Rust自習(連結リスト5)
- Rust自習(連結リストの取得系インタフェース考察2)
- Rust自習(連結リスト6)
- Rust自習(連結リスト7)
- Rust自習(連結リスト8)
- Rust自習(連結リスト9)
- Rust自習(変数名でイテレートする方法)
- Rust自習(iter、iter_mut実装方法)
- Rust自習(連結リスト10)
- Rust自習(rev()実装できず)
- Rust自習(cycle()実装できず)
- Rust自習(じゃんけんゲーム2)
- Rust自習(じゃんけんゲーム3)
- Rust自習(じゃんけんゲーム4)
- Rust自習(じゃんけんゲーム5)
- Rust自習(じゃんけんゲーム6)
- Rust自習(じゃんけんゲーム7)
- Rust自習(じゃんけんゲーム8)
- Rustのアップデート(rustup update)
- Rust自習(SQLite3 1)
- Rust自習(SQLite3 2)
- Rust自習(SQLite3 3)
- Rust自習(日時 1 chrono)
- Rust自習(日時 2 chrono)
- Rust自習(日時 3 chrono)
- Rust自習(日時 4 chrono)
- Rust自習(日時 5 chrono)
- Rust自習(日時 6 chrono)
- Rust自習(日時 7 chrono)