2017-01-28 5 views
2

のWindows 10の64ビットで次のプログラムを実行している:Windowsでtime :: Durationのナノ秒値が100の最も近い倍数になるのはなぜですか?

use std::time::{Duration, UNIX_EPOCH}; 

fn main() { 
    let d = Duration::new(4660, 22136); 
    let t = UNIX_EPOCH + d; 
    let d2 = t.duration_since(UNIX_EPOCH).unwrap(); 
    println!("d: {:?}", d); 
    println!("d2: {:?}", d2); 
} 

なぜ100の倍数に最も近い床のナノ秒値はありますか?

d: Duration { secs: 4660, nanos: 22136 } 
d2: Duration { secs: 4660, nanos: 22100 } 

Windowsのファイル時間は100ナノ秒間隔で表されますが、この計算に影響する理由はわかりません。

+3

私はRustを知りませんが、ソースを熟読すると、 'UNIX_EPOCH'はSystemTimeです。Windowsの場合は' libstd/sys/windows/time.rs'に実装されています。 'add_duration'の実装は' dur2intervals'を呼び出します。これは明示的に[ナノ秒を100で割る](https://github.com/rust-lang/rust/blob/b1363a73ede57ae595f3a1be2bb75d308ba4f7f6/src/libstd/sys/windows/time.rs #L177)この問題を回避するには、追加する前にUNIX_EPOCHをインスタントに変換することがありますが、私は自分の深みを欠いています。 –

+0

@ Jordanもしそれが "錆を知らない"人の反応なら、あなたはいくつかの錆をやり始めなければならない!よく知られていないプログラミング言語のソースを熟読し、正解を得ることは難しいスキルです。 – Shepmaster

+0

@Shepmasterありがとう!実際に私はたくさんのRustの本を読んできました(私はそのようなオタクだから)、それはしばらくの間、私の学ぶべきリストのトップにいました。 –

答えて

3

DurationUNIX_EPOCHSystemTime)を追加すると、SystemTimeになります。

Windows-specific implementationsys::time::SystemTimeは、Windows FILETIME構造体に基づいています。

この構造has 100 nanosecond granularity

は、1601年1月1日(UTC)以降100ナノ秒間隔の数を表す64ビットの値を格納します。

おそらくFILETIMEの選択は、Windowsの世界で普及しているタイプであり、パフォーマンスと機能の優れた組み合わせを提供するためです。

関連する問題