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)

Download history 3502/week @ 2024-04-19 3178/week @ 2024-04-26 3072/week @ 2024-05-03 3140/week @ 2024-05-10 2527/week @ 2024-05-17 3421/week @ 2024-05-24 2703/week @ 2024-05-31 1986/week @ 2024-06-07 2338/week @ 2024-06-14 2783/week @ 2024-06-21 3323/week @ 2024-06-28 4144/week @ 2024-07-05 5551/week @ 2024-07-12 6980/week @ 2024-07-19 8060/week @ 2024-07-26 12655/week @ 2024-08-02

每月 34,193 次下载
用于 30 crate(5 个直接使用)

Unicode-3.0

2MB
33K SLoC

icu_timezone crates.io

解析和操作时区的类型。

字段

在 ICU4X 中,一个 可格式化时区 由四个不同的字段组成

  1. GMT 偏移量
  2. 时区 ID
  3. 子时区 ID
  4. 时区变体,表示标准时间、夏令时、日光节约时间和斋月时间等概念

GMT 偏移量

GMT 偏移量精确地指出了所讨论时区与格林威治标准时间(GMT)或协调世界时(UTC)之间的时间差。

在本地化字符串中,它通常表示为 "GMT-6",意味着比 GMT 少 6 个小时。

时区

时区 ID 对应于时区数据库中的一个时区。时区 ID 通常对应于时区中最大的城市。

时区 ID 有两种主要可互换的标准

  1. IANA 时区 ID,如 "America/Chicago"
  2. 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一样,有两种可互换的形式

  1. 长形式,如"America_Central"
  2. 与BCP-47兼容的短形式,如"amce"

ICU4X使用短形式。

注意:在ICU4X中,“metazone”是一个单词,“timezone”是两个单词,除了在这个crate和模块名称中,这里“timezone”没有分隔符使用。见https://github.com/unicode-org/icu4x/issues/2507

区域变体

许多超时区在夏季使用与冬季不同的名称和偏移量。在ICU4X中,这被称为“区域变体”。

CLDR有两种区域变体,分别命名为"standard""daylight"。然而,这些变体到特定观察偏移量的映射因时区而异,并且它们可能不会始终代表冬季和夏季时间。

注意:在构建CustomTimeZone时设置区域变体是可选的(不是必需的)。因此,可能变体的列表不包括一个通用变体来表示缺乏偏好。

计算

在日期/时间处理中,通常只有一部分信息可用,其他字段必须从中计算得出。

目前支持或将要支持的以下计算

  1. 时区 + 本地日期时间 → 超时区(MetazoneCalculator
  2. 时区 + 绝对时间 → 偏移量 + 区域变体(尚未支持)

示例

创建一个已知偏移量和时区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