如何在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
相关产品推荐
相关产品推荐

