現在の時刻をミリ秒単位で取得するにはどうすればよいですか?


86

Javaの場合と同様に、現在の時刻をミリ秒単位で取得するにはどうすればよいですか?

System.currentTimeMillis()

回答:


118

Rust 1.8以降、クレートを使用する必要はありません。代わりに、使用することができますSystemTimeUNIX_EPOCH

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

fn main() {
    let start = SystemTime::now();
    let since_the_epoch = start
        .duration_since(UNIX_EPOCH)
        .expect("Time went backwards");
    println!("{:?}", since_the_epoch);
}

正確にミリ秒が必要な場合は、を変換できますDuration

さび1.33

let in_ms = since_the_epoch.as_millis();

さび1.27

let in_ms = since_the_epoch.as_secs() as u128 * 1000 + 
            since_the_epoch.subsec_millis() as u128;

さび1.8

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

なぜインスタントではなくシステムタイムなのか?
アンディ・ヘイデン

2
@AndyHaydenのドキュメントをInstant読み直したいと思うかもしれません
シェップマスター

36

ミリ秒単位で単純なタイミングを実行したい場合は、次を使用できます。 std::time::Instantように。

use std::time::Instant;

fn main() {
    let start = Instant::now();

    // do stuff

    let elapsed = start.elapsed();

    // Debug format
    println!("Debug: {:?}", elapsed); 

    // Format as milliseconds rounded down
    // Since Rust 1.33:
    println!("Millis: {} ms", elapsed.as_millis());

    // Before Rust 1.33:
    println!("Millis: {} ms",
             (elapsed.as_secs() * 1_000) + (elapsed.subsec_nanos() / 1_000_000) as u64);
}

出力:

Debug: 10.93993ms
Millis: 10 ms
Millis: 10 ms

参照してくださいRFCの問題1545を追加するためas_millisDuration
robinst 2017年

期間が必要な場合は、doc.rust-lang.org / 1.8.0 / std / time /…をチェックアウトすることをお勧めします。
Vinyll 2017年

原因u128 is not supported
ペドロパウロアモリ

17

あなたはタイムクレートを使うことができます:

extern crate time;

fn main() {
    println!("{}", time::now());
}

それはTmあなたが望むどんな精度でも得ることができるを返します。


2
precise_time_...相対時間を測定したいだけの場合は、そのクレートの関数も関連しています。
huon 2014年

ミリ秒を取得するにはどうすればよいですか?
アレックス

1
JavaのSystem.currentTimeMillis()がUTC時刻を返すため、time::now_utc()またはを使用する必要time::get_time()があります。私は書くでしょうlet timespec = time::get_time(); let mills = timespec.sec + timespec.nsec as i64 / 1000 / 1000;
NándorKrácser

1
time :: Precision_time_ns()およびtime :: Precision_time_s()
tyoc213 2016年

5
このクレートは非推奨になりました。chrono代わりに木枠を使用してください。
オンドレイSlinták

13

私はconnectのクロノで明確な解決策を見つけました:

use chrono::prelude::*;

pub fn get_unix_timestamp_ms() -> i64 {
    let now = Utc::now();
    now.timestamp_millis()
}

pub fn get_unix_timestamp_us() -> i64 {
    let now = Utc::now();
    now.timestamp_nanos()
}

6
extern crate time;

fn timestamp() -> f64 {
    let timespec = time::get_time();
    // 1459440009.113178
    let mills: f64 = timespec.sec as f64 + (timespec.nsec as f64 / 1000.0 / 1000.0 / 1000.0);
    mills
}

fn main() {
    let ts = timestamp();
    println!("Time Stamp: {:?}", ts);
}

さび遊び場


これは、System.currentTimeMillis()と同じ値を返しません
josehzz 2016

確かに、それは秒単位で時間を返します。ミリ秒を取得するには、秒を1000で乗算し、n秒を1000で除算する必要があります(他の回答が正しく行うように)。
矛盾


4

System.currentTimeMillis() in Javaは、現在の時刻と1970年1月1日の深夜0時との差をミリ秒単位で返します。

Rustにtime::get_time()は、Timespec、1970年1月1日の深夜からの現在の時刻を秒単位でオフセットをナノ秒単位。

例(Rust 1.13を使用):

extern crate time; //Time library

fn main() {
    //Get current time
    let current_time = time::get_time();

    //Print results
    println!("Time in seconds {}\nOffset in nanoseconds {}",
             current_time.sec, 
             current_time.nsec);

    //Calculate milliseconds
    let milliseconds = (current_time.sec as i64 * 1000) + 
                       (current_time.nsec as i64 / 1000 / 1000);

    println!("System.currentTimeMillis(): {}", milliseconds);
}

参照:タイムクレートSystem.currentTimeMillis()


クレートへのリンクが無効です。
からIxx

0

@Shepmasterが述べたように、これはSystem.currentTimeMillis()RustのJavaと同等です。

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

fn get_epoch_ms() -> u128 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_millis()
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.