有没有办法将时区缩写解析为 Rust 中的时区偏移量?
Is there a way to parse a timezone abbreviation into a timezone offset in Rust?
有没有办法在 Rust 中将时区缩写(如 EST
或 MDT
)解析为时区偏移量(例如 -5 小时或 -7 小时)? chrono_tz crate 似乎几乎可以做到这一点,但不完全是。
您可以使用 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 的固定偏移量。这些都没有很好的标准化,事实上同一个缩写在不同的国家可能意味着不同的东西。对于这些,您最好对要支持的一组缩写进行简单查找 table。
有没有办法在 Rust 中将时区缩写(如 EST
或 MDT
)解析为时区偏移量(例如 -5 小时或 -7 小时)? chrono_tz crate 似乎几乎可以做到这一点,但不完全是。
您可以使用 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 的固定偏移量。这些都没有很好的标准化,事实上同一个缩写在不同的国家可能意味着不同的东西。对于这些,您最好对要支持的一组缩写进行简单查找 table。