如何获取当前时间(以毫秒为单位)?


84

我如何像Java中那样以毫秒为单位获取当前时间?

System.currentTimeMillis()

Answers:


114

从Rust 1.8开始,您不需要使用板条箱。相反,您可以使用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);
}

如果您需要精确到毫秒,则可以转换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 '19

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_millisDuration
罗宾斯特

如果需要持续时间,您可能需要签出doc.rust-lang.org/1.8.0/std/time/…
–vinyl

造成的u128 is not supported
Pedro Paulo Amorim,

16

您可以使用时间板条箱

extern crate time;

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

它返回一个Tm,您可以获得所需的任何精度。


2
precise_time_...如果只希望测量相对时间,则该包装箱中的功能也很重要。
休恩2014年

如何获得毫秒?
アレックス

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ándorKrácser

1
time :: precise_time_ns()和time :: precise_time_s()
tyoc213

5
现在不建议使用此板条箱。请改用chrono板条箱。
OndrejSlintá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

是的,它确实以秒为单位返回时间。为了获得毫秒,您必须将sec乘以1000,然后将nsec除以1000(与其他答案正确地一样)。
矛盾

@contradictioned play.rust-lang.org/...
子君罗

4

System.currentTimeMillis() Java中的int返回当前时间与1970年1月1日午夜之间的毫秒差。

在Rust中,我们time::get_time()返回了一个Timespec以秒为单位的当前时间,以及自1970年1月1日午夜以来的偏移量(以纳秒为单位)。

示例(使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.