#date-time #timezone #icu #data-provider #date-format

no-std icu_datetime

API 用于将日期和时间格式化为用户可读的文本表示形式

17 个版本 (10 个稳定版)

1.5.1 2024年6月6日
1.4.0 2023年11月16日
1.2.1 2023年4月23日
1.1.0 2023年1月26日
0.1.0 2020年10月15日

国际化 (i18n) 中排名第 115

Download history 3818/week @ 2024-05-03 4438/week @ 2024-05-10 3436/week @ 2024-05-17 4374/week @ 2024-05-24 4077/week @ 2024-05-31 4150/week @ 2024-06-07 3360/week @ 2024-06-14 3748/week @ 2024-06-21 3943/week @ 2024-06-28 4101/week @ 2024-07-05 5453/week @ 2024-07-12 6466/week @ 2024-07-19 7861/week @ 2024-07-26 18663/week @ 2024-08-02 25957/week @ 2024-08-09 20157/week @ 2024-08-16

每月下载量 73,544
31 包中使用(直接使用 12 个)

Unicode-3.0

4MB
59K SLoC

icu_datetime crates.io

日期和时间格式化。

此模块作为一个独立的包(icu_datetime)以及 icu 包的一部分发布。有关 ICU4X 项目更多详细信息,请参阅后者。

TypedDateTimeFormatterDateTimeFormatter 是组件的主要类型。它们接受一组参数,允许从 数据提供者 收集必要的数据,一旦实例化,就可以用于快速格式化提供的任何日期和时间。这些类型的变体可以格式化更多或更少的组件,包括 TypedDateFormatter & DateFormatterTypedZonedDateTimeFormatter & ZonedDateTimeFormatterTimeFormatterTimeZoneFormatter

这些格式化程序与来自 calendar 模块的类型一起工作,例如 DateDateTimeTime,以及 timezone::CustomTimeZone,然而,只要其他类型实现了来自 input 模块的特性和,也可以使用。

日期相关格式化程序的每个实例(即非 TimeFormatterTimeZoneFormatter)都与特定的 Calendar 相关联。区分“类型化”与未类型化格式化程序是为了帮助实现这一点。例如,如果您在编译时知道您将仅格式化格里历日期,则可以使用 TypedDateTimeFormatter<Gregorian>,并且 API 将确保只使用与日历相关的格里历 DateTime。另一方面,如果您希望在运行时选择日历,则可以使用指定在区域设置中的日历的 DateTimeFormatter,并使用它与 DateTimeAnyCalendar 一起。这些格式化程序仍然需要与适当日历关联的日期(尽管如果提供,它们将转换 ISO 日期),它们只是不强制程序员在编译时选择日历。

示例

use icu::calendar::{DateTime, Gregorian};
use icu::datetime::{
    options::length, DateTimeFormatter, DateTimeFormatterOptions,
    TypedDateTimeFormatter,
};
use icu::locid::{locale, Locale};
use std::str::FromStr;
use writeable::assert_writeable_eq;

// See the next code example for a more ergonomic example with .into().
let options =
    DateTimeFormatterOptions::Length(length::Bag::from_date_time_style(
        length::Date::Medium,
        length::Time::Short,
    ));

// You can work with a formatter that can select the calendar at runtime:
let locale = Locale::from_str("en-u-ca-gregory").unwrap();
let dtf = DateTimeFormatter::try_new(&locale.into(), options.clone())
    .expect("Failed to create DateTimeFormatter instance.");

// Or one that selects a calendar at compile time:
let typed_dtf = TypedDateTimeFormatter::<Gregorian>::try_new(
    &locale!("en").into(),
    options,
)
.expect("Failed to create TypedDateTimeFormatter instance.");

let typed_date =
    DateTime::try_new_gregorian_datetime(2020, 9, 12, 12, 34, 28).unwrap();
// prefer using ISO dates with DateTimeFormatter
let date = typed_date.to_iso().to_any();

let formatted_date = dtf.format(&date).expect("Calendars should match");
let typed_formatted_date = typed_dtf.format(&typed_date);

assert_writeable_eq!(formatted_date, "Sep 12, 2020, 12:34 PM");
assert_writeable_eq!(typed_formatted_date, "Sep 12, 2020, 12:34 PM");

let formatted_date_string =
    dtf.format_to_string(&date).expect("Calendars should match");
let typed_formatted_date_string = typed_dtf.format_to_string(&typed_date);

assert_eq!(formatted_date_string, "Sep 12, 2020, 12:34 PM");
assert_eq!(typed_formatted_date_string, "Sep 12, 2020, 12:34 PM");

可以使用 Into 特性更方便地创建选项,自动将 options::length::Bag 转换为 DateTimeFormatterOptions::Length

use icu::calendar::Gregorian;
use icu::datetime::{
    options::length, DateTimeFormatterOptions, TypedDateTimeFormatter,
};
use icu::locid::locale;
let options = length::Bag::from_date_time_style(
    length::Date::Medium,
    length::Time::Short,
)
.into();

let dtf = TypedDateTimeFormatter::<Gregorian>::try_new(
    &locale!("en").into(),
    options,
);

目前,该软件包只提供使用 Length 包的选项,但预计将来会添加更多自定义输出的方式,如骨架和组件。

更多信息

有关开发、作者、贡献等更多信息,请访问 ICU4X 主页

依赖关系