有没有一种方法可以将时区缩写解析为Rust中的时区偏移量?

Ted*_*ton 0 timezone rust timezone-offset chrono-tz

在Rust中,有没有一种方法可以将时区缩写(如ESTMDT)解析为时区偏移量(例如-5小时或-7小时)?该chrono_tz箱子看起来几乎要做到这一点,但并不完全。

har*_*mic 5

您可以使用chrono_tz,方法是从UTC的同一时间减去请求的时区中的时间:

use chrono::TimeZone;
use chrono_tz::Tz;
use chrono_tz::UTC;

fn main() {

    let tz: Tz = "Australia/Melbourne".parse().unwrap();
    let dt = tz.ymd(2019, 05, 09).and_hms(12, 0, 0);
    let utc = UTC.ymd(2019, 05, 09).and_hms(12, 0, 0);
    let offset = utc - dt;
    println!("offset = UTC{:+02}:{:02}", offset.num_hours(), offset.num_minutes() % 60);

}
Run Code Online (Sandbox Code Playgroud)

结果是一个Duration,从中可以提取小时,分钟等。上面的示例给出了输出:

offset = UTC+10:00
Run Code Online (Sandbox Code Playgroud)

请注意,chrono-tz(由IANA TZ数据库提供)支持的时区没有描述固定的偏移量。而是数据库包含一组规则,描述每个时区的夏时制转换时间。因此,您只能通过提供您想知道偏移量的时间来准确获取偏移量(在我的示例中为2019-05-09 12:00:00)。

对于UTC的固定偏移量,还有一组缩写。这些没有很好的标准化,实际上,相同的缩写在不同国家可能意味着不同的含义。对于这些,最好为您要支持的缩写集创建一个简单的查找表。

  • 谢谢@harmic - 我知道 chrono-tz,但不幸的是我需要处理的是这些缩写。我并不完全确定它们的出处或标准化水平 - 令人失望的是我必须支持的协议使用它们。我将采纳您的建议并仅使用本地查找来查找这些内容。 (2认同)