1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
// This file is part of ICU4X. For terms of use, please see the file
// called LICENSE at the top level of the ICU4X source tree
// (online at: https://github.com/unicode-org/icu4x/blob/main/LICENSE ).
// https://github.com/unicode-org/icu4x/blob/main/documents/process/boilerplate.md#library-annotations
//! Localized formatting of dates, times, and time zones.
//!
//! This module is published as its own crate ([`icu_datetime`](https://docs.rs/icu_datetime/latest/icu_datetime/))
//! and as part of the [`icu`](https://docs.rs/icu/latest/icu/) crate. See the latter for more details on the ICU4X project.
//!
//! ICU4X datetime formatting follows the Unicode UTS 35 standard for [Semantic Skeletons](https://unicode.org/reports/tr35/tr35-dates.html#Semantic_Skeletons).
//! First you choose a _field set_, then you configure the formatting _options_ to your desired context.
//!
//! 1. Field Sets: [`icu::datetime::fieldsets`](fieldsets)
//! 2. Options: [`icu::datetime::options`](options)
//!
//! ICU4X supports formatting in over one dozen _calendar systems_, including Gregorian, Buddhist,
//! Hijri, and more. The calendar system is usually derived from the locale, but it can also be
//! specified explicitly.
//!
//! The main formatter in this crate is [`DateTimeFormatter`], which supports all field sets,
//! options, and calendar systems. Additional formatter types are available to developers in
//! resource-constrained environments.
//!
//! The formatters accept input types from the [`calendar`](icu_calendar) and
//! [`timezone`](icu_time) crates (Also reexported from the [`input`] module of this crate):
//!
//! 1. [`Date`](icu_calendar::Date)
//! 2. [`DateTime`](icu_time::DateTime)
//! 3. [`Time`](icu_time::Time)
//! 4. [`UtcOffset`](icu_time::zone::UtcOffset)
//! 5. [`TimeZoneInfo`](icu_time::TimeZoneInfo)
//! 6. [`ZonedDateTime`](icu_time::ZonedDateTime)
//! 7. And datetime types from third party crates; see [`input::unstable_third_party`].
//!
//! Not all inputs are valid for all field sets.
//!
//! # Examples
//!
//! ```
//! use icu::datetime::fieldsets;
//! use icu::datetime::input::Date;
//! use icu::datetime::input::{DateTime, Time};
//! use icu::datetime::DateTimeFormatter;
//! use icu::locale::{locale, Locale};
//! use writeable::assert_writeable_eq;
//!
//! // Field set for year, month, day, hour, and minute with a medium length:
//! let field_set_with_options = fieldsets::YMD::medium().with_time_hm();
//!
//! // Create a formatter for Argentinian Spanish:
//! let locale = locale!("es-AR");
//! let dtf = DateTimeFormatter::try_new(locale.into(), field_set_with_options)
//! .unwrap();
//!
//! // Format something:
//! let datetime = DateTime {
//! date: Date::try_new_iso(2025, 1, 15).unwrap(),
//! time: Time::try_new(16, 9, 35, 0).unwrap(),
//! };
//! let formatted_date = dtf.format(&datetime);
//!
//! assert_writeable_eq!(formatted_date, "15 de ene de 2025, 4:09 p. m.");
//! ```
//!
//! # Binary Size Considerations
//!
//! ## Avoid linking unnecessary field sets data
//!
//! There are two APIs for fieldsets:
//! * "static" field sets, like [`fieldsets::YMD`], where each field set is a *type*.
//! * "dynamic" field sets, like [`fieldsets::enums::CompositeFieldSet`], where each field set is a *value*.
//!
//! While dynamic fields sets may offer a more powerful API, using them in constructors links data for all
//! possible values, i.e. all patterns, that the dynamic field set can represent, even if they are
//! unreachable in code.
//!
//! Static field sets on the other hand leverage the type system to let the compiler drop unneeded data.
//!
//! ### Example
//!
//! ```
//! use icu::datetime::DateTimeFormatter;
//! use icu::datetime::fieldsets::YMD;
//! use icu::datetime::fieldsets::enums::{CompositeFieldSet, DateFieldSet};
//!
//! // This constructor only links data required for YMD
//! let a: DateTimeFormatter<YMD> =
//! DateTimeFormatter::try_new(Default::default(), YMD::medium()).unwrap();
//!
//! // This constructor links data for *all possible field sets*, even though we only use YMD
//! let b: DateTimeFormatter<CompositeFieldSet> =
//! DateTimeFormatter::try_new(Default::default(), CompositeFieldSet::Date(DateFieldSet::YMD(YMD::medium()))).unwrap();
//!
//! // If a DateTimeFormatter<CompositeFieldSet> is required, cast after construction instead:
//! let c: DateTimeFormatter<CompositeFieldSet> = a.cast_into_fset::<CompositeFieldSet>();
//! ```
//!
//! ## Avoid linking unnecessary calendar data
//!
//! All field sets that contain dates use different data for each calendar system when used with [`DateTimeFormatter`].
//! This is good i18n practice, as in general the calendar system should be derived from the user locale,
//! not fixed in code. However, there are legitimate use cases where only one calendar system is supported,
//! in which case [`DateTimeFormatter`] would link unused data. In this case [`FixedCalendarDateTimeFormatter`]
//! can be used, which is generic in a calendar type and only links the data for that calendar.
//!
//! Using [`FixedCalendarDateTimeFormatter`] also avoids linking code that converts inputs to the user's calendar.
//! For field sets that don't contain dates, this can also be achieved using [`NoCalendarFormatter`].
extern crate alloc;
pub
pub
pub use ;
pub use DateTimeFormatter;
pub use DateTimeFormatterPreferences;
pub use FixedCalendarDateTimeFormatter;
pub use FormattedDateTime;
pub use NoCalendarFormatter;
/// Locale preferences used by this crate
/// Types that can be fed to [`DateTimeFormatter`]/[`FixedCalendarDateTimeFormatter`].
///
/// This module contains re-exports from the [`icu_calendar`] and [`icu_time`] crates.