9 个版本 (稳定版)
1.5.0 | 2024年5月28日 |
---|---|
1.4.0 | 2023年11月16日 |
1.3.2 | 2023年10月3日 |
1.2.0 | 2023年4月14日 |
0.0.1 | 2021年4月29日 |
237 在 国际化(i18n) 中
每月 34,193 次下载
用于 30 个 crate(5 个直接使用)
2MB
33K SLoC
icu_timezone
解析和操作时区的类型。
字段
在 ICU4X 中,一个 可格式化时区 由四个不同的字段组成
- GMT 偏移量
- 时区 ID
- 子时区 ID
- 时区变体,表示标准时间、夏令时、日光节约时间和斋月时间等概念
GMT 偏移量
GMT 偏移量精确地指出了所讨论时区与格林威治标准时间(GMT)或协调世界时(UTC)之间的时间差。
在本地化字符串中,它通常表示为 "GMT-6",意味着比 GMT 少 6 个小时。
时区
时区 ID 对应于时区数据库中的一个时区。时区 ID 通常对应于时区中最大的城市。
时区 ID 有两种主要可互换的标准
- IANA 时区 ID,如
"America/Chicago"
- BCP-47 时区 ID,如
"uschi"
ICU4X 使用 BCP-47 时区 ID 用于其所有 API。要从 IANA 时区获取 BCP-47 时区,请使用 TimeZoneIdMapper
。
子时区
子时区是一组在特定日期和时间共享相同本地化格式的多个时区。
例如,“America/Chicago”和“America/Indiana/Knox”都映射到美国中部时间,或者"America_Central"
。
时区到超时区的映射取决于日期。例如,从1991年到2006年,“America/Indiana/Knox”映射到美国东部时间,而不是美国中部时间。
与时区ID一样,有两种可互换的形式
- 长形式,如
"America_Central"
- 与BCP-47兼容的短形式,如
"amce"
ICU4X使用短形式。
注意:在ICU4X中,“metazone”是一个单词,“timezone”是两个单词,除了在这个crate和模块名称中,这里“timezone”没有分隔符使用。见https://github.com/unicode-org/icu4x/issues/2507。
区域变体
许多超时区在夏季使用与冬季不同的名称和偏移量。在ICU4X中,这被称为“区域变体”。
CLDR有两种区域变体,分别命名为"standard"
和"daylight"
。然而,这些变体到特定观察偏移量的映射因时区而异,并且它们可能不会始终代表冬季和夏季时间。
注意:在构建CustomTimeZone
时设置区域变体是可选的(不是必需的)。因此,可能变体的列表不包括一个通用变体来表示缺乏偏好。
计算
在日期/时间处理中,通常只有一部分信息可用,其他字段必须从中计算得出。
目前支持或将要支持的以下计算
- 时区 + 本地日期时间 → 超时区(
MetazoneCalculator
) - 时区 + 绝对时间 → 偏移量 + 区域变体(尚未支持)
示例
创建一个已知偏移量和时区ID的时间区,并根据某个本地日期时间计算超时区
use icu::calendar::DateTime;
use icu::timezone::CustomTimeZone;
use icu::timezone::GmtOffset;
use icu::timezone::MetazoneCalculator;
use icu::timezone::TimeZoneIdMapper;
use tinystr::{tinystr, TinyAsciiStr};
// Create a time zone for America/Chicago at GMT-6:
let mut time_zone = CustomTimeZone::new_empty();
time_zone.gmt_offset = "-0600".parse::<GmtOffset>().ok();
let mapper = TimeZoneIdMapper::new();
time_zone.time_zone_id =
mapper.as_borrowed().iana_to_bcp47("America/Chicago");
// Alternatively, set it directly from the BCP-47 ID
assert_eq!(time_zone.time_zone_id, Some(tinystr!(8, "uschi").into()));
// Compute the metazone at January 1, 2022:
let mzc = MetazoneCalculator::new();
let datetime = DateTime::try_new_iso_datetime(2022, 1, 1, 0, 0, 0).unwrap();
time_zone.maybe_calculate_metazone(&mzc, &datetime);
assert_eq!("amce", time_zone.metazone_id.unwrap().0.as_str());
更多信息
有关开发、作者、贡献等信息,请访问ICU4X 主页
。
依赖项
~1.7–2.3MB
~45K SLoC