Wie kann ich die aktuelle Zeit in Millisekunden abrufen?

84

Wie kann ich die aktuelle Zeit in Millisekunden wie in Java abrufen?

System.currentTimeMillis()
ア レ ッ ク ス
quelle

Antworten:

114

Seit Rust 1.8 müssen Sie keine Kiste mehr verwenden. Stattdessen können Sie verwenden SystemTimeund UNIX_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);
}

Wenn Sie genau Millisekunden benötigen, können Sie die konvertieren Duration.

Rost 1.33

let in_ms = since_the_epoch.as_millis();

Rost 1.27

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

Rost 1.8

let in_ms = since_the_epoch.as_secs() * 1000 +
            since_the_epoch.subsec_nanos() as u64 / 1_000_000;
Shepmaster
quelle
Warum Systemzeit statt sofort?
Andy Hayden
2
@AndyHayden Möglicherweise möchten Sie die DokumentationInstant erneut lesen für : Es gibt keine Methode, um "die Anzahl der Sekunden" von einem Augenblick an abzurufen. Stattdessen können Sie nur die Dauer zwischen zwei Zeitpunkten messen (oder zwei Zeitpunkte vergleichen).
Shepmaster
36

Wenn Sie nur einfache Timings mit den Millisekunden durchführen möchten, können Sie Folgendes verwenden 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);
}

Ausgabe:

Debug: 10.93993ms
Millis: 10 ms
Millis: 10 ms
robinst
quelle
Weitere Informationen zum Hinzufügen as_milliszu finden Sie in der RFC-Ausgabe 1545Duration .
Robinst
Sie können doc.rust-lang.org/1.8.0/std/time/… auschecken, wenn Sie die Dauer möchten.
Vinyll
Verursacht u128 is not supported.
Pedro Paulo Amorim
16

Sie können die Zeitkiste verwenden :

extern crate time;

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

Es gibt eine zurück, mit Tmder Sie die gewünschte Präzision erzielen können.

Steve Klabnik
quelle
2
Die precise_time_...Funktionen dieser Kiste sind auch relevant, wenn man nur die relativen Zeiten messen möchte.
Huon
Wie bekomme ich Millisekunden?
ス レ ッ ク
1
Sie müssen verwenden time::now_utc()oder time::get_time()da Javas System.currentTimeMillis () die UTC-Zeit zurückgibt. Ich würde schreibenlet timespec = time::get_time(); let mills = timespec.sec + timespec.nsec as i64 / 1000 / 1000;
Nándor Krácser
1
Zeit :: präzise_Zeit_ns () und Zeit :: präzise_Zeit_s ()
tyoc213
5
Diese Kiste ist jetzt veraltet. Verwenden Sie chronostattdessen eine Kiste.
Ondrej Slinták
13

Ich habe mit chrono in coinnect eine klare Lösung gefunden :

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()
}
DenisKolodin
quelle
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);
}

Rostspielplatz

Zijun Luo
quelle
Dies gibt nicht den gleichen Wert wie System.currentTimeMillis () zurück
josehzz
Es stimmt, es gibt die Zeit in Sekunden zurück. Um die Millis zu erhalten, müssen Sie sec mit 1000 multiplizieren und ns durch 1000 weniger dividieren (wie andere Antworten es richtig machen).
widersprach
@contradictioned play.rust-lang.org/…
Zijun Luo
4

System.currentTimeMillis() in Java gibt die Differenz in Millisekunden zwischen der aktuellen Zeit und Mitternacht, dem 1. Januar 1970, zurück.

In Rust haben wir eine, time::get_time()die a Timespecmit der aktuellen Zeit als Sekunden und dem Offset in Nanosekunden seit Mitternacht, dem 1. Januar 1970, zurückgibt .

Beispiel (mit 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);
}

Referenz: Zeitkiste , System.currentTimeMillis ()

josehzz
quelle
Der Link zur Kiste ist ungültig.
Ixx