You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Rust中获取自午夜以来的时长(秒、毫秒等)

在Rust中获取自午夜以来的时长

标准库的SystemTime仅支持基于UNIX纪元的时间计算,无法直接处理日期维度的午夜时间点。下面提供两种可行方案,覆盖不同场景需求:

方法一:使用chrono crate(推荐)

chrono是Rust生态中成熟的日期时间处理库,能轻松处理时区、日期转换,完美适配午夜时长计算需求。

步骤1:添加依赖

在Cargo.toml中引入chrono:

[dependencies]
chrono = "0.4"

步骤2:示例代码(本地时区)

use chrono::{Local, Datelike};

fn main() {
    let now = Local::now();
    // 获取今日午夜的本地时间点
    let midnight = now.date_naive().and_hms(0, 0, 0);
    // 计算当前时间与午夜的间隔
    let duration = now.naive_local() - midnight;

    // 转换为不同时间单位
    let seconds = duration.num_seconds();
    let milliseconds = duration.num_milliseconds();
    let microseconds = duration.num_microseconds().unwrap();
    let nanoseconds = duration.num_nanoseconds().unwrap();

    println!("自本地午夜以来:");
    println!("秒:{}", seconds);
    println!("毫秒:{}", milliseconds);
    println!("微秒:{}", microseconds);
    println!("纳秒:{}", nanoseconds);
}

如果需要基于UTC时区的午夜,只需将Local替换为Utc:

use chrono::{Utc, Datelike};

fn main() {
    let now = Utc::now();
    let midnight = now.date_naive().and_hms(0, 0, 0);
    let duration = now.naive_utc() - midnight;

    let seconds = duration.num_seconds();
    let milliseconds = duration.num_milliseconds();
    let microseconds = duration.num_microseconds().unwrap();
    let nanoseconds = duration.num_nanoseconds().unwrap();

    println!("自UTC午夜以来:");
    println!("秒:{}", seconds);
    println!("毫秒:{}", milliseconds);
    println!("微秒:{}", microseconds);
    println!("纳秒:{}", nanoseconds);
}

方法二:不依赖第三方库(手动计算)

如果不想引入外部依赖,可以通过时间戳差值计算,但这种方法需要手动处理时区偏移,且无法自动适配夏令时,仅建议用于简单场景。

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

fn main() {
    // 获取当前时间戳(秒级)
    let now_ts = SystemTime::now()
        .duration_since(UNIX_EPOCH)
        .expect("Time went backwards")
        .as_secs();

    // 计算本地午夜时间戳(需手动添加时区偏移,示例为东8区)
    const SECONDS_PER_DAY: u64 = 86400;
    const TIMEZONE_OFFSET: i64 = 8 * 3600; // 东8区偏移秒数
    let adjusted_ts = now_ts as i64 - TIMEZONE_OFFSET;
    let midnight_ts = ((adjusted_ts / SECONDS_PER_DAY as i64) * SECONDS_PER_DAY as i64) + TIMEZONE_OFFSET;

    // 计算时长并转换为各单位
    let duration = Duration::from_secs(now_ts - midnight_ts as u64);
    let seconds = duration.as_secs();
    let milliseconds = duration.as_millis();
    let microseconds = duration.as_micros();
    let nanoseconds = duration.as_nanos();

    println!("自本地午夜以来:");
    println!("秒:{}", seconds);
    println!("毫秒:{}", milliseconds);
    println!("微秒:{}", microseconds);
    println!("纳秒:{}", nanoseconds);
}

注意:手动计算方式存在时区适配缺陷,生产环境优先使用chrono库。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 04:36:15