如何使用 Chrono 从 NaiveDate 转到特定时区?

Jus*_*ker 12 datetime rust c++-chrono

我正在使用chrono crate在 Rust 中解析日期和时间。日期和时间来自网站,其中日期和时间来自页面的不同部分。

日期以格式显示%d/%m/%Y(例如:27/08/2018)。时间仅显示小时(例如:12、10、21 等)

我想将这些日期时间存储为 UTC,以便我可以以“时区不可知”的方式计算从现在到给定日期时间的剩余时间。我知道这些日期时间来自哪个时区(巴黎时间)。

NaiveDate从日期输入创建了一个(这是一项正在进行的工作,所以还没有错误处理):

let naive_date = NaiveDate::parse_from_str(date, "%d/%m/%Y").unwrap()
Run Code Online (Sandbox Code Playgroud)

从那时起DateTime,考虑到我有一个带小时的字符串,获得 UTC 的最佳方法是什么?

我迷失在各种TimeZone/Offset特征中,不知道是否应该使用Local, 或FixedOffset然后转换为Utc.

Pet*_*all 13

Chrono 文档可能会得到改进,以便更容易找到如何做这些事情。

假设这是您的起点:

use chrono::{DateTime, FixedOffset, NaiveDate, NaiveDateTime, NaiveTime, TimeZone, Utc};

// The date you parsed
let date = NaiveDate::from_ymd(2018, 5, 13);
// The known 1 hour time offset in seconds
let tz_offset = FixedOffset::east(1 * 3600);
// The known time
let time = NaiveTime::from_hms(17, 0, 0);
// Naive date time, with no time zone information
let datetime = NaiveDateTime::new(date, time);
Run Code Online (Sandbox Code Playgroud)

然后您可以使用FixedOffset来构造一个DateTime

let dt_with_tz: DateTime<FixedOffset> = tz_offset.from_local_datetime(&datetime).unwrap();
Run Code Online (Sandbox Code Playgroud)

如果您需要将其转换为 a DateTime<Utc>,您可以这样做:

let dt_with_tz_utc: DateTime<Utc> = Utc.from_utc_datetime(&dt_with_tz.naive_utc());
Run Code Online (Sandbox Code Playgroud)

  • @Justmaker 这有点取决于您拥有什么信息。如果您知道当前时区是 UTC+0100,那么这很好。如果你知道你在巴黎,那么 `chrono-tz` 似乎更好。我仍然不确定您将如何保证为任意城市选择正确的时区? (3认同)

Jus*_*ker 8

我发现了chrono-tz并发现它更易于使用。例如:

pub fn create_date_time_from_paris(date: NaiveDate, time: NaiveTime) -> DateTime<Utc> {
    let naive_datetime = NaiveDateTime::new(date, time);
    let paris_time = Paris.from_local_datetime(&naive_datetime).unwrap();
    paris_time.with_timezone(&Utc)
}
Run Code Online (Sandbox Code Playgroud)