如何将 chrono `DateTime<UTC>` 实例转换为 `DateTime<Local>`?

How do I convert a chrono `DateTime<UTC>` instance to `DateTime<Local>`?

我的目标是将 utc 转换为 loc:

use chrono::{Local, UTC, TimeZone};

let utc = chrono::UTC::now();
let loc = chrono::Local::now();

println!("{:?}", utc);
println!("{:?}", loc);

println!("{:?}", utc.with_timezone(&Local));
println!("{:?}", Local.from_utc_datetime(&utc.naive_local()));

...产生以下输出:

2015-02-26T16:22:27.873593Z
2015-02-26T17:22:27.873663+01:00
2015-02-26T15:22:27.873593+00:00
2015-02-26T15:22:27.873593+00:00

第二行显示的loc时间是我转换的时候想看到的utc.

如何正确地将 DateTime<UTC> 实例转换为 DateTime<Local>

我正在使用 chrono 0.2.2. In the DateTime.from_utc 方法,它甚至告诉我应该使用 TimeZone 特征。但是,我遗漏了一些东西。

糟糕,感谢您的报告。这是一个错误并已注册为问题 #26。这应该在 Chrono 0.2.3 中修复。

除了bug,utc.with_timezone(&Local)确实是一个正确的转换为本地时间的方法。有一个重要的标识,utc.with_timezone(&Local).with_timezone(&UTC)应该等于utc(例外情况除外,本地时区已更改)。

从 chrono 0.4.7 开始,您可以使用 from trait 以更简单的方式在它们之间进行转换:

use chrono::prelude::*;

fn main() {
    let utc = Utc::now();
    let local = Local::now();
    let converted: DateTime<Local> = DateTime::from(utc);
}