Jak mogę sprawdzić aktualny czas w milisekundach?


86

Jak mogę uzyskać bieżący czas w milisekundach, tak jak w Javie?

System.currentTimeMillis()

Odpowiedzi:


118

Od wersji Rust 1.8 nie musisz używać skrzynki. Zamiast tego możesz użyć SystemTimei 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);
}

Jeśli potrzebujesz dokładnie milisekund, możesz przekonwertować plik Duration.

Rdza 1,33

let in_ms = since_the_epoch.as_millis();

Rdza 1.27

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

Rdza 1.8

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

Dlaczego czas systemowy zamiast natychmiastowego?
Andy Hayden

2
@AndyHayden możesz ponownie przeczytać dokumentację dlaInstant : Nie ma metody na uzyskanie „liczby sekund” w jednej chwili. Zamiast tego pozwala tylko mierzyć czas trwania między dwoma momentami (lub porównywać dwa momenty).
Shepmaster

36

Jeśli chcesz po prostu mierzyć czas z milisekundami, możesz użyć std::time::Instanttego:

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);
}

Wynik:

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

Zobacz także wydanie RFC 1545 dotyczące dodawania as_millisdo Duration.
robinst

Możesz sprawdzić doc.rust-lang.org/1.8.0/std/time/ ... jeśli chcesz czas trwania.
vinyll

Spowodowane u128 is not supported.
Pedro Paulo Amorim

17

Możesz użyć skrzynki czasu :

extern crate time;

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

Zwraca wartość, Tmktórą możesz uzyskać dowolną precyzję.


2
Te precise_time_...funkcje z tej skrzyni są również istotne, jeśli ktoś po prostu chce się mierzyć czasy względne.
huon

jak uzyskać milisekundy?
ア レ ッ ク ス

1
Musisz użyć time::now_utc()lub, time::get_time()ponieważ System.currentTimeMillis () języka Java zwraca czas UTC. Chciałbym napisaćlet timespec = time::get_time(); let mills = timespec.sec + timespec.nsec as i64 / 1000 / 1000;
Nandora Krácser

1
time :: exact_time_ns () and time :: exact_time_s ()
tyoc213

5
Ta skrzynka jest teraz przestarzała. chronoZamiast tego użyj skrzynki.
Ondrej Slinták

13

Znalazłem jasne rozwiązanie z chrono w coinnect :

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);
}

Rust Playground


To nie zwraca tej samej wartości co System.currentTimeMillis ()
josehzz

To prawda, że ​​zwraca czas w sekundach. Aby uzyskać milis, musisz pomnożyć sekundę przez 1000 i podzielić nsek przez 1000 mniej (jak w przypadku innych odpowiedzi).
zaprzeczył

@contradictioned play.rust-lang.org/…
Zijun Luo

4

System.currentTimeMillis() w języku Java zwraca różnicę w milisekundach między bieżącą godziną a północą 1 stycznia 1970 r.

W Rust mamy time::get_time()która zwraca a Timespecz aktualnym czasem w sekundach i przesunięciem w nanosekundach od północy 1 stycznia 1970 roku.

Przykład (przy użyciu 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);
}

Odniesienie: skrzynka czasu , System.currentTimeMillis ()


Link do skrzynki jest nieprawidłowy.
Ixx

0

Jak wspomniał @Shepmaster, jest to odpowiednik Java System.currentTimeMillis()w Rust.

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

fn get_epoch_ms() -> u128 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_millis()
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.