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

18

我的目标是将 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

我想在转换 utc 时看到第二行显示的 loc 时间。

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

Meta

我正在使用 chrono 0.2.2。在 DateTime.from_utc 方法中,它甚至告诉我应该使用 TimeZone 特性。然而,我似乎还缺少一些东西。

2个回答

17

从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);
}

12

非常抱歉,感谢您的报告。这是一个bug,并已注册为问题#26。这个问题应该会在 Chrono 0.2.3 中得到解决。

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


谢谢!您能否调整您的答案,说明with_timezone是回答问题的方法?如果可以的话,我很乐意批准它。谢谢! - Byron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接