Как я могу узнать текущее время в миллисекундах?

86

Как узнать текущее время в миллисекундах, как в Java?

System.currentTimeMillis()
ア レ ッ ク ス
источник

Ответы:

118

Начиная с Rust 1.8, вам не нужно использовать ящик. Вместо этого вы можете использовать SystemTimeи 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);
}

Если вам нужно ровно миллисекунды, вы можете преобразовать 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 : Не существует способа получить "количество секунд" с одного момента. Вместо этого он позволяет только измерять продолжительность между двумя моментами (или сравнивать два момента).
Shepmaster 01
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 issue 1545 для добавления as_millisв Duration.
Робинст
Вы можете проверить doc.rust-lang.org/1.8.0/std/time/…, если вам нужна продолжительность.
vinyll
Вызвано u128 is not supported.
Педро Пауло Аморим
17

Вы можете использовать ящик времени :

extern crate time;

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

Он возвращает, Tmкоторый вы можете получить с любой точностью.

Стив Клабник
источник
2
Эти precise_time_...функции из этого ящика также важны, если один только хотят измерить относительное время.
huon
как мне получить миллисекунды?
ア レ ッ ク ス
1
Вы должны использовать time::now_utc()или, time::get_time()поскольку Java System.currentTimeMillis () возвращает время в формате UTC. Я бы написалlet timespec = time::get_time(); let mills = timespec.sec + timespec.nsec as i64 / 1000 / 1000;
Nándor Krácser
1
time :: precision_time_ns () и time :: precision_time_s ()
tyoc213
5
Этот ящик устарел. chronoВместо этого используйте ящик.
Ондрей Слинтак
13

Я нашел четкое решение с хроно в 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);
}

Ржавчина Детская площадка

Цзыцзюнь Ло
источник
Это не возвращает то же значение, что и System.currentTimeMillis ()
josehzz
Правда, возвращает время в секундах. Чтобы получить миллис, вам нужно умножить сек на 1000 и разделить нс на 1000 меньше (как правильно делают другие ответы).
противоречит
@contrafficed play.rust-lang.org/…
Цзыцзюнь Луо
4

System.currentTimeMillis() в Java возвращает разницу в миллисекундах между текущим временем и полуночью 1 января 1970 года.

В Rust у нас есть функция, time::get_time()которая возвращает Timespecтекущее время в секундах и смещение в наносекундах с полуночи 1 января 1970 года.

Пример (с использованием 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 ()

Josehzz
источник
Ссылка на ящик недействительна.
Ixx
0

Как упоминал @Shepmaster, это эквивалент Java System.currentTimeMillis()в Rust.

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

fn get_epoch_ms() -> u128 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_millis()
}
Тамас Фольди
источник