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

アレッ*_*ックス 54 rust

如何在Java中获得当前时间(以毫秒为单位)?

System.currentTimeMillis()
Run Code Online (Sandbox Code Playgroud)

She*_*ter 73

从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);
}
Run Code Online (Sandbox Code Playgroud)

如果你需要精确的毫秒,你可以转换Duration.

铁锈1.33

let in_ms = since_the_epoch.as_millis();
Run Code Online (Sandbox Code Playgroud)

Rust 1.27

let in_ms = since_the_epoch.as_secs() as u128 * 1000 + 
            since_the_epoch.subsec_millis() as u128;
Run Code Online (Sandbox Code Playgroud)

Rust 1.8

let in_ms = since_the_epoch.as_secs() * 1000 +
            since_the_epoch.subsec_nanos() as u64 / 1_000_000;
Run Code Online (Sandbox Code Playgroud)

  • 为什么是系统时间而不是即时时间? (2认同)
  • @AndyHayden,您可能希望重新阅读[Instant`的文档](https://doc.rust-lang.org/std/time/struct.Instant.html):*没有方法可以获取“瞬间的秒数”。相反,它仅允许测量两个瞬间之间的持续时间(或比较两个瞬间)。* (2认同)
  • 啊,根据文档 `UNIX_EPOCH` 是 1970.000,UTC。所以我认为你不需要考虑时区。 (2认同)
  • @Dominic [如何安全且惯用地在数字类型之间进行转换?](/sf/ask/1979121861/)。据推测,持续时间可以表示比 64 位允许的更长的时间跨度。 (2认同)

rob*_*nst 20

如果你只想用毫秒做简单的时间,你可以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);
}
Run Code Online (Sandbox Code Playgroud)


Ste*_*nik 17

你可以使用时间箱:

extern crate time;

fn main() {
    println!("{}", time::now());
}
Run Code Online (Sandbox Code Playgroud)

它返回一个Tm你可以得到你想要的精度.

  • 该板条箱现已弃用。请改用“chrono”板条箱。 (6认同)
  • 如果只想测量相对时间,则来自该箱子的`precise_time _...`函数也是相关的. (2认同)
  • 我喜欢在每种编程语言中与时间相关的库不断被弃用。 (2认同)

小智 12

正如 @Shepmaster 提到的,这相当于System.currentTimeMillis()Rust 中的 Java。

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

fn get_epoch_ms() -> u128 {
    SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .unwrap()
        .as_millis()
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想要更精确,这似乎可以工作(返回小数毫秒): `SystemTime::now().duration_since(UNIX_EPOCH).unwrap().as_secs_f64() * 1000f64` (2认同)

Den*_*din 7

我发现有一个明确的解决方案时辰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()
}
Run Code Online (Sandbox Code Playgroud)


小智 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);
}
Run Code Online (Sandbox Code Playgroud)

铁锈游乐场


jos*_*hzz 5

System.currentTimeMillis() 在 Java 中返回当前时间与 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);
}
Run Code Online (Sandbox Code Playgroud)

参考:时间箱System.currentTimeMillis()


小智 5

似乎有一个简单的单行代码可以生成 a u128,这与 java 非常接近long

let timestamp = std::time::UNIX_EPOCH.elapsed().unwrap().as_millis()
Run Code Online (Sandbox Code Playgroud)

文档确实警告与 SystemTime 对象相关的时钟漂移,但我认为这不适用于此处,因为我们正在检查早先的时间点。