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

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

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

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

let naive_date = NaiveDate::parse_from_str(date, "%d/%m/%Y").unwrap()

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

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

推荐答案

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

然后可以使用FixedOffset构建DateTime:

let dt_with_tz: DateTime<FixedOffset> = tz_offset.from_local_datetime(&datetime).unwrap();

如果需要将其转换为DateTime<Utc>,可以执行以下操作:

let dt_with_tz_utc: DateTime<Utc> = Utc.from_utc_datetime(&dt_with_tz.naive_utc());

Rust相关问答推荐

如何将元素添加到向量并返回对该元素的引用?

值为可变对象的不可变HashMap

在不重写/专门化整个函数的情况下添加单个匹配手臂到特征的方法?

有没有办法避免在While循环中多次borrow `*分支`

同时从不同线程调用DLL的不同函数会出现分段错误或产生STATUS_STACK_BUFFER_OVERRUN

如何删除Mac Tauri上的停靠图标?

为什么这个变量不需要是可变的?

如果变量本身不是None,如何返回;如果没有,则返回None&Quot;?

为什么rustc会自动降级其版本?

如何对一个特征的两个实现进行单元测试?

在使用粗粒度锁访问的数据 struct 中使用 RefCell 是否安全?

Rust 中的复合 `HashSet` 操作或如何在 Rust 中获得 `HashSet` 的显式差异/并集

将多维数组转换为切片

部署Rust发布二进制文件的先决条件

Rust编译器通过哪些规则来确保锁被释放?

在给定 Rust 谓词的情况下,将 Some 转换为 None 的惯用方法是什么?

如何在 Rust 中将 bson::Bson 转换为 Vec

为什么 File::read_to_end 缓冲区容量越大越慢?

为什么 &i32 可以与 Rust 中的 &&i32 进行比较?

如何异步记忆选项中的 struct 字段