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

8

之前有人问过如何将时间从UTC转换成本地时间的问题(参考链接)


我正在尝试将本地时间(Local)转换成UTC时间

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

let utc = chrono::UTC::now(); // 2019-07-04 15:13:19.014970700 
let local = chrono::Local::now(); // 2019-07-04 17:13:19.014970700 +03:00

我目前期望类似 local.to_utc() 的 API。或许我可以为这种转换实现一个 TryFrom trait。

我该如何将 Local 时间转换为 Utc 时间?

3个回答

8

从chrono 0.4.7版本开始,现在以一种更加简洁的方式来处理这个问题:

use chrono::prelude::*;

fn main() {
    let utc = Utc::now();
    let local = Local::now();
    let converted: DateTime<Utc> = DateTime::from(local);
    println!("{}\n{}", utc, converted);
}

这将输出以下内容:
2019-07-30 18:19:27.176827 UTC
2019-07-30 18:19:27.176836 UTC

5

Chrono提供了TimeZone特质,其中有一个方法from_local_datetime

use chrono::prelude::*;

fn main() {
    let local = Local::now();
    let utc = Utc
        .from_local_datetime(&local.naive_local())
        .single()
        .unwrap();

    dbg!(local.naive_local());
    dbg!(utc);
}

在我的本地机器上,它给我:

[src/main.rs:10] local.naive_local() = 2019-07-04T14:25:15.093909965
[src/main.rs:11] utc = 2019-07-04T12:25:15.093909965Z

3
你可以使用 chrono::DateTime::with_timezone 将任何一个 DateTime 转换为另一个时区。
它适用于实现了 TimeZone 的结构体: chrono::Local, chrono::Utcchrono_tz::Tz
例如:
#![forbid(unsafe_code)]
use chrono::{DateTime, Local, Utc};

fn main() {
    let local_now: DateTime<Local> = Local::now();
    let utc_now: DateTime<Utc> = local_now.with_timezone(&Utc);
    println!("local = {}", local_now);
    println!("utc = {}", utc_now);
}

$ cargo run --bin example
local = 2021-07-01 15:45:26.251802 -07:00
utc = 2021-07-01 22:45:26.251802 UTC

如果有人对相反的操作感兴趣,可以尝试使用local_dt = DateTime::<Utc>::from_utc(utc_dt, Utc).with_timezone(&Local); - joseluisq

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