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

3
有没有一种方法可以在Rust中解析时区缩写(如 EST MDT )并将其转换为时区偏移量(例如-5小时或-7小时)?chrono_tz crate似乎几乎可以做到这一点,但还不够完美。

你可以在crates.io上查看它。 - Akiner Alkan
2
请记住,时区缩写并没有标准化(夏威夷使用HST或HAST),也不是唯一的(CST可能属于美国中部标准时间、古巴标准时间或中国标准时间),也不是所有时区都有缩写(tzdb时区中的许多时区只显示偏移量,如“+02”)。此外,一些语言使用的缩写与英语中使用的缩写不同 - 例如,英语中的EST或法语中的HNE在加拿大的同一时区中都被使用。 - Matt Johnson-Pint
谢谢 @MattJohnson - harmic在下面提到它们并没有很好的标准化。我不知道这一点 - 如果我在ISO 8601或类似的地方寻找它们,我想我会知道的。让人恼火的是,我支持的协议使用它们而不是数值偏移量。 - Ted Middleton
1
一些标准使用缩写,比如RFC 2822的obs-zone定义。尽管即使在那里,它们也被认为是"过时的",因为它们最初是在早期的RFC 822中定义的,在那个时候对这类冲突的理解还不够清晰。 - Matt Johnson-Pint
1个回答

6
您可以使用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数据库)并不描述固定的偏移量。相反,该数据库包含一组规则,描述每个时区的夏令时更改时间。因此,您只能通过提供您想要知道偏移量的时间来准确地获取偏移量(在我的示例中是2019年5月9日12:00:00)。
还有一组从UTC偏移的缩写时间区域名称列表。这些名称没有很好的标准化,实际上同一个名称在不同的国家可能意义不同。对于这些内容,最好制作一个简单的查找表来支持您想要使用的缩写集合。

2
谢谢 @harmic - 我知道chrono-tz,但不幸的是我需要处理的是那些缩写词。我对它们的来源和标准化程度并不完全确定 - 让我失望的是我必须支持的协议使用了它们。我会采纳你的建议,在本地查找它们。 - Ted Middleton

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