【问题标题】:Is there a way to parse a timezone abbreviation into a timezone offset in Rust?有没有办法将时区缩写解析为 Rust 中的时区偏移量?
【发布时间】:2019-09-26 18:01:37
【问题描述】:

有没有办法在 Rust 中将时区缩写(例如 ESTMDT)解析为时区偏移量(例如 -5 小时或 -7 小时)? chrono_tz crate 似乎几乎可以做到这一点,但并不完全如此。

【问题讨论】:

  • 您可以在crates.io 上查看它
  • 请记住,时区缩写不是标准化的(夏威夷同时使用 HST 或 HAST),也不是唯一的(CST 可能属于美国中部标准时间、古巴标准时间或中国标准时间) , 也不是所有时区都有 缩写(tzdb 区域中的许多区域只会将缩写显示为偏移量,如“+02”)。此外,某些语言使用的缩写与我们在英语中可能使用的缩写不同 - 例如英语中的 EST 或法语中的 HNE 在加拿大都用于同一区域。
  • 谢谢@MattJohnson - 下面的harmic 提到它们没有很好地标准化。我不知道——我想如果我在 ISO 8601 或类似标准中寻找它们,我会知道的。我支持的协议使用它们而不是数字偏移量,这很烦人。
  • 一些标准使用缩写,例如RFC 2822's obs-zone definition。尽管即使在那里它们也是“过时的”,因为它们最初是在较早的 RFC 822 中定义的,在这种冲突被很好地理解之前。

标签: rust timezone timezone-offset chrono-tz


【解决方案1】:

您可以使用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);

}

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

offset = UTC+10:00

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

还有一个 set of abbreviations 用于与 UTC 的固定偏移量。这些都没有很好的标准化,实际上相同的缩写在不同的国家可能意味着不同的东西。对于这些,您最好为要支持的缩写集制作一个简单的查找表。

【讨论】:

  • 谢谢@harmic - 我知道chrono-tz,但不幸的是我需要处理这些缩写。我并不完全确定它们的出处或标准化水平——令人失望的是,我必须支持的协议使用它们。我将听取您的建议,然后在本地查找这些内容。
猜你喜欢
  • 1970-01-01
  • 2021-12-05
  • 2013-10-15
  • 1970-01-01
  • 2020-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
相关资源
最近更新 更多