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

如何让DateTime::parse_from_str()强制采用UTC时区解析时间?

解决方法

你的问题出在DateTime::parse_from_str要求解析的字符串包含时区信息,但你截取的24-03-15 18:21:24没有时区数据,导致无法生成带偏移的DateTime<FixedOffset>。由于NIST返回的时间默认是UTC时区,你可以通过以下两种方式解决:

方法一:先解析为无时区日期,再附加UTC时区

先把截取的字符串解析为NaiveDateTime(无时区的日期时间类型),再手动绑定UTC时区,生成符合要求的DateTime<FixedOffset>:

use chrono::{NaiveDateTime, DateTime, FixedOffset};
use std::process::Command;

async fn get_time_from_nist() -> Option<DateTime<FixedOffset>> {
    if let Ok(output) = Command::new("nc").arg("-w 1").arg("time.nist.gov").arg("13").output().await {
        if let Ok(str_out) = String::from_utf8(output.stdout) {
            let str_sub = &str_out[7..25];
            // 解析为无时区的NaiveDateTime
            if let Ok(naive_dt) = NaiveDateTime::parse_from_str(str_sub, "%y-%m-%d %H:%M:%S") {
                // 将无时区日期与UTC时区绑定
                let utc_dt = DateTime::from_utc(naive_dt, FixedOffset::utc());
                return Some(utc_dt);
            }
        }
    } 
    None
}

方法二:直接解析包含时区的完整片段

如果你想从NIST的原始输出中同时解析时间和时区,可以调整截取范围,把UTC(NIST)部分纳入解析:

use chrono::{DateTime, FixedOffset};
use std::process::Command;

async fn get_time_from_nist() -> Option<DateTime<FixedOffset>> {
    if let Ok(output) = Command::new("nc").arg("-w 1").arg("time.nist.gov").arg("13").output().await {
        if let Ok(str_out) = String::from_utf8(output.stdout) {
            // 截取包含时间和时区的有效片段
            let str_sub = str_out.trim_end_matches('*').trim().split_whitespace().skip(1).take(2).collect::<Vec<_>>().join(" ");
            // 用包含时区的格式字符串解析
            if let Ok(date) = DateTime::parse_from_str(&str_sub, "%y-%m-%d %H:%M:%S UTC(NIST)") {
                return Some(date);
            }
        }
    } 
    None
}

第一种方法更简洁高效,因为NIST时间服务返回的始终是UTC时间,直接绑定UTC偏移量即可,无需额外解析时区字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 20:12:47