rust 从NaiveDateTime转换为DateTime < Local>[duplicate]

2ledvvac  于 2023-05-17  发布在  其他
关注(0)|答案(1)|浏览(162)

此问题已在此处有答案

How do I go from a NaiveDate to a specific TimeZone with Chrono?(3个答案)
3年前关闭。
Rust的chrono非常令人沮丧,因为它使时区转换非常困难。
例如:我的用户输入一个字符串。我使用NaiveDateTime::parse_from_str将其解析为一个简单的日期时间。现在我想把它转换成一个DateTime<Local>
不幸的是,我似乎不知道如何做到这一点。使用Local::From不起作用。使用DateTime<Local>::from()也不起作用。这两个结构都没有从NaiveDateTime转换的方法,NaiveDateTime也没有转换为Local的方法。
然而,我们可以这样做:someLocalDateTime.date().and_time(some_naive_time)。那么为什么我们不能直接做Local::new(some_naive_date_time)呢?
另外,为什么我们不能在解析中跳过字段?我不需要秒也不需要年。为了假设当前的年份和0秒,我必须手动编写解析代码并从ymd hms构造日期时间。

cs7cruho

cs7cruho1#

此功能由the chrono::offset::TimeZone trait提供。具体来说,方法TimeZone::from_local_datetime几乎就是您要查找的。

use chrono::{offset::TimeZone, DateTime, Local, NaiveDateTime};

fn main() {
    let naive = NaiveDateTime::parse_from_str("2020-11-12T5:52:46", "%Y-%m-%dT%H:%M:%S").unwrap();
    let date_time: DateTime<Local> = Local.from_local_datetime(&naive).unwrap();
    println!("{:?}", date_time);
}

(playground)
至于另一个关于使用假设进行解析的问题,我不确定工具是否存在。如果ParseResult允许您在解包(或您有什么)结果之前手动设置特定值,那将是很酷的。
一个让您仍然使用chrono的解析器的想法是手动将额外的字段添加到解析字符串中。
例如:

use chrono::{offset::TimeZone, DateTime, Datelike, Local, NaiveDateTime};

fn main() {
    let time_string = "11-12T5:52"; // no year or seconds
    let current_year = Local::now().year();
    let modified_time_string = format!("{}&{}:{}", time_string, current_year, 0);

    let naive = NaiveDateTime::parse_from_str(&modified_time_string, "%m-%dT%H:%M&%Y:%S").unwrap();
    let date_time: DateTime<Local> = Local.from_local_datetime(&naive).unwrap();
    println!("{:?}", date_time); // prints (as of 2020) 2020-11-12T05:52:00+00:00
}

(playground)

相关问题