Làm cách nào để tính thời gian hiện tại tính bằng mili giây?


84

Làm cách nào tôi có thể lấy thời gian hiện tại tính bằng mili giây như tôi có thể làm trong Java?

System.currentTimeMillis()

Câu trả lời:


114

Kể từ Rust 1.8, bạn không cần sử dụng thùng. Thay vào đó, bạn có thể sử dụng 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);
}

Nếu bạn cần chính xác mili giây, bạn có thể chuyển đổi Duration.

Gỉ 1,33

let in_ms = since_the_epoch.as_millis();

Gỉ 1,27

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

Rust 1.8

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

Tại sao lại là thời gian hệ thống thay vì tức thời?
Andy Hayden,

2
@AndyHayden bạn có thể muốn đọc lại tài liệu vềInstant : Không có phương pháp nào để lấy "số giây" ngay lập tức. Thay vào đó, nó chỉ cho phép đo khoảng thời gian giữa hai phiên bản (hoặc so sánh hai phiên bản).
Shepmaster

36

Nếu bạn chỉ muốn tính thời gian đơn giản với mili giây, bạn có thể sử dụng std::time::Instantnhư sau:

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

Đầu ra:

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

Cũng xem vấn đề RFC 1545 để thêm as_millisvào Duration.
robinst

Bạn có thể muốn kiểm tra doc.rust-lang.org/1.8.0/std/time/… nếu bạn muốn thời lượng.
vinyll

Gây ra u128 is not supported.
Pedro Paulo Amorim

16

Bạn có thể sử dụng thùng thời gian :

extern crate time;

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

Nó trả về giá trị Tmmà bạn có thể nhận được bất kỳ độ chính xác nào bạn muốn.


2
Các precise_time_...chức năng từ thùng đó cũng có liên quan, nếu người ta chỉ muốn đo thời gian tương đối.
huon

làm cách nào để lấy mili giây?
ア レ ッ ク ス

1
Bạn phải sử dụng time::now_utc()hoặc time::get_time()vì System.currentTimeMillis () của Java trả về thời gian UTC. Tôi sẽ viếtlet timespec = time::get_time(); let mills = timespec.sec + timespec.nsec as i64 / 1000 / 1000;
Nándor Krácser

1
Hiện :: precise_time_ns () và thời gian :: precise_time_s ()
tyoc213

5
Thùng này hiện không được dùng nữa. Sử dụng chronothùng thay thế.
Ondrej Slinták

13

Tôi đã tìm thấy một giải pháp rõ ràng với chrono trong 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);
}

Sân chơi Rust


Điều này không trả về giá trị tương tự như System.currentTimeMillis ()
josehzz

Đúng, nó trả về thời gian tính bằng giây. Để có được mili, bạn phải nhân giây với 1000 và chia nsec cho ít hơn 1000 (như các câu trả lời khác làm đúng).
mâu thuẫn


4

System.currentTimeMillis() trong Java trả về sự khác biệt tính bằng mili giây giữa thời điểm hiện tại và nửa đêm, ngày 1 tháng 1 năm 1970.

Trong Rust, chúng tôi có time::get_time()trả về a Timespecvới thời gian hiện tại là giây và phần bù tính bằng nano giây kể từ nửa đêm, ngày 1 tháng 1 năm 1970.

Ví dụ (sử dụng 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);
}

Tham khảo: Time crate , System.currentTimeMillis ()


Liên kết đến thùng không hợp lệ.
Ixx
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.