Як я можу отримати поточний час у мілісекундах?


84

Як я можу отримати поточний час у мілісекундах, як я в Java?

System.currentTimeMillis()

Відповіді:


114

Починаючи з 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 : Не існує методу, щоб отримати мить "кількість секунд". Натомість це дозволяє лише вимірювати тривалість між двома моментами (або порівнювати два моменти).
Шепмастер

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_millisдо Duration.
Робінст,

Ви можете замовити doc.rust-lang.org/1.8.0/std/time/ ..., якщо хочете тривалість.
vinyll

Викликано u128 is not supported.
Педро Паулу Аморім,

16

Ви можете використовувати ящик часу :

extern crate time;

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

Він повертає значення, Tmяке ви можете отримати якою завгодно точністю.


2
Ці precise_time_...функції з цього ящика також важливі, якщо один тільки хочуть виміряти відносний час.
huon

як отримати мілісекунди?
ア レ ッ ク ス

1
Ви повинні використовувати time::now_utc()або time::get_time()оскільки System.currentTimeMillis () Java повертає час UTC. Я б написавlet timespec = time::get_time(); let mills = timespec.sec + timespec.nsec as i64 / 1000 / 1000;
Nándor Krácser

1
time ::preci_time_ns () та time ::preci_time_s ()
tyoc213,

5
Зараз цей ящик застарів. chronoЗамість цього використовуйте ящик.
Ondrej Slinták

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 і розділити nsec на 1000 менше (як це роблять інші відповіді правильно).
суперечить

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

4

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

У Rust ми маємо, time::get_time()що повертає a 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 ()


Посилання на ящик недійсне.
Ixx
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.