xref: /aosp_15_r20/external/icu/libicu/cts_headers/unicode/dtitvfmt.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others.
2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html
3*0e209d39SAndroid Build Coastguard Worker /********************************************************************************
4*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2008-2016, International Business Machines Corporation and
5*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved.
6*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
7*0e209d39SAndroid Build Coastguard Worker *
8*0e209d39SAndroid Build Coastguard Worker * File DTITVFMT.H
9*0e209d39SAndroid Build Coastguard Worker *
10*0e209d39SAndroid Build Coastguard Worker *******************************************************************************
11*0e209d39SAndroid Build Coastguard Worker */
12*0e209d39SAndroid Build Coastguard Worker 
13*0e209d39SAndroid Build Coastguard Worker #ifndef __DTITVFMT_H__
14*0e209d39SAndroid Build Coastguard Worker #define __DTITVFMT_H__
15*0e209d39SAndroid Build Coastguard Worker 
16*0e209d39SAndroid Build Coastguard Worker 
17*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h"
18*0e209d39SAndroid Build Coastguard Worker 
19*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API
20*0e209d39SAndroid Build Coastguard Worker 
21*0e209d39SAndroid Build Coastguard Worker /**
22*0e209d39SAndroid Build Coastguard Worker  * \file
23*0e209d39SAndroid Build Coastguard Worker  * \brief C++ API: Format and parse date interval in a language-independent manner.
24*0e209d39SAndroid Build Coastguard Worker  */
25*0e209d39SAndroid Build Coastguard Worker 
26*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING
27*0e209d39SAndroid Build Coastguard Worker 
28*0e209d39SAndroid Build Coastguard Worker #include "unicode/ucal.h"
29*0e209d39SAndroid Build Coastguard Worker #include "unicode/smpdtfmt.h"
30*0e209d39SAndroid Build Coastguard Worker #include "unicode/dtintrv.h"
31*0e209d39SAndroid Build Coastguard Worker #include "unicode/dtitvinf.h"
32*0e209d39SAndroid Build Coastguard Worker #include "unicode/dtptngen.h"
33*0e209d39SAndroid Build Coastguard Worker #include "unicode/formattedvalue.h"
34*0e209d39SAndroid Build Coastguard Worker #include "unicode/udisplaycontext.h"
35*0e209d39SAndroid Build Coastguard Worker 
36*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN
37*0e209d39SAndroid Build Coastguard Worker 
38*0e209d39SAndroid Build Coastguard Worker 
39*0e209d39SAndroid Build Coastguard Worker class FormattedDateIntervalData;
40*0e209d39SAndroid Build Coastguard Worker class DateIntervalFormat;
41*0e209d39SAndroid Build Coastguard Worker 
42*0e209d39SAndroid Build Coastguard Worker /**
43*0e209d39SAndroid Build Coastguard Worker  * An immutable class containing the result of a date interval formatting operation.
44*0e209d39SAndroid Build Coastguard Worker  *
45*0e209d39SAndroid Build Coastguard Worker  * Instances of this class are immutable and thread-safe.
46*0e209d39SAndroid Build Coastguard Worker  *
47*0e209d39SAndroid Build Coastguard Worker  * When calling nextPosition():
48*0e209d39SAndroid Build Coastguard Worker  * The fields are returned from left to right. The special field category
49*0e209d39SAndroid Build Coastguard Worker  * UFIELD_CATEGORY_DATE_INTERVAL_SPAN is used to indicate which datetime
50*0e209d39SAndroid Build Coastguard Worker  * primitives came from which arguments: 0 means fromCalendar, and 1 means
51*0e209d39SAndroid Build Coastguard Worker  * toCalendar. The span category will always occur before the
52*0e209d39SAndroid Build Coastguard Worker  * corresponding fields in UFIELD_CATEGORY_DATE
53*0e209d39SAndroid Build Coastguard Worker  * in the nextPosition() iterator.
54*0e209d39SAndroid Build Coastguard Worker  *
55*0e209d39SAndroid Build Coastguard Worker  * Not intended for public subclassing.
56*0e209d39SAndroid Build Coastguard Worker  *
57*0e209d39SAndroid Build Coastguard Worker  * @stable ICU 64
58*0e209d39SAndroid Build Coastguard Worker  */
59*0e209d39SAndroid Build Coastguard Worker class U_I18N_API FormattedDateInterval : public UMemory, public FormattedValue {
60*0e209d39SAndroid Build Coastguard Worker   public:
61*0e209d39SAndroid Build Coastguard Worker     /**
62*0e209d39SAndroid Build Coastguard Worker      * Default constructor; makes an empty FormattedDateInterval.
63*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 64
64*0e209d39SAndroid Build Coastguard Worker      */
FormattedDateInterval()65*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval() : fData(nullptr), fErrorCode(U_INVALID_STATE_ERROR) {}
66*0e209d39SAndroid Build Coastguard Worker 
67*0e209d39SAndroid Build Coastguard Worker     /**
68*0e209d39SAndroid Build Coastguard Worker      * Move constructor: Leaves the source FormattedDateInterval in an undefined state.
69*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 64
70*0e209d39SAndroid Build Coastguard Worker      */
71*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval(FormattedDateInterval&& src) noexcept;
72*0e209d39SAndroid Build Coastguard Worker 
73*0e209d39SAndroid Build Coastguard Worker     /**
74*0e209d39SAndroid Build Coastguard Worker      * Destruct an instance of FormattedDateInterval.
75*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 64
76*0e209d39SAndroid Build Coastguard Worker      */
77*0e209d39SAndroid Build Coastguard Worker     virtual ~FormattedDateInterval() override;
78*0e209d39SAndroid Build Coastguard Worker 
79*0e209d39SAndroid Build Coastguard Worker     /** Copying not supported; use move constructor instead. */
80*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval(const FormattedDateInterval&) = delete;
81*0e209d39SAndroid Build Coastguard Worker 
82*0e209d39SAndroid Build Coastguard Worker     /** Copying not supported; use move assignment instead. */
83*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval& operator=(const FormattedDateInterval&) = delete;
84*0e209d39SAndroid Build Coastguard Worker 
85*0e209d39SAndroid Build Coastguard Worker     /**
86*0e209d39SAndroid Build Coastguard Worker      * Move assignment: Leaves the source FormattedDateInterval in an undefined state.
87*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 64
88*0e209d39SAndroid Build Coastguard Worker      */
89*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval& operator=(FormattedDateInterval&& src) noexcept;
90*0e209d39SAndroid Build Coastguard Worker 
91*0e209d39SAndroid Build Coastguard Worker     /** @copydoc FormattedValue::toString() */
92*0e209d39SAndroid Build Coastguard Worker     UnicodeString toString(UErrorCode& status) const override;
93*0e209d39SAndroid Build Coastguard Worker 
94*0e209d39SAndroid Build Coastguard Worker     /** @copydoc FormattedValue::toTempString() */
95*0e209d39SAndroid Build Coastguard Worker     UnicodeString toTempString(UErrorCode& status) const override;
96*0e209d39SAndroid Build Coastguard Worker 
97*0e209d39SAndroid Build Coastguard Worker     /** @copydoc FormattedValue::appendTo() */
98*0e209d39SAndroid Build Coastguard Worker     Appendable &appendTo(Appendable& appendable, UErrorCode& status) const override;
99*0e209d39SAndroid Build Coastguard Worker 
100*0e209d39SAndroid Build Coastguard Worker     /** @copydoc FormattedValue::nextPosition() */
101*0e209d39SAndroid Build Coastguard Worker     UBool nextPosition(ConstrainedFieldPosition& cfpos, UErrorCode& status) const override;
102*0e209d39SAndroid Build Coastguard Worker 
103*0e209d39SAndroid Build Coastguard Worker   private:
104*0e209d39SAndroid Build Coastguard Worker     FormattedDateIntervalData *fData;
105*0e209d39SAndroid Build Coastguard Worker     UErrorCode fErrorCode;
FormattedDateInterval(FormattedDateIntervalData * results)106*0e209d39SAndroid Build Coastguard Worker     explicit FormattedDateInterval(FormattedDateIntervalData *results)
107*0e209d39SAndroid Build Coastguard Worker         : fData(results), fErrorCode(U_ZERO_ERROR) {}
FormattedDateInterval(UErrorCode errorCode)108*0e209d39SAndroid Build Coastguard Worker     explicit FormattedDateInterval(UErrorCode errorCode)
109*0e209d39SAndroid Build Coastguard Worker         : fData(nullptr), fErrorCode(errorCode) {}
110*0e209d39SAndroid Build Coastguard Worker     friend class DateIntervalFormat;
111*0e209d39SAndroid Build Coastguard Worker };
112*0e209d39SAndroid Build Coastguard Worker 
113*0e209d39SAndroid Build Coastguard Worker 
114*0e209d39SAndroid Build Coastguard Worker /**
115*0e209d39SAndroid Build Coastguard Worker  * DateIntervalFormat is a class for formatting and parsing date
116*0e209d39SAndroid Build Coastguard Worker  * intervals in a language-independent manner.
117*0e209d39SAndroid Build Coastguard Worker  * Only formatting is supported, parsing is not supported.
118*0e209d39SAndroid Build Coastguard Worker  *
119*0e209d39SAndroid Build Coastguard Worker  * <P>
120*0e209d39SAndroid Build Coastguard Worker  * Date interval means from one date to another date,
121*0e209d39SAndroid Build Coastguard Worker  * for example, from "Jan 11, 2008" to "Jan 18, 2008".
122*0e209d39SAndroid Build Coastguard Worker  * We introduced class DateInterval to represent it.
123*0e209d39SAndroid Build Coastguard Worker  * DateInterval is a pair of UDate, which is
124*0e209d39SAndroid Build Coastguard Worker  * the standard milliseconds since 24:00 GMT, Jan 1, 1970.
125*0e209d39SAndroid Build Coastguard Worker  *
126*0e209d39SAndroid Build Coastguard Worker  * <P>
127*0e209d39SAndroid Build Coastguard Worker  * DateIntervalFormat formats a DateInterval into
128*0e209d39SAndroid Build Coastguard Worker  * text as compactly as possible.
129*0e209d39SAndroid Build Coastguard Worker  * For example, the date interval format from "Jan 11, 2008" to "Jan 18,. 2008"
130*0e209d39SAndroid Build Coastguard Worker  * is "Jan 11-18, 2008" for English.
131*0e209d39SAndroid Build Coastguard Worker  * And it parses text into DateInterval,
132*0e209d39SAndroid Build Coastguard Worker  * although initially, parsing is not supported.
133*0e209d39SAndroid Build Coastguard Worker  *
134*0e209d39SAndroid Build Coastguard Worker  * <P>
135*0e209d39SAndroid Build Coastguard Worker  * There is no structural information in date time patterns.
136*0e209d39SAndroid Build Coastguard Worker  * For any punctuations and string literals inside a date time pattern,
137*0e209d39SAndroid Build Coastguard Worker  * we do not know whether it is just a separator, or a prefix, or a suffix.
138*0e209d39SAndroid Build Coastguard Worker  * Without such information, so, it is difficult to generate a sub-pattern
139*0e209d39SAndroid Build Coastguard Worker  * (or super-pattern) by algorithm.
140*0e209d39SAndroid Build Coastguard Worker  * So, formatting a DateInterval is pattern-driven. It is very
141*0e209d39SAndroid Build Coastguard Worker  * similar to formatting in SimpleDateFormat.
142*0e209d39SAndroid Build Coastguard Worker  * We introduce class DateIntervalInfo to save date interval
143*0e209d39SAndroid Build Coastguard Worker  * patterns, similar to date time pattern in SimpleDateFormat.
144*0e209d39SAndroid Build Coastguard Worker  *
145*0e209d39SAndroid Build Coastguard Worker  * <P>
146*0e209d39SAndroid Build Coastguard Worker  * Logically, the interval patterns are mappings
147*0e209d39SAndroid Build Coastguard Worker  * from (skeleton, the_largest_different_calendar_field)
148*0e209d39SAndroid Build Coastguard Worker  * to (date_interval_pattern).
149*0e209d39SAndroid Build Coastguard Worker  *
150*0e209d39SAndroid Build Coastguard Worker  * <P>
151*0e209d39SAndroid Build Coastguard Worker  * A skeleton
152*0e209d39SAndroid Build Coastguard Worker  * <ol>
153*0e209d39SAndroid Build Coastguard Worker  * <li>
154*0e209d39SAndroid Build Coastguard Worker  * only keeps the field pattern letter and ignores all other parts
155*0e209d39SAndroid Build Coastguard Worker  * in a pattern, such as space, punctuations, and string literals.
156*0e209d39SAndroid Build Coastguard Worker  * </li>
157*0e209d39SAndroid Build Coastguard Worker  * <li>
158*0e209d39SAndroid Build Coastguard Worker  * hides the order of fields.
159*0e209d39SAndroid Build Coastguard Worker  * </li>
160*0e209d39SAndroid Build Coastguard Worker  * <li>
161*0e209d39SAndroid Build Coastguard Worker  * might hide a field's pattern letter length.
162*0e209d39SAndroid Build Coastguard Worker  * </li>
163*0e209d39SAndroid Build Coastguard Worker  * </ol>
164*0e209d39SAndroid Build Coastguard Worker  *
165*0e209d39SAndroid Build Coastguard Worker  * For those non-digit calendar fields, the pattern letter length is
166*0e209d39SAndroid Build Coastguard Worker  * important, such as MMM, MMMM, and MMMMM; EEE and EEEE,
167*0e209d39SAndroid Build Coastguard Worker  * and the field's pattern letter length is honored.
168*0e209d39SAndroid Build Coastguard Worker  *
169*0e209d39SAndroid Build Coastguard Worker  * For the digit calendar fields,  such as M or MM, d or dd, yy or yyyy,
170*0e209d39SAndroid Build Coastguard Worker  * the field pattern length is ignored and the best match, which is defined
171*0e209d39SAndroid Build Coastguard Worker  * in date time patterns, will be returned without honor the field pattern
172*0e209d39SAndroid Build Coastguard Worker  * letter length in skeleton.
173*0e209d39SAndroid Build Coastguard Worker  *
174*0e209d39SAndroid Build Coastguard Worker  * <P>
175*0e209d39SAndroid Build Coastguard Worker  * The calendar fields we support for interval formatting are:
176*0e209d39SAndroid Build Coastguard Worker  * year, month, date, day-of-week, am-pm, hour, hour-of-day, minute, second,
177*0e209d39SAndroid Build Coastguard Worker  * and millisecond.
178*0e209d39SAndroid Build Coastguard Worker  * (though we do not currently have specific intervalFormat date for skeletons
179*0e209d39SAndroid Build Coastguard Worker  * with seconds and millisecond).
180*0e209d39SAndroid Build Coastguard Worker  * Those calendar fields can be defined in the following order:
181*0e209d39SAndroid Build Coastguard Worker  * year >  month > date > hour (in day) >  minute > second > millisecond
182*0e209d39SAndroid Build Coastguard Worker  *
183*0e209d39SAndroid Build Coastguard Worker  * The largest different calendar fields between 2 calendars is the
184*0e209d39SAndroid Build Coastguard Worker  * first different calendar field in above order.
185*0e209d39SAndroid Build Coastguard Worker  *
186*0e209d39SAndroid Build Coastguard Worker  * For example: the largest different calendar fields between "Jan 10, 2007"
187*0e209d39SAndroid Build Coastguard Worker  * and "Feb 20, 2008" is year.
188*0e209d39SAndroid Build Coastguard Worker  *
189*0e209d39SAndroid Build Coastguard Worker  * <P>
190*0e209d39SAndroid Build Coastguard Worker  * For other calendar fields, the compact interval formatting is not
191*0e209d39SAndroid Build Coastguard Worker  * supported. And the interval format will be fall back to fall-back
192*0e209d39SAndroid Build Coastguard Worker  * patterns, which is mostly "{date0} - {date1}".
193*0e209d39SAndroid Build Coastguard Worker  *
194*0e209d39SAndroid Build Coastguard Worker  * <P>
195*0e209d39SAndroid Build Coastguard Worker  * There is a set of pre-defined static skeleton strings.
196*0e209d39SAndroid Build Coastguard Worker  * There are pre-defined interval patterns for those pre-defined skeletons
197*0e209d39SAndroid Build Coastguard Worker  * in locales' resource files.
198*0e209d39SAndroid Build Coastguard Worker  * For example, for a skeleton UDAT_YEAR_ABBR_MONTH_DAY, which is  &quot;yMMMd&quot;,
199*0e209d39SAndroid Build Coastguard Worker  * in  en_US, if the largest different calendar field between date1 and date2
200*0e209d39SAndroid Build Coastguard Worker  * is &quot;year&quot;, the date interval pattern  is &quot;MMM d, yyyy - MMM d, yyyy&quot;,
201*0e209d39SAndroid Build Coastguard Worker  * such as &quot;Jan 10, 2007 - Jan 10, 2008&quot;.
202*0e209d39SAndroid Build Coastguard Worker  * If the largest different calendar field between date1 and date2 is &quot;month&quot;,
203*0e209d39SAndroid Build Coastguard Worker  * the date interval pattern is &quot;MMM d - MMM d, yyyy&quot;,
204*0e209d39SAndroid Build Coastguard Worker  * such as &quot;Jan 10 - Feb 10, 2007&quot;.
205*0e209d39SAndroid Build Coastguard Worker  * If the largest different calendar field between date1 and date2 is &quot;day&quot;,
206*0e209d39SAndroid Build Coastguard Worker  * the date interval pattern is &quot;MMM d-d, yyyy&quot;, such as &quot;Jan 10-20, 2007&quot;.
207*0e209d39SAndroid Build Coastguard Worker  *
208*0e209d39SAndroid Build Coastguard Worker  * For date skeleton, the interval patterns when year, or month, or date is
209*0e209d39SAndroid Build Coastguard Worker  * different are defined in resource files.
210*0e209d39SAndroid Build Coastguard Worker  * For time skeleton, the interval patterns when am/pm, or hour, or minute is
211*0e209d39SAndroid Build Coastguard Worker  * different are defined in resource files.
212*0e209d39SAndroid Build Coastguard Worker  *
213*0e209d39SAndroid Build Coastguard Worker  * <P>
214*0e209d39SAndroid Build Coastguard Worker  * If a skeleton is not found in a locale's DateIntervalInfo, which means
215*0e209d39SAndroid Build Coastguard Worker  * the interval patterns for the skeleton is not defined in resource file,
216*0e209d39SAndroid Build Coastguard Worker  * the interval pattern will falls back to the interval "fallback" pattern
217*0e209d39SAndroid Build Coastguard Worker  * defined in resource file.
218*0e209d39SAndroid Build Coastguard Worker  * If the interval "fallback" pattern is not defined, the default fall-back
219*0e209d39SAndroid Build Coastguard Worker  * is "{date0} - {data1}".
220*0e209d39SAndroid Build Coastguard Worker  *
221*0e209d39SAndroid Build Coastguard Worker  * <P>
222*0e209d39SAndroid Build Coastguard Worker  * For the combination of date and time,
223*0e209d39SAndroid Build Coastguard Worker  * The rule to generate interval patterns are:
224*0e209d39SAndroid Build Coastguard Worker  * <ol>
225*0e209d39SAndroid Build Coastguard Worker  * <li>
226*0e209d39SAndroid Build Coastguard Worker  *    when the year, month, or day differs, falls back to fall-back
227*0e209d39SAndroid Build Coastguard Worker  *    interval pattern, which mostly is the concatenate the two original
228*0e209d39SAndroid Build Coastguard Worker  *    expressions with a separator between,
229*0e209d39SAndroid Build Coastguard Worker  *    For example, interval pattern from "Jan 10, 2007 10:10 am"
230*0e209d39SAndroid Build Coastguard Worker  *    to "Jan 11, 2007 10:10am" is
231*0e209d39SAndroid Build Coastguard Worker  *    "Jan 10, 2007 10:10 am - Jan 11, 2007 10:10am"
232*0e209d39SAndroid Build Coastguard Worker  * </li>
233*0e209d39SAndroid Build Coastguard Worker  * <li>
234*0e209d39SAndroid Build Coastguard Worker  *    otherwise, present the date followed by the range expression
235*0e209d39SAndroid Build Coastguard Worker  *    for the time.
236*0e209d39SAndroid Build Coastguard Worker  *    For example, interval pattern from "Jan 10, 2007 10:10 am"
237*0e209d39SAndroid Build Coastguard Worker  *    to "Jan 10, 2007 11:10am" is "Jan 10, 2007 10:10 am - 11:10am"
238*0e209d39SAndroid Build Coastguard Worker  * </li>
239*0e209d39SAndroid Build Coastguard Worker  * </ol>
240*0e209d39SAndroid Build Coastguard Worker  *
241*0e209d39SAndroid Build Coastguard Worker  *
242*0e209d39SAndroid Build Coastguard Worker  * <P>
243*0e209d39SAndroid Build Coastguard Worker  * If two dates are the same, the interval pattern is the single date pattern.
244*0e209d39SAndroid Build Coastguard Worker  * For example, interval pattern from "Jan 10, 2007" to "Jan 10, 2007" is
245*0e209d39SAndroid Build Coastguard Worker  * "Jan 10, 2007".
246*0e209d39SAndroid Build Coastguard Worker  *
247*0e209d39SAndroid Build Coastguard Worker  * Or if the presenting fields between 2 dates have the exact same values,
248*0e209d39SAndroid Build Coastguard Worker  * the interval pattern is the  single date pattern.
249*0e209d39SAndroid Build Coastguard Worker  * For example, if user only requests year and month,
250*0e209d39SAndroid Build Coastguard Worker  * the interval pattern from "Jan 10, 2007" to "Jan 20, 2007" is "Jan 2007".
251*0e209d39SAndroid Build Coastguard Worker  *
252*0e209d39SAndroid Build Coastguard Worker  * <P>
253*0e209d39SAndroid Build Coastguard Worker  * DateIntervalFormat needs the following information for correct
254*0e209d39SAndroid Build Coastguard Worker  * formatting: time zone, calendar type, pattern, date format symbols,
255*0e209d39SAndroid Build Coastguard Worker  * and date interval patterns.
256*0e209d39SAndroid Build Coastguard Worker  * It can be instantiated in 2 ways:
257*0e209d39SAndroid Build Coastguard Worker  * <ol>
258*0e209d39SAndroid Build Coastguard Worker  * <li>
259*0e209d39SAndroid Build Coastguard Worker  *    create an instance using default or given locale plus given skeleton.
260*0e209d39SAndroid Build Coastguard Worker  *    Users are encouraged to created date interval formatter this way and
261*0e209d39SAndroid Build Coastguard Worker  *    to use the pre-defined skeleton macros, such as
262*0e209d39SAndroid Build Coastguard Worker  *    UDAT_YEAR_NUM_MONTH, which consists the calendar fields and
263*0e209d39SAndroid Build Coastguard Worker  *    the format style.
264*0e209d39SAndroid Build Coastguard Worker  * </li>
265*0e209d39SAndroid Build Coastguard Worker  * <li>
266*0e209d39SAndroid Build Coastguard Worker  *    create an instance using default or given locale plus given skeleton
267*0e209d39SAndroid Build Coastguard Worker  *    plus a given DateIntervalInfo.
268*0e209d39SAndroid Build Coastguard Worker  *    This factory method is for powerful users who want to provide their own
269*0e209d39SAndroid Build Coastguard Worker  *    interval patterns.
270*0e209d39SAndroid Build Coastguard Worker  *    Locale provides the timezone, calendar, and format symbols information.
271*0e209d39SAndroid Build Coastguard Worker  *    Local plus skeleton provides full pattern information.
272*0e209d39SAndroid Build Coastguard Worker  *    DateIntervalInfo provides the date interval patterns.
273*0e209d39SAndroid Build Coastguard Worker  * </li>
274*0e209d39SAndroid Build Coastguard Worker  * </ol>
275*0e209d39SAndroid Build Coastguard Worker  *
276*0e209d39SAndroid Build Coastguard Worker  * <P>
277*0e209d39SAndroid Build Coastguard Worker  * For the calendar field pattern letter, such as G, y, M, d, a, h, H, m, s etc.
278*0e209d39SAndroid Build Coastguard Worker  * DateIntervalFormat uses the same syntax as that of
279*0e209d39SAndroid Build Coastguard Worker  * DateTime format.
280*0e209d39SAndroid Build Coastguard Worker  *
281*0e209d39SAndroid Build Coastguard Worker  * <P>
282*0e209d39SAndroid Build Coastguard Worker  * Code Sample: general usage
283*0e209d39SAndroid Build Coastguard Worker  * <pre>
284*0e209d39SAndroid Build Coastguard Worker  * \code
285*0e209d39SAndroid Build Coastguard Worker  *   // the date interval object which the DateIntervalFormat formats on
286*0e209d39SAndroid Build Coastguard Worker  *   // and parses into
287*0e209d39SAndroid Build Coastguard Worker  *   DateInterval*  dtInterval = new DateInterval(1000*3600*24, 1000*3600*24*2);
288*0e209d39SAndroid Build Coastguard Worker  *   UErrorCode status = U_ZERO_ERROR;
289*0e209d39SAndroid Build Coastguard Worker  *   DateIntervalFormat* dtIntervalFmt = DateIntervalFormat::createInstance(
290*0e209d39SAndroid Build Coastguard Worker  *                           UDAT_YEAR_MONTH_DAY,
291*0e209d39SAndroid Build Coastguard Worker  *                           Locale("en", "GB", ""), status);
292*0e209d39SAndroid Build Coastguard Worker  *   UnicodeUnicodeString dateIntervalString;
293*0e209d39SAndroid Build Coastguard Worker  *   FieldPosition pos = 0;
294*0e209d39SAndroid Build Coastguard Worker  *   // formatting
295*0e209d39SAndroid Build Coastguard Worker  *   dtIntervalFmt->format(dtInterval, dateIntervalUnicodeString, pos, status);
296*0e209d39SAndroid Build Coastguard Worker  *   delete dtIntervalFmt;
297*0e209d39SAndroid Build Coastguard Worker  * \endcode
298*0e209d39SAndroid Build Coastguard Worker  * </pre>
299*0e209d39SAndroid Build Coastguard Worker  */
300*0e209d39SAndroid Build Coastguard Worker class U_I18N_API DateIntervalFormat : public Format {
301*0e209d39SAndroid Build Coastguard Worker public:
302*0e209d39SAndroid Build Coastguard Worker 
303*0e209d39SAndroid Build Coastguard Worker     /**
304*0e209d39SAndroid Build Coastguard Worker      * Construct a DateIntervalFormat from skeleton and  the default locale.
305*0e209d39SAndroid Build Coastguard Worker      *
306*0e209d39SAndroid Build Coastguard Worker      * This is a convenient override of
307*0e209d39SAndroid Build Coastguard Worker      * createInstance(const UnicodeString& skeleton, const Locale& locale,
308*0e209d39SAndroid Build Coastguard Worker      *                UErrorCode&)
309*0e209d39SAndroid Build Coastguard Worker      * with the value of locale as default locale.
310*0e209d39SAndroid Build Coastguard Worker      *
311*0e209d39SAndroid Build Coastguard Worker      * @param skeleton  the skeleton on which interval format based.
312*0e209d39SAndroid Build Coastguard Worker      * @param status    output param set to success/failure code on exit
313*0e209d39SAndroid Build Coastguard Worker      * @return          a date time interval formatter which the caller owns.
314*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
315*0e209d39SAndroid Build Coastguard Worker      */
316*0e209d39SAndroid Build Coastguard Worker     static DateIntervalFormat* U_EXPORT2 createInstance(
317*0e209d39SAndroid Build Coastguard Worker                                                const UnicodeString& skeleton,
318*0e209d39SAndroid Build Coastguard Worker                                                UErrorCode& status);
319*0e209d39SAndroid Build Coastguard Worker 
320*0e209d39SAndroid Build Coastguard Worker     /**
321*0e209d39SAndroid Build Coastguard Worker      * Construct a DateIntervalFormat from skeleton and a given locale.
322*0e209d39SAndroid Build Coastguard Worker      * <P>
323*0e209d39SAndroid Build Coastguard Worker      * In this factory method,
324*0e209d39SAndroid Build Coastguard Worker      * the date interval pattern information is load from resource files.
325*0e209d39SAndroid Build Coastguard Worker      * Users are encouraged to created date interval formatter this way and
326*0e209d39SAndroid Build Coastguard Worker      * to use the pre-defined skeleton macros.
327*0e209d39SAndroid Build Coastguard Worker      *
328*0e209d39SAndroid Build Coastguard Worker      * <P>
329*0e209d39SAndroid Build Coastguard Worker      * There are pre-defined skeletons (defined in udate.h) having predefined
330*0e209d39SAndroid Build Coastguard Worker      * interval patterns in resource files.
331*0e209d39SAndroid Build Coastguard Worker      * Users are encouraged to use those macros.
332*0e209d39SAndroid Build Coastguard Worker      * For example:
333*0e209d39SAndroid Build Coastguard Worker      * DateIntervalFormat::createInstance(UDAT_MONTH_DAY, status)
334*0e209d39SAndroid Build Coastguard Worker      *
335*0e209d39SAndroid Build Coastguard Worker      * The given Locale provides the interval patterns.
336*0e209d39SAndroid Build Coastguard Worker      * For example, for en_GB, if skeleton is UDAT_YEAR_ABBR_MONTH_WEEKDAY_DAY,
337*0e209d39SAndroid Build Coastguard Worker      * which is "yMMMEEEd",
338*0e209d39SAndroid Build Coastguard Worker      * the interval patterns defined in resource file to above skeleton are:
339*0e209d39SAndroid Build Coastguard Worker      * "EEE, d MMM, yyyy - EEE, d MMM, yyyy" for year differs,
340*0e209d39SAndroid Build Coastguard Worker      * "EEE, d MMM - EEE, d MMM, yyyy" for month differs,
341*0e209d39SAndroid Build Coastguard Worker      * "EEE, d - EEE, d MMM, yyyy" for day differs,
342*0e209d39SAndroid Build Coastguard Worker      * @param skeleton  the skeleton on which the interval format is based.
343*0e209d39SAndroid Build Coastguard Worker      * @param locale    the given locale
344*0e209d39SAndroid Build Coastguard Worker      * @param status    output param set to success/failure code on exit
345*0e209d39SAndroid Build Coastguard Worker      * @return          a date time interval formatter which the caller owns.
346*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
347*0e209d39SAndroid Build Coastguard Worker      */
348*0e209d39SAndroid Build Coastguard Worker 
349*0e209d39SAndroid Build Coastguard Worker     static DateIntervalFormat* U_EXPORT2 createInstance(
350*0e209d39SAndroid Build Coastguard Worker                                                const UnicodeString& skeleton,
351*0e209d39SAndroid Build Coastguard Worker                                                const Locale& locale,
352*0e209d39SAndroid Build Coastguard Worker                                                UErrorCode& status);
353*0e209d39SAndroid Build Coastguard Worker 
354*0e209d39SAndroid Build Coastguard Worker     /**
355*0e209d39SAndroid Build Coastguard Worker      * Construct a DateIntervalFormat from skeleton
356*0e209d39SAndroid Build Coastguard Worker      *  DateIntervalInfo, and default locale.
357*0e209d39SAndroid Build Coastguard Worker      *
358*0e209d39SAndroid Build Coastguard Worker      * This is a convenient override of
359*0e209d39SAndroid Build Coastguard Worker      * createInstance(const UnicodeString& skeleton, const Locale& locale,
360*0e209d39SAndroid Build Coastguard Worker      *                const DateIntervalInfo& dtitvinf, UErrorCode&)
361*0e209d39SAndroid Build Coastguard Worker      * with the locale value as default locale.
362*0e209d39SAndroid Build Coastguard Worker      *
363*0e209d39SAndroid Build Coastguard Worker      * @param skeleton  the skeleton on which interval format based.
364*0e209d39SAndroid Build Coastguard Worker      * @param dtitvinf  the DateIntervalInfo object.
365*0e209d39SAndroid Build Coastguard Worker      * @param status    output param set to success/failure code on exit
366*0e209d39SAndroid Build Coastguard Worker      * @return          a date time interval formatter which the caller owns.
367*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
368*0e209d39SAndroid Build Coastguard Worker      */
369*0e209d39SAndroid Build Coastguard Worker     static DateIntervalFormat* U_EXPORT2 createInstance(
370*0e209d39SAndroid Build Coastguard Worker                                               const UnicodeString& skeleton,
371*0e209d39SAndroid Build Coastguard Worker                                               const DateIntervalInfo& dtitvinf,
372*0e209d39SAndroid Build Coastguard Worker                                               UErrorCode& status);
373*0e209d39SAndroid Build Coastguard Worker 
374*0e209d39SAndroid Build Coastguard Worker     /**
375*0e209d39SAndroid Build Coastguard Worker      * Construct a DateIntervalFormat from skeleton
376*0e209d39SAndroid Build Coastguard Worker      * a DateIntervalInfo, and the given locale.
377*0e209d39SAndroid Build Coastguard Worker      *
378*0e209d39SAndroid Build Coastguard Worker      * <P>
379*0e209d39SAndroid Build Coastguard Worker      * In this factory method, user provides its own date interval pattern
380*0e209d39SAndroid Build Coastguard Worker      * information, instead of using those pre-defined data in resource file.
381*0e209d39SAndroid Build Coastguard Worker      * This factory method is for powerful users who want to provide their own
382*0e209d39SAndroid Build Coastguard Worker      * interval patterns.
383*0e209d39SAndroid Build Coastguard Worker      * <P>
384*0e209d39SAndroid Build Coastguard Worker      * There are pre-defined skeletons (defined in udate.h) having predefined
385*0e209d39SAndroid Build Coastguard Worker      * interval patterns in resource files.
386*0e209d39SAndroid Build Coastguard Worker      * Users are encouraged to use those macros.
387*0e209d39SAndroid Build Coastguard Worker      * For example:
388*0e209d39SAndroid Build Coastguard Worker      * DateIntervalFormat::createInstance(UDAT_MONTH_DAY, status)
389*0e209d39SAndroid Build Coastguard Worker      *
390*0e209d39SAndroid Build Coastguard Worker      * The DateIntervalInfo provides the interval patterns.
391*0e209d39SAndroid Build Coastguard Worker      * and the DateIntervalInfo ownership remains to the caller.
392*0e209d39SAndroid Build Coastguard Worker      *
393*0e209d39SAndroid Build Coastguard Worker      * User are encouraged to set default interval pattern in DateIntervalInfo
394*0e209d39SAndroid Build Coastguard Worker      * as well, if they want to set other interval patterns ( instead of
395*0e209d39SAndroid Build Coastguard Worker      * reading the interval patterns from resource files).
396*0e209d39SAndroid Build Coastguard Worker      * When the corresponding interval pattern for a largest calendar different
397*0e209d39SAndroid Build Coastguard Worker      * field is not found ( if user not set it ), interval format fallback to
398*0e209d39SAndroid Build Coastguard Worker      * the default interval pattern.
399*0e209d39SAndroid Build Coastguard Worker      * If user does not provide default interval pattern, it fallback to
400*0e209d39SAndroid Build Coastguard Worker      * "{date0} - {date1}"
401*0e209d39SAndroid Build Coastguard Worker      *
402*0e209d39SAndroid Build Coastguard Worker      * @param skeleton  the skeleton on which interval format based.
403*0e209d39SAndroid Build Coastguard Worker      * @param locale    the given locale
404*0e209d39SAndroid Build Coastguard Worker      * @param dtitvinf  the DateIntervalInfo object.
405*0e209d39SAndroid Build Coastguard Worker      * @param status    output param set to success/failure code on exit
406*0e209d39SAndroid Build Coastguard Worker      * @return          a date time interval formatter which the caller owns.
407*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
408*0e209d39SAndroid Build Coastguard Worker      */
409*0e209d39SAndroid Build Coastguard Worker     static DateIntervalFormat* U_EXPORT2 createInstance(
410*0e209d39SAndroid Build Coastguard Worker                                               const UnicodeString& skeleton,
411*0e209d39SAndroid Build Coastguard Worker                                               const Locale& locale,
412*0e209d39SAndroid Build Coastguard Worker                                               const DateIntervalInfo& dtitvinf,
413*0e209d39SAndroid Build Coastguard Worker                                               UErrorCode& status);
414*0e209d39SAndroid Build Coastguard Worker 
415*0e209d39SAndroid Build Coastguard Worker     /**
416*0e209d39SAndroid Build Coastguard Worker      * Destructor.
417*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
418*0e209d39SAndroid Build Coastguard Worker      */
419*0e209d39SAndroid Build Coastguard Worker     virtual ~DateIntervalFormat();
420*0e209d39SAndroid Build Coastguard Worker 
421*0e209d39SAndroid Build Coastguard Worker     /**
422*0e209d39SAndroid Build Coastguard Worker      * Clone this Format object polymorphically. The caller owns the result and
423*0e209d39SAndroid Build Coastguard Worker      * should delete it when done.
424*0e209d39SAndroid Build Coastguard Worker      * @return    A copy of the object.
425*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
426*0e209d39SAndroid Build Coastguard Worker      */
427*0e209d39SAndroid Build Coastguard Worker     virtual DateIntervalFormat* clone() const override;
428*0e209d39SAndroid Build Coastguard Worker 
429*0e209d39SAndroid Build Coastguard Worker     /**
430*0e209d39SAndroid Build Coastguard Worker      * Return true if the given Format objects are semantically equal. Objects
431*0e209d39SAndroid Build Coastguard Worker      * of different subclasses are considered unequal.
432*0e209d39SAndroid Build Coastguard Worker      * @param other    the object to be compared with.
433*0e209d39SAndroid Build Coastguard Worker      * @return         true if the given Format objects are semantically equal.
434*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
435*0e209d39SAndroid Build Coastguard Worker      */
436*0e209d39SAndroid Build Coastguard Worker     virtual bool operator==(const Format& other) const override;
437*0e209d39SAndroid Build Coastguard Worker 
438*0e209d39SAndroid Build Coastguard Worker     /**
439*0e209d39SAndroid Build Coastguard Worker      * Return true if the given Format objects are not semantically equal.
440*0e209d39SAndroid Build Coastguard Worker      * Objects of different subclasses are considered unequal.
441*0e209d39SAndroid Build Coastguard Worker      * @param other the object to be compared with.
442*0e209d39SAndroid Build Coastguard Worker      * @return      true if the given Format objects are not semantically equal.
443*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
444*0e209d39SAndroid Build Coastguard Worker      */
445*0e209d39SAndroid Build Coastguard Worker     bool operator!=(const Format& other) const;
446*0e209d39SAndroid Build Coastguard Worker 
447*0e209d39SAndroid Build Coastguard Worker 
448*0e209d39SAndroid Build Coastguard Worker     using Format::format;
449*0e209d39SAndroid Build Coastguard Worker 
450*0e209d39SAndroid Build Coastguard Worker     /**
451*0e209d39SAndroid Build Coastguard Worker      * Format an object to produce a string. This method handles Formattable
452*0e209d39SAndroid Build Coastguard Worker      * objects with a DateInterval type.
453*0e209d39SAndroid Build Coastguard Worker      * If a the Formattable object type is not a DateInterval,
454*0e209d39SAndroid Build Coastguard Worker      * then it returns a failing UErrorCode.
455*0e209d39SAndroid Build Coastguard Worker      *
456*0e209d39SAndroid Build Coastguard Worker      * @param obj               The object to format.
457*0e209d39SAndroid Build Coastguard Worker      *                          Must be a DateInterval.
458*0e209d39SAndroid Build Coastguard Worker      * @param appendTo          Output parameter to receive result.
459*0e209d39SAndroid Build Coastguard Worker      *                          Result is appended to existing contents.
460*0e209d39SAndroid Build Coastguard Worker      * @param fieldPosition     On input: an alignment field, if desired.
461*0e209d39SAndroid Build Coastguard Worker      *                          On output: the offsets of the alignment field.
462*0e209d39SAndroid Build Coastguard Worker      *                          There may be multiple instances of a given field type
463*0e209d39SAndroid Build Coastguard Worker      *                          in an interval format; in this case the fieldPosition
464*0e209d39SAndroid Build Coastguard Worker      *                          offsets refer to the first instance.
465*0e209d39SAndroid Build Coastguard Worker      * @param status            Output param filled with success/failure status.
466*0e209d39SAndroid Build Coastguard Worker      * @return                  Reference to 'appendTo' parameter.
467*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
468*0e209d39SAndroid Build Coastguard Worker      */
469*0e209d39SAndroid Build Coastguard Worker     virtual UnicodeString& format(const Formattable& obj,
470*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
471*0e209d39SAndroid Build Coastguard Worker                                   FieldPosition& fieldPosition,
472*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const override;
473*0e209d39SAndroid Build Coastguard Worker 
474*0e209d39SAndroid Build Coastguard Worker 
475*0e209d39SAndroid Build Coastguard Worker 
476*0e209d39SAndroid Build Coastguard Worker     /**
477*0e209d39SAndroid Build Coastguard Worker      * Format a DateInterval to produce a string.
478*0e209d39SAndroid Build Coastguard Worker      *
479*0e209d39SAndroid Build Coastguard Worker      * @param dtInterval        DateInterval to be formatted.
480*0e209d39SAndroid Build Coastguard Worker      * @param appendTo          Output parameter to receive result.
481*0e209d39SAndroid Build Coastguard Worker      *                          Result is appended to existing contents.
482*0e209d39SAndroid Build Coastguard Worker      * @param fieldPosition     On input: an alignment field, if desired.
483*0e209d39SAndroid Build Coastguard Worker      *                          On output: the offsets of the alignment field.
484*0e209d39SAndroid Build Coastguard Worker      *                          There may be multiple instances of a given field type
485*0e209d39SAndroid Build Coastguard Worker      *                          in an interval format; in this case the fieldPosition
486*0e209d39SAndroid Build Coastguard Worker      *                          offsets refer to the first instance.
487*0e209d39SAndroid Build Coastguard Worker      * @param status            Output param filled with success/failure status.
488*0e209d39SAndroid Build Coastguard Worker      * @return                  Reference to 'appendTo' parameter.
489*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
490*0e209d39SAndroid Build Coastguard Worker      */
491*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(const DateInterval* dtInterval,
492*0e209d39SAndroid Build Coastguard Worker                           UnicodeString& appendTo,
493*0e209d39SAndroid Build Coastguard Worker                           FieldPosition& fieldPosition,
494*0e209d39SAndroid Build Coastguard Worker                           UErrorCode& status) const ;
495*0e209d39SAndroid Build Coastguard Worker 
496*0e209d39SAndroid Build Coastguard Worker     /**
497*0e209d39SAndroid Build Coastguard Worker      * Format a DateInterval to produce a FormattedDateInterval.
498*0e209d39SAndroid Build Coastguard Worker      *
499*0e209d39SAndroid Build Coastguard Worker      * The FormattedDateInterval exposes field information about the formatted string.
500*0e209d39SAndroid Build Coastguard Worker      *
501*0e209d39SAndroid Build Coastguard Worker      * @param dtInterval        DateInterval to be formatted.
502*0e209d39SAndroid Build Coastguard Worker      * @param status            Set if an error occurs.
503*0e209d39SAndroid Build Coastguard Worker      * @return                  A FormattedDateInterval containing the format result.
504*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 64
505*0e209d39SAndroid Build Coastguard Worker      */
506*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval formatToValue(
507*0e209d39SAndroid Build Coastguard Worker         const DateInterval& dtInterval,
508*0e209d39SAndroid Build Coastguard Worker         UErrorCode& status) const;
509*0e209d39SAndroid Build Coastguard Worker 
510*0e209d39SAndroid Build Coastguard Worker     /**
511*0e209d39SAndroid Build Coastguard Worker      * Format 2 Calendars to produce a string.
512*0e209d39SAndroid Build Coastguard Worker      *
513*0e209d39SAndroid Build Coastguard Worker      * Note: "fromCalendar" and "toCalendar" are not const,
514*0e209d39SAndroid Build Coastguard Worker      * since calendar is not const in  SimpleDateFormat::format(Calendar&),
515*0e209d39SAndroid Build Coastguard Worker      *
516*0e209d39SAndroid Build Coastguard Worker      * @param fromCalendar      calendar set to the from date in date interval
517*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
518*0e209d39SAndroid Build Coastguard Worker      * @param toCalendar        calendar set to the to date in date interval
519*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
520*0e209d39SAndroid Build Coastguard Worker      * @param appendTo          Output parameter to receive result.
521*0e209d39SAndroid Build Coastguard Worker      *                          Result is appended to existing contents.
522*0e209d39SAndroid Build Coastguard Worker      * @param fieldPosition     On input: an alignment field, if desired.
523*0e209d39SAndroid Build Coastguard Worker      *                          On output: the offsets of the alignment field.
524*0e209d39SAndroid Build Coastguard Worker      *                          There may be multiple instances of a given field type
525*0e209d39SAndroid Build Coastguard Worker      *                          in an interval format; in this case the fieldPosition
526*0e209d39SAndroid Build Coastguard Worker      *                          offsets refer to the first instance.
527*0e209d39SAndroid Build Coastguard Worker      * @param status            Output param filled with success/failure status.
528*0e209d39SAndroid Build Coastguard Worker      *                          Caller needs to make sure it is SUCCESS
529*0e209d39SAndroid Build Coastguard Worker      *                          at the function entrance
530*0e209d39SAndroid Build Coastguard Worker      * @return                  Reference to 'appendTo' parameter.
531*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
532*0e209d39SAndroid Build Coastguard Worker      */
533*0e209d39SAndroid Build Coastguard Worker     UnicodeString& format(Calendar& fromCalendar,
534*0e209d39SAndroid Build Coastguard Worker                           Calendar& toCalendar,
535*0e209d39SAndroid Build Coastguard Worker                           UnicodeString& appendTo,
536*0e209d39SAndroid Build Coastguard Worker                           FieldPosition& fieldPosition,
537*0e209d39SAndroid Build Coastguard Worker                           UErrorCode& status) const ;
538*0e209d39SAndroid Build Coastguard Worker 
539*0e209d39SAndroid Build Coastguard Worker     /**
540*0e209d39SAndroid Build Coastguard Worker      * Format 2 Calendars to produce a FormattedDateInterval.
541*0e209d39SAndroid Build Coastguard Worker      *
542*0e209d39SAndroid Build Coastguard Worker      * The FormattedDateInterval exposes field information about the formatted string.
543*0e209d39SAndroid Build Coastguard Worker      *
544*0e209d39SAndroid Build Coastguard Worker      * Note: "fromCalendar" and "toCalendar" are not const,
545*0e209d39SAndroid Build Coastguard Worker      * since calendar is not const in  SimpleDateFormat::format(Calendar&),
546*0e209d39SAndroid Build Coastguard Worker      *
547*0e209d39SAndroid Build Coastguard Worker      * @param fromCalendar      calendar set to the from date in date interval
548*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
549*0e209d39SAndroid Build Coastguard Worker      * @param toCalendar        calendar set to the to date in date interval
550*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
551*0e209d39SAndroid Build Coastguard Worker      * @param status            Set if an error occurs.
552*0e209d39SAndroid Build Coastguard Worker      * @return                  A FormattedDateInterval containing the format result.
553*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 64
554*0e209d39SAndroid Build Coastguard Worker      */
555*0e209d39SAndroid Build Coastguard Worker     FormattedDateInterval formatToValue(
556*0e209d39SAndroid Build Coastguard Worker         Calendar& fromCalendar,
557*0e209d39SAndroid Build Coastguard Worker         Calendar& toCalendar,
558*0e209d39SAndroid Build Coastguard Worker         UErrorCode& status) const;
559*0e209d39SAndroid Build Coastguard Worker 
560*0e209d39SAndroid Build Coastguard Worker     /**
561*0e209d39SAndroid Build Coastguard Worker      * Date interval parsing is not supported. Please do not use.
562*0e209d39SAndroid Build Coastguard Worker      * <P>
563*0e209d39SAndroid Build Coastguard Worker      * This method should handle parsing of
564*0e209d39SAndroid Build Coastguard Worker      * date time interval strings into Formattable objects with
565*0e209d39SAndroid Build Coastguard Worker      * DateInterval type, which is a pair of UDate.
566*0e209d39SAndroid Build Coastguard Worker      * <P>
567*0e209d39SAndroid Build Coastguard Worker      * Before calling, set parse_pos.index to the offset you want to start
568*0e209d39SAndroid Build Coastguard Worker      * parsing at in the source. After calling, parse_pos.index is the end of
569*0e209d39SAndroid Build Coastguard Worker      * the text you parsed. If error occurs, index is unchanged.
570*0e209d39SAndroid Build Coastguard Worker      * <P>
571*0e209d39SAndroid Build Coastguard Worker      * When parsing, leading whitespace is discarded (with a successful parse),
572*0e209d39SAndroid Build Coastguard Worker      * while trailing whitespace is left as is.
573*0e209d39SAndroid Build Coastguard Worker      * <P>
574*0e209d39SAndroid Build Coastguard Worker      * See Format::parseObject() for more.
575*0e209d39SAndroid Build Coastguard Worker      *
576*0e209d39SAndroid Build Coastguard Worker      * @param source    The string to be parsed into an object.
577*0e209d39SAndroid Build Coastguard Worker      * @param result    Formattable to be set to the parse result.
578*0e209d39SAndroid Build Coastguard Worker      *                  If parse fails, return contents are undefined.
579*0e209d39SAndroid Build Coastguard Worker      * @param parse_pos The position to start parsing at. Since no parsing
580*0e209d39SAndroid Build Coastguard Worker      *                  is supported, upon return this param is unchanged.
581*0e209d39SAndroid Build Coastguard Worker      * @return          A newly created Formattable* object, or nullptr
582*0e209d39SAndroid Build Coastguard Worker      *                  on failure.  The caller owns this and should
583*0e209d39SAndroid Build Coastguard Worker      *                  delete it when done.
584*0e209d39SAndroid Build Coastguard Worker      * @internal ICU 4.0
585*0e209d39SAndroid Build Coastguard Worker      */
586*0e209d39SAndroid Build Coastguard Worker     virtual void parseObject(const UnicodeString& source,
587*0e209d39SAndroid Build Coastguard Worker                              Formattable& result,
588*0e209d39SAndroid Build Coastguard Worker                              ParsePosition& parse_pos) const override;
589*0e209d39SAndroid Build Coastguard Worker 
590*0e209d39SAndroid Build Coastguard Worker 
591*0e209d39SAndroid Build Coastguard Worker     /**
592*0e209d39SAndroid Build Coastguard Worker      * Gets the date time interval patterns.
593*0e209d39SAndroid Build Coastguard Worker      * @return the date time interval patterns associated with
594*0e209d39SAndroid Build Coastguard Worker      * this date interval formatter.
595*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
596*0e209d39SAndroid Build Coastguard Worker      */
597*0e209d39SAndroid Build Coastguard Worker     const DateIntervalInfo* getDateIntervalInfo() const;
598*0e209d39SAndroid Build Coastguard Worker 
599*0e209d39SAndroid Build Coastguard Worker     /**
600*0e209d39SAndroid Build Coastguard Worker      * Set the date time interval patterns.
601*0e209d39SAndroid Build Coastguard Worker      * @param newIntervalPatterns   the given interval patterns to copy.
602*0e209d39SAndroid Build Coastguard Worker      * @param status          output param set to success/failure code on exit
603*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
604*0e209d39SAndroid Build Coastguard Worker      */
605*0e209d39SAndroid Build Coastguard Worker     void setDateIntervalInfo(const DateIntervalInfo& newIntervalPatterns,
606*0e209d39SAndroid Build Coastguard Worker                              UErrorCode& status);
607*0e209d39SAndroid Build Coastguard Worker 
608*0e209d39SAndroid Build Coastguard Worker 
609*0e209d39SAndroid Build Coastguard Worker     /**
610*0e209d39SAndroid Build Coastguard Worker      * Gets the date formatter. The DateIntervalFormat instance continues to own
611*0e209d39SAndroid Build Coastguard Worker      * the returned DateFormatter object, and will use and possibly modify it
612*0e209d39SAndroid Build Coastguard Worker      * during format operations. In a multi-threaded environment, the returned
613*0e209d39SAndroid Build Coastguard Worker      * DateFormat can only be used if it is certain that no other threads are
614*0e209d39SAndroid Build Coastguard Worker      * concurrently using this DateIntervalFormatter, even for nominally const
615*0e209d39SAndroid Build Coastguard Worker      * functions.
616*0e209d39SAndroid Build Coastguard Worker      *
617*0e209d39SAndroid Build Coastguard Worker      * @return the date formatter associated with this date interval formatter.
618*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
619*0e209d39SAndroid Build Coastguard Worker      */
620*0e209d39SAndroid Build Coastguard Worker     const DateFormat* getDateFormat() const;
621*0e209d39SAndroid Build Coastguard Worker 
622*0e209d39SAndroid Build Coastguard Worker     /**
623*0e209d39SAndroid Build Coastguard Worker      * Returns a reference to the TimeZone used by this DateIntervalFormat's calendar.
624*0e209d39SAndroid Build Coastguard Worker      * @return the time zone associated with the calendar of DateIntervalFormat.
625*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
626*0e209d39SAndroid Build Coastguard Worker      */
627*0e209d39SAndroid Build Coastguard Worker     virtual const TimeZone& getTimeZone() const;
628*0e209d39SAndroid Build Coastguard Worker 
629*0e209d39SAndroid Build Coastguard Worker     /**
630*0e209d39SAndroid Build Coastguard Worker      * Sets the time zone for the calendar used by this DateIntervalFormat object. The
631*0e209d39SAndroid Build Coastguard Worker      * caller no longer owns the TimeZone object and should not delete it after this call.
632*0e209d39SAndroid Build Coastguard Worker      * @param zoneToAdopt the TimeZone to be adopted.
633*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
634*0e209d39SAndroid Build Coastguard Worker      */
635*0e209d39SAndroid Build Coastguard Worker     virtual void adoptTimeZone(TimeZone* zoneToAdopt);
636*0e209d39SAndroid Build Coastguard Worker 
637*0e209d39SAndroid Build Coastguard Worker     /**
638*0e209d39SAndroid Build Coastguard Worker      * Sets the time zone for the calendar used by this DateIntervalFormat object.
639*0e209d39SAndroid Build Coastguard Worker      * @param zone the new time zone.
640*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.8
641*0e209d39SAndroid Build Coastguard Worker      */
642*0e209d39SAndroid Build Coastguard Worker     virtual void setTimeZone(const TimeZone& zone);
643*0e209d39SAndroid Build Coastguard Worker 
644*0e209d39SAndroid Build Coastguard Worker     /**
645*0e209d39SAndroid Build Coastguard Worker      * Set a particular UDisplayContext value in the formatter, such as
646*0e209d39SAndroid Build Coastguard Worker      * UDISPCTX_CAPITALIZATION_FOR_STANDALONE. This causes the formatted
647*0e209d39SAndroid Build Coastguard Worker      * result to be capitalized appropriately for the context in which
648*0e209d39SAndroid Build Coastguard Worker      * it is intended to be used, considering both the locale and the
649*0e209d39SAndroid Build Coastguard Worker      * type of field at the beginning of the formatted result.
650*0e209d39SAndroid Build Coastguard Worker      * @param value The UDisplayContext value to set.
651*0e209d39SAndroid Build Coastguard Worker      * @param status Input/output status. If at entry this indicates a failure
652*0e209d39SAndroid Build Coastguard Worker      *               status, the function will do nothing; otherwise this will be
653*0e209d39SAndroid Build Coastguard Worker      *               updated with any new status from the function.
654*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 68
655*0e209d39SAndroid Build Coastguard Worker      */
656*0e209d39SAndroid Build Coastguard Worker     virtual void setContext(UDisplayContext value, UErrorCode& status);
657*0e209d39SAndroid Build Coastguard Worker 
658*0e209d39SAndroid Build Coastguard Worker     /**
659*0e209d39SAndroid Build Coastguard Worker      * Get the formatter's UDisplayContext value for the specified UDisplayContextType,
660*0e209d39SAndroid Build Coastguard Worker      * such as UDISPCTX_TYPE_CAPITALIZATION.
661*0e209d39SAndroid Build Coastguard Worker      * @param type The UDisplayContextType whose value to return
662*0e209d39SAndroid Build Coastguard Worker      * @param status Input/output status. If at entry this indicates a failure
663*0e209d39SAndroid Build Coastguard Worker      *               status, the function will do nothing; otherwise this will be
664*0e209d39SAndroid Build Coastguard Worker      *               updated with any new status from the function.
665*0e209d39SAndroid Build Coastguard Worker      * @return The UDisplayContextValue for the specified type.
666*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 68
667*0e209d39SAndroid Build Coastguard Worker      */
668*0e209d39SAndroid Build Coastguard Worker     virtual UDisplayContext getContext(UDisplayContextType type, UErrorCode& status) const;
669*0e209d39SAndroid Build Coastguard Worker 
670*0e209d39SAndroid Build Coastguard Worker     /**
671*0e209d39SAndroid Build Coastguard Worker      * Return the class ID for this class. This is useful only for comparing to
672*0e209d39SAndroid Build Coastguard Worker      * a return value from getDynamicClassID(). For example:
673*0e209d39SAndroid Build Coastguard Worker      * <pre>
674*0e209d39SAndroid Build Coastguard Worker      * .   Base* polymorphic_pointer = createPolymorphicObject();
675*0e209d39SAndroid Build Coastguard Worker      * .   if (polymorphic_pointer->getDynamicClassID() ==
676*0e209d39SAndroid Build Coastguard Worker      * .       erived::getStaticClassID()) ...
677*0e209d39SAndroid Build Coastguard Worker      * </pre>
678*0e209d39SAndroid Build Coastguard Worker      * @return          The class ID for all objects of this class.
679*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
680*0e209d39SAndroid Build Coastguard Worker      */
681*0e209d39SAndroid Build Coastguard Worker     static UClassID U_EXPORT2 getStaticClassID();
682*0e209d39SAndroid Build Coastguard Worker 
683*0e209d39SAndroid Build Coastguard Worker     /**
684*0e209d39SAndroid Build Coastguard Worker      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
685*0e209d39SAndroid Build Coastguard Worker      * method is to implement a simple version of RTTI, since not all C++
686*0e209d39SAndroid Build Coastguard Worker      * compilers support genuine RTTI. Polymorphic operator==() and clone()
687*0e209d39SAndroid Build Coastguard Worker      * methods call this method.
688*0e209d39SAndroid Build Coastguard Worker      *
689*0e209d39SAndroid Build Coastguard Worker      * @return          The class ID for this object. All objects of a
690*0e209d39SAndroid Build Coastguard Worker      *                  given class have the same class ID.  Objects of
691*0e209d39SAndroid Build Coastguard Worker      *                  other classes have different class IDs.
692*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
693*0e209d39SAndroid Build Coastguard Worker      */
694*0e209d39SAndroid Build Coastguard Worker     virtual UClassID getDynamicClassID() const override;
695*0e209d39SAndroid Build Coastguard Worker 
696*0e209d39SAndroid Build Coastguard Worker protected:
697*0e209d39SAndroid Build Coastguard Worker 
698*0e209d39SAndroid Build Coastguard Worker     /**
699*0e209d39SAndroid Build Coastguard Worker      * Copy constructor.
700*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
701*0e209d39SAndroid Build Coastguard Worker      */
702*0e209d39SAndroid Build Coastguard Worker     DateIntervalFormat(const DateIntervalFormat&);
703*0e209d39SAndroid Build Coastguard Worker 
704*0e209d39SAndroid Build Coastguard Worker     /**
705*0e209d39SAndroid Build Coastguard Worker      * Assignment operator.
706*0e209d39SAndroid Build Coastguard Worker      * @stable ICU 4.0
707*0e209d39SAndroid Build Coastguard Worker      */
708*0e209d39SAndroid Build Coastguard Worker     DateIntervalFormat& operator=(const DateIntervalFormat&);
709*0e209d39SAndroid Build Coastguard Worker 
710*0e209d39SAndroid Build Coastguard Worker private:
711*0e209d39SAndroid Build Coastguard Worker 
712*0e209d39SAndroid Build Coastguard Worker     /*
713*0e209d39SAndroid Build Coastguard Worker      * This is for ICU internal use only. Please do not use.
714*0e209d39SAndroid Build Coastguard Worker      * Save the interval pattern information.
715*0e209d39SAndroid Build Coastguard Worker      * Interval pattern consists of 2 single date patterns and the separator.
716*0e209d39SAndroid Build Coastguard Worker      * For example, interval pattern "MMM d - MMM d, yyyy" consists
717*0e209d39SAndroid Build Coastguard Worker      * a single date pattern "MMM d", another single date pattern "MMM d, yyyy",
718*0e209d39SAndroid Build Coastguard Worker      * and a separator "-".
719*0e209d39SAndroid Build Coastguard Worker      * The pattern is divided into 2 parts. For above example,
720*0e209d39SAndroid Build Coastguard Worker      * the first part is "MMM d - ", and the second part is "MMM d, yyyy".
721*0e209d39SAndroid Build Coastguard Worker      * Also, the first date appears in an interval pattern could be
722*0e209d39SAndroid Build Coastguard Worker      * the earlier date or the later date.
723*0e209d39SAndroid Build Coastguard Worker      * And such information is saved in the interval pattern as well.
724*0e209d39SAndroid Build Coastguard Worker      */
725*0e209d39SAndroid Build Coastguard Worker     struct PatternInfo {
726*0e209d39SAndroid Build Coastguard Worker         UnicodeString firstPart;
727*0e209d39SAndroid Build Coastguard Worker         UnicodeString secondPart;
728*0e209d39SAndroid Build Coastguard Worker         /**
729*0e209d39SAndroid Build Coastguard Worker          * Whether the first date in interval pattern is later date or not.
730*0e209d39SAndroid Build Coastguard Worker          * Fallback format set the default ordering.
731*0e209d39SAndroid Build Coastguard Worker          * And for a particular interval pattern, the order can be
732*0e209d39SAndroid Build Coastguard Worker          * overridden by prefixing the interval pattern with "latestFirst:" or
733*0e209d39SAndroid Build Coastguard Worker          * "earliestFirst:"
734*0e209d39SAndroid Build Coastguard Worker          * For example, given 2 date, Jan 10, 2007 to Feb 10, 2007.
735*0e209d39SAndroid Build Coastguard Worker          * if the fallback format is "{0} - {1}",
736*0e209d39SAndroid Build Coastguard Worker          * and the pattern is "d MMM - d MMM yyyy", the interval format is
737*0e209d39SAndroid Build Coastguard Worker          * "10 Jan - 10 Feb, 2007".
738*0e209d39SAndroid Build Coastguard Worker          * If the pattern is "latestFirst:d MMM - d MMM yyyy",
739*0e209d39SAndroid Build Coastguard Worker          * the interval format is "10 Feb - 10 Jan, 2007"
740*0e209d39SAndroid Build Coastguard Worker          */
741*0e209d39SAndroid Build Coastguard Worker         UBool         laterDateFirst;
742*0e209d39SAndroid Build Coastguard Worker     };
743*0e209d39SAndroid Build Coastguard Worker 
744*0e209d39SAndroid Build Coastguard Worker 
745*0e209d39SAndroid Build Coastguard Worker     /**
746*0e209d39SAndroid Build Coastguard Worker      * default constructor
747*0e209d39SAndroid Build Coastguard Worker      * @internal (private)
748*0e209d39SAndroid Build Coastguard Worker      */
749*0e209d39SAndroid Build Coastguard Worker     DateIntervalFormat();
750*0e209d39SAndroid Build Coastguard Worker 
751*0e209d39SAndroid Build Coastguard Worker     /**
752*0e209d39SAndroid Build Coastguard Worker      * Construct a DateIntervalFormat from DateFormat,
753*0e209d39SAndroid Build Coastguard Worker      * a DateIntervalInfo, and skeleton.
754*0e209d39SAndroid Build Coastguard Worker      * DateFormat provides the timezone, calendar,
755*0e209d39SAndroid Build Coastguard Worker      * full pattern, and date format symbols information.
756*0e209d39SAndroid Build Coastguard Worker      * It should be a SimpleDateFormat object which
757*0e209d39SAndroid Build Coastguard Worker      * has a pattern in it.
758*0e209d39SAndroid Build Coastguard Worker      * the DateIntervalInfo provides the interval patterns.
759*0e209d39SAndroid Build Coastguard Worker      *
760*0e209d39SAndroid Build Coastguard Worker      * Note: the DateIntervalFormat takes ownership of both
761*0e209d39SAndroid Build Coastguard Worker      * DateFormat and DateIntervalInfo objects.
762*0e209d39SAndroid Build Coastguard Worker      * Caller should not delete them.
763*0e209d39SAndroid Build Coastguard Worker      *
764*0e209d39SAndroid Build Coastguard Worker      * @param locale    the locale of this date interval formatter.
765*0e209d39SAndroid Build Coastguard Worker      * @param dtItvInfo the DateIntervalInfo object to be adopted.
766*0e209d39SAndroid Build Coastguard Worker      * @param skeleton  the skeleton of the date formatter
767*0e209d39SAndroid Build Coastguard Worker      * @param status    output param set to success/failure code on exit
768*0e209d39SAndroid Build Coastguard Worker      */
769*0e209d39SAndroid Build Coastguard Worker     DateIntervalFormat(const Locale& locale, DateIntervalInfo* dtItvInfo,
770*0e209d39SAndroid Build Coastguard Worker                        const UnicodeString* skeleton, UErrorCode& status);
771*0e209d39SAndroid Build Coastguard Worker 
772*0e209d39SAndroid Build Coastguard Worker 
773*0e209d39SAndroid Build Coastguard Worker     /**
774*0e209d39SAndroid Build Coastguard Worker      * Construct a DateIntervalFormat from DateFormat
775*0e209d39SAndroid Build Coastguard Worker      * and a DateIntervalInfo.
776*0e209d39SAndroid Build Coastguard Worker      *
777*0e209d39SAndroid Build Coastguard Worker      * It is a wrapper of the constructor.
778*0e209d39SAndroid Build Coastguard Worker      *
779*0e209d39SAndroid Build Coastguard Worker      * @param locale    the locale of this date interval formatter.
780*0e209d39SAndroid Build Coastguard Worker      * @param dtitvinf  the DateIntervalInfo object to be adopted.
781*0e209d39SAndroid Build Coastguard Worker      * @param skeleton  the skeleton of this formatter.
782*0e209d39SAndroid Build Coastguard Worker      * @param status    Output param set to success/failure code.
783*0e209d39SAndroid Build Coastguard Worker      * @return          a date time interval formatter which the caller owns.
784*0e209d39SAndroid Build Coastguard Worker      */
785*0e209d39SAndroid Build Coastguard Worker     static DateIntervalFormat* U_EXPORT2 create(const Locale& locale,
786*0e209d39SAndroid Build Coastguard Worker                                                 DateIntervalInfo* dtitvinf,
787*0e209d39SAndroid Build Coastguard Worker                                                 const UnicodeString* skeleton,
788*0e209d39SAndroid Build Coastguard Worker                                                 UErrorCode& status);
789*0e209d39SAndroid Build Coastguard Worker 
790*0e209d39SAndroid Build Coastguard Worker     /**
791*0e209d39SAndroid Build Coastguard Worker      *  Below are for generating interval patterns local to the formatter
792*0e209d39SAndroid Build Coastguard Worker      */
793*0e209d39SAndroid Build Coastguard Worker 
794*0e209d39SAndroid Build Coastguard Worker     /** Like fallbackFormat, but only formats the range part of the fallback. */
795*0e209d39SAndroid Build Coastguard Worker     void fallbackFormatRange(
796*0e209d39SAndroid Build Coastguard Worker         Calendar& fromCalendar,
797*0e209d39SAndroid Build Coastguard Worker         Calendar& toCalendar,
798*0e209d39SAndroid Build Coastguard Worker         UnicodeString& appendTo,
799*0e209d39SAndroid Build Coastguard Worker         int8_t& firstIndex,
800*0e209d39SAndroid Build Coastguard Worker         FieldPositionHandler& fphandler,
801*0e209d39SAndroid Build Coastguard Worker         UErrorCode& status) const;
802*0e209d39SAndroid Build Coastguard Worker 
803*0e209d39SAndroid Build Coastguard Worker     /**
804*0e209d39SAndroid Build Coastguard Worker      * Format 2 Calendars using fall-back interval pattern
805*0e209d39SAndroid Build Coastguard Worker      *
806*0e209d39SAndroid Build Coastguard Worker      * The full pattern used in this fall-back format is the
807*0e209d39SAndroid Build Coastguard Worker      * full pattern of the date formatter.
808*0e209d39SAndroid Build Coastguard Worker      *
809*0e209d39SAndroid Build Coastguard Worker      * gFormatterMutex must already be locked when calling this function.
810*0e209d39SAndroid Build Coastguard Worker      *
811*0e209d39SAndroid Build Coastguard Worker      * @param fromCalendar      calendar set to the from date in date interval
812*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
813*0e209d39SAndroid Build Coastguard Worker      * @param toCalendar        calendar set to the to date in date interval
814*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
815*0e209d39SAndroid Build Coastguard Worker      * @param fromToOnSameDay   true iff from and to dates are on the same day
816*0e209d39SAndroid Build Coastguard Worker      *                          (any difference is in ampm/hours or below)
817*0e209d39SAndroid Build Coastguard Worker      * @param appendTo          Output parameter to receive result.
818*0e209d39SAndroid Build Coastguard Worker      *                          Result is appended to existing contents.
819*0e209d39SAndroid Build Coastguard Worker      * @param firstIndex        See formatImpl for more information.
820*0e209d39SAndroid Build Coastguard Worker      * @param fphandler         See formatImpl for more information.
821*0e209d39SAndroid Build Coastguard Worker      * @param status            output param set to success/failure code on exit
822*0e209d39SAndroid Build Coastguard Worker      * @return                  Reference to 'appendTo' parameter.
823*0e209d39SAndroid Build Coastguard Worker      * @internal (private)
824*0e209d39SAndroid Build Coastguard Worker      */
825*0e209d39SAndroid Build Coastguard Worker     UnicodeString& fallbackFormat(Calendar& fromCalendar,
826*0e209d39SAndroid Build Coastguard Worker                                   Calendar& toCalendar,
827*0e209d39SAndroid Build Coastguard Worker                                   UBool fromToOnSameDay,
828*0e209d39SAndroid Build Coastguard Worker                                   UnicodeString& appendTo,
829*0e209d39SAndroid Build Coastguard Worker                                   int8_t& firstIndex,
830*0e209d39SAndroid Build Coastguard Worker                                   FieldPositionHandler& fphandler,
831*0e209d39SAndroid Build Coastguard Worker                                   UErrorCode& status) const;
832*0e209d39SAndroid Build Coastguard Worker 
833*0e209d39SAndroid Build Coastguard Worker 
834*0e209d39SAndroid Build Coastguard Worker 
835*0e209d39SAndroid Build Coastguard Worker     /**
836*0e209d39SAndroid Build Coastguard Worker      * Initialize interval patterns locale to this formatter
837*0e209d39SAndroid Build Coastguard Worker      *
838*0e209d39SAndroid Build Coastguard Worker      * This code is a bit complicated since
839*0e209d39SAndroid Build Coastguard Worker      * 1. the interval patterns saved in resource bundle files are interval
840*0e209d39SAndroid Build Coastguard Worker      *    patterns based on date or time only.
841*0e209d39SAndroid Build Coastguard Worker      *    It does not have interval patterns based on both date and time.
842*0e209d39SAndroid Build Coastguard Worker      *    Interval patterns on both date and time are algorithm generated.
843*0e209d39SAndroid Build Coastguard Worker      *
844*0e209d39SAndroid Build Coastguard Worker      *    For example, it has interval patterns on skeleton "dMy" and "hm",
845*0e209d39SAndroid Build Coastguard Worker      *    but it does not have interval patterns on skeleton "dMyhm".
846*0e209d39SAndroid Build Coastguard Worker      *
847*0e209d39SAndroid Build Coastguard Worker      *    The rule to generate interval patterns for both date and time skeleton are
848*0e209d39SAndroid Build Coastguard Worker      *    1) when the year, month, or day differs, concatenate the two original
849*0e209d39SAndroid Build Coastguard Worker      *    expressions with a separator between,
850*0e209d39SAndroid Build Coastguard Worker      *    For example, interval pattern from "Jan 10, 2007 10:10 am"
851*0e209d39SAndroid Build Coastguard Worker      *    to "Jan 11, 2007 10:10am" is
852*0e209d39SAndroid Build Coastguard Worker      *    "Jan 10, 2007 10:10 am - Jan 11, 2007 10:10am"
853*0e209d39SAndroid Build Coastguard Worker      *
854*0e209d39SAndroid Build Coastguard Worker      *    2) otherwise, present the date followed by the range expression
855*0e209d39SAndroid Build Coastguard Worker      *    for the time.
856*0e209d39SAndroid Build Coastguard Worker      *    For example, interval pattern from "Jan 10, 2007 10:10 am"
857*0e209d39SAndroid Build Coastguard Worker      *    to "Jan 10, 2007 11:10am" is
858*0e209d39SAndroid Build Coastguard Worker      *    "Jan 10, 2007 10:10 am - 11:10am"
859*0e209d39SAndroid Build Coastguard Worker      *
860*0e209d39SAndroid Build Coastguard Worker      * 2. even a pattern does not request a certain calendar field,
861*0e209d39SAndroid Build Coastguard Worker      *    the interval pattern needs to include such field if such fields are
862*0e209d39SAndroid Build Coastguard Worker      *    different between 2 dates.
863*0e209d39SAndroid Build Coastguard Worker      *    For example, a pattern/skeleton is "hm", but the interval pattern
864*0e209d39SAndroid Build Coastguard Worker      *    includes year, month, and date when year, month, and date differs.
865*0e209d39SAndroid Build Coastguard Worker      *
866*0e209d39SAndroid Build Coastguard Worker      *
867*0e209d39SAndroid Build Coastguard Worker      * @param status    output param set to success/failure code on exit
868*0e209d39SAndroid Build Coastguard Worker      */
869*0e209d39SAndroid Build Coastguard Worker     void initializePattern(UErrorCode& status);
870*0e209d39SAndroid Build Coastguard Worker 
871*0e209d39SAndroid Build Coastguard Worker 
872*0e209d39SAndroid Build Coastguard Worker 
873*0e209d39SAndroid Build Coastguard Worker     /**
874*0e209d39SAndroid Build Coastguard Worker      * Set fall back interval pattern given a calendar field,
875*0e209d39SAndroid Build Coastguard Worker      * a skeleton, and a date time pattern generator.
876*0e209d39SAndroid Build Coastguard Worker      * @param field      the largest different calendar field
877*0e209d39SAndroid Build Coastguard Worker      * @param skeleton   a skeleton
878*0e209d39SAndroid Build Coastguard Worker      * @param status     output param set to success/failure code on exit
879*0e209d39SAndroid Build Coastguard Worker      */
880*0e209d39SAndroid Build Coastguard Worker     void setFallbackPattern(UCalendarDateFields field,
881*0e209d39SAndroid Build Coastguard Worker                             const UnicodeString& skeleton,
882*0e209d39SAndroid Build Coastguard Worker                             UErrorCode& status);
883*0e209d39SAndroid Build Coastguard Worker 
884*0e209d39SAndroid Build Coastguard Worker 
885*0e209d39SAndroid Build Coastguard Worker 
886*0e209d39SAndroid Build Coastguard Worker     /**
887*0e209d39SAndroid Build Coastguard Worker      * Converts special hour metacharacters (such as 'j') in the skeleton into locale-appropriate
888*0e209d39SAndroid Build Coastguard Worker      * pattern characters.
889*0e209d39SAndroid Build Coastguard Worker      *
890*0e209d39SAndroid Build Coastguard Worker      *
891*0e209d39SAndroid Build Coastguard Worker      *  @param skeleton               The skeleton to convert
892*0e209d39SAndroid Build Coastguard Worker      *  @return A copy of the skeleton, which "j" and any other special hour metacharacters converted to the regular ones.
893*0e209d39SAndroid Build Coastguard Worker      *
894*0e209d39SAndroid Build Coastguard Worker      */
895*0e209d39SAndroid Build Coastguard Worker     UnicodeString normalizeHourMetacharacters(const UnicodeString& skeleton) const;
896*0e209d39SAndroid Build Coastguard Worker 
897*0e209d39SAndroid Build Coastguard Worker 
898*0e209d39SAndroid Build Coastguard Worker 
899*0e209d39SAndroid Build Coastguard Worker     /**
900*0e209d39SAndroid Build Coastguard Worker      * get separated date and time skeleton from a combined skeleton.
901*0e209d39SAndroid Build Coastguard Worker      *
902*0e209d39SAndroid Build Coastguard Worker      * The difference between date skeleton and normalizedDateSkeleton are:
903*0e209d39SAndroid Build Coastguard Worker      * 1. both 'y' and 'd' are appeared only once in normalizeDateSkeleton
904*0e209d39SAndroid Build Coastguard Worker      * 2. 'E' and 'EE' are normalized into 'EEE'
905*0e209d39SAndroid Build Coastguard Worker      * 3. 'MM' is normalized into 'M'
906*0e209d39SAndroid Build Coastguard Worker      *
907*0e209d39SAndroid Build Coastguard Worker      ** the difference between time skeleton and normalizedTimeSkeleton are:
908*0e209d39SAndroid Build Coastguard Worker      * 1. both 'H' and 'h' are normalized as 'h' in normalized time skeleton,
909*0e209d39SAndroid Build Coastguard Worker      * 2. 'a' is omitted in normalized time skeleton.
910*0e209d39SAndroid Build Coastguard Worker      * 3. there is only one appearance for 'h', 'm','v', 'z' in normalized time
911*0e209d39SAndroid Build Coastguard Worker      *    skeleton
912*0e209d39SAndroid Build Coastguard Worker      *
913*0e209d39SAndroid Build Coastguard Worker      *
914*0e209d39SAndroid Build Coastguard Worker      *  @param skeleton               given combined skeleton.
915*0e209d39SAndroid Build Coastguard Worker      *  @param date                   Output parameter for date only skeleton.
916*0e209d39SAndroid Build Coastguard Worker      *  @param normalizedDate         Output parameter for normalized date only
917*0e209d39SAndroid Build Coastguard Worker      *
918*0e209d39SAndroid Build Coastguard Worker      *  @param time                   Output parameter for time only skeleton.
919*0e209d39SAndroid Build Coastguard Worker      *  @param normalizedTime         Output parameter for normalized time only
920*0e209d39SAndroid Build Coastguard Worker      *                                skeleton.
921*0e209d39SAndroid Build Coastguard Worker      *
922*0e209d39SAndroid Build Coastguard Worker      */
923*0e209d39SAndroid Build Coastguard Worker     static void  U_EXPORT2 getDateTimeSkeleton(const UnicodeString& skeleton,
924*0e209d39SAndroid Build Coastguard Worker                                     UnicodeString& date,
925*0e209d39SAndroid Build Coastguard Worker                                     UnicodeString& normalizedDate,
926*0e209d39SAndroid Build Coastguard Worker                                     UnicodeString& time,
927*0e209d39SAndroid Build Coastguard Worker                                     UnicodeString& normalizedTime);
928*0e209d39SAndroid Build Coastguard Worker 
929*0e209d39SAndroid Build Coastguard Worker 
930*0e209d39SAndroid Build Coastguard Worker 
931*0e209d39SAndroid Build Coastguard Worker     /**
932*0e209d39SAndroid Build Coastguard Worker      * Generate date or time interval pattern from resource,
933*0e209d39SAndroid Build Coastguard Worker      * and set them into the interval pattern locale to this formatter.
934*0e209d39SAndroid Build Coastguard Worker      *
935*0e209d39SAndroid Build Coastguard Worker      * It needs to handle the following:
936*0e209d39SAndroid Build Coastguard Worker      * 1. need to adjust field width.
937*0e209d39SAndroid Build Coastguard Worker      *    For example, the interval patterns saved in DateIntervalInfo
938*0e209d39SAndroid Build Coastguard Worker      *    includes "dMMMy", but not "dMMMMy".
939*0e209d39SAndroid Build Coastguard Worker      *    Need to get interval patterns for dMMMMy from dMMMy.
940*0e209d39SAndroid Build Coastguard Worker      *    Another example, the interval patterns saved in DateIntervalInfo
941*0e209d39SAndroid Build Coastguard Worker      *    includes "hmv", but not "hmz".
942*0e209d39SAndroid Build Coastguard Worker      *    Need to get interval patterns for "hmz' from 'hmv'
943*0e209d39SAndroid Build Coastguard Worker      *
944*0e209d39SAndroid Build Coastguard Worker      * 2. there might be no pattern for 'y' differ for skeleton "Md",
945*0e209d39SAndroid Build Coastguard Worker      *    in order to get interval patterns for 'y' differ,
946*0e209d39SAndroid Build Coastguard Worker      *    need to look for it from skeleton 'yMd'
947*0e209d39SAndroid Build Coastguard Worker      *
948*0e209d39SAndroid Build Coastguard Worker      * @param dateSkeleton   normalized date skeleton
949*0e209d39SAndroid Build Coastguard Worker      * @param timeSkeleton   normalized time skeleton
950*0e209d39SAndroid Build Coastguard Worker      * @return               whether the resource is found for the skeleton.
951*0e209d39SAndroid Build Coastguard Worker      *                       true if interval pattern found for the skeleton,
952*0e209d39SAndroid Build Coastguard Worker      *                       false otherwise.
953*0e209d39SAndroid Build Coastguard Worker      */
954*0e209d39SAndroid Build Coastguard Worker     UBool setSeparateDateTimePtn(const UnicodeString& dateSkeleton,
955*0e209d39SAndroid Build Coastguard Worker                                  const UnicodeString& timeSkeleton);
956*0e209d39SAndroid Build Coastguard Worker 
957*0e209d39SAndroid Build Coastguard Worker 
958*0e209d39SAndroid Build Coastguard Worker 
959*0e209d39SAndroid Build Coastguard Worker 
960*0e209d39SAndroid Build Coastguard Worker     /**
961*0e209d39SAndroid Build Coastguard Worker      * Generate interval pattern from existing resource
962*0e209d39SAndroid Build Coastguard Worker      *
963*0e209d39SAndroid Build Coastguard Worker      * It not only save the interval patterns,
964*0e209d39SAndroid Build Coastguard Worker      * but also return the extended skeleton and its best match skeleton.
965*0e209d39SAndroid Build Coastguard Worker      *
966*0e209d39SAndroid Build Coastguard Worker      * @param field           largest different calendar field
967*0e209d39SAndroid Build Coastguard Worker      * @param skeleton        skeleton
968*0e209d39SAndroid Build Coastguard Worker      * @param bestSkeleton    the best match skeleton which has interval pattern
969*0e209d39SAndroid Build Coastguard Worker      *                        defined in resource
970*0e209d39SAndroid Build Coastguard Worker      * @param differenceInfo  the difference between skeleton and best skeleton
971*0e209d39SAndroid Build Coastguard Worker      *         0 means the best matched skeleton is the same as input skeleton
972*0e209d39SAndroid Build Coastguard Worker      *         1 means the fields are the same, but field width are different
973*0e209d39SAndroid Build Coastguard Worker      *         2 means the only difference between fields are v/z,
974*0e209d39SAndroid Build Coastguard Worker      *        -1 means there are other fields difference
975*0e209d39SAndroid Build Coastguard Worker      *
976*0e209d39SAndroid Build Coastguard Worker      * @param extendedSkeleton      extended skeleton
977*0e209d39SAndroid Build Coastguard Worker      * @param extendedBestSkeleton  extended best match skeleton
978*0e209d39SAndroid Build Coastguard Worker      * @return                      whether the interval pattern is found
979*0e209d39SAndroid Build Coastguard Worker      *                              through extending skeleton or not.
980*0e209d39SAndroid Build Coastguard Worker      *                              true if interval pattern is found by
981*0e209d39SAndroid Build Coastguard Worker      *                              extending skeleton, false otherwise.
982*0e209d39SAndroid Build Coastguard Worker      */
983*0e209d39SAndroid Build Coastguard Worker     UBool setIntervalPattern(UCalendarDateFields field,
984*0e209d39SAndroid Build Coastguard Worker                              const UnicodeString* skeleton,
985*0e209d39SAndroid Build Coastguard Worker                              const UnicodeString* bestSkeleton,
986*0e209d39SAndroid Build Coastguard Worker                              int8_t differenceInfo,
987*0e209d39SAndroid Build Coastguard Worker                              UnicodeString* extendedSkeleton = nullptr,
988*0e209d39SAndroid Build Coastguard Worker                              UnicodeString* extendedBestSkeleton = nullptr);
989*0e209d39SAndroid Build Coastguard Worker 
990*0e209d39SAndroid Build Coastguard Worker     /**
991*0e209d39SAndroid Build Coastguard Worker      * Adjust field width in best match interval pattern to match
992*0e209d39SAndroid Build Coastguard Worker      * the field width in input skeleton.
993*0e209d39SAndroid Build Coastguard Worker      *
994*0e209d39SAndroid Build Coastguard Worker      * TODO (xji) make a general solution
995*0e209d39SAndroid Build Coastguard Worker      * The adjusting rule can be:
996*0e209d39SAndroid Build Coastguard Worker      * 1. always adjust
997*0e209d39SAndroid Build Coastguard Worker      * 2. never adjust
998*0e209d39SAndroid Build Coastguard Worker      * 3. default adjust, which means adjust according to the following rules
999*0e209d39SAndroid Build Coastguard Worker      * 3.1 always adjust string, such as MMM and MMMM
1000*0e209d39SAndroid Build Coastguard Worker      * 3.2 never adjust between string and numeric, such as MM and MMM
1001*0e209d39SAndroid Build Coastguard Worker      * 3.3 always adjust year
1002*0e209d39SAndroid Build Coastguard Worker      * 3.4 do not adjust 'd', 'h', or 'm' if h presents
1003*0e209d39SAndroid Build Coastguard Worker      * 3.5 do not adjust 'M' if it is numeric(?)
1004*0e209d39SAndroid Build Coastguard Worker      *
1005*0e209d39SAndroid Build Coastguard Worker      * Since date interval format is well-formed format,
1006*0e209d39SAndroid Build Coastguard Worker      * date and time skeletons are normalized previously,
1007*0e209d39SAndroid Build Coastguard Worker      * till this stage, the adjust here is only "adjust strings, such as MMM
1008*0e209d39SAndroid Build Coastguard Worker      * and MMMM, EEE and EEEE.
1009*0e209d39SAndroid Build Coastguard Worker      *
1010*0e209d39SAndroid Build Coastguard Worker      * @param inputSkeleton            the input skeleton
1011*0e209d39SAndroid Build Coastguard Worker      * @param bestMatchSkeleton        the best match skeleton
1012*0e209d39SAndroid Build Coastguard Worker      * @param bestMatchIntervalPattern the best match interval pattern
1013*0e209d39SAndroid Build Coastguard Worker      * @param differenceInfo           the difference between 2 skeletons
1014*0e209d39SAndroid Build Coastguard Worker      *                                 1 means only field width differs
1015*0e209d39SAndroid Build Coastguard Worker      *                                 2 means v/z exchange
1016*0e209d39SAndroid Build Coastguard Worker      * @param suppressDayPeriodField if true, remove the day period field from the pattern, if there is one
1017*0e209d39SAndroid Build Coastguard Worker      * @param adjustedIntervalPattern  adjusted interval pattern
1018*0e209d39SAndroid Build Coastguard Worker      */
1019*0e209d39SAndroid Build Coastguard Worker     static void U_EXPORT2 adjustFieldWidth(
1020*0e209d39SAndroid Build Coastguard Worker                             const UnicodeString& inputSkeleton,
1021*0e209d39SAndroid Build Coastguard Worker                             const UnicodeString& bestMatchSkeleton,
1022*0e209d39SAndroid Build Coastguard Worker                             const UnicodeString& bestMatchIntervalPattern,
1023*0e209d39SAndroid Build Coastguard Worker                             int8_t differenceInfo,
1024*0e209d39SAndroid Build Coastguard Worker                             UBool suppressDayPeriodField,
1025*0e209d39SAndroid Build Coastguard Worker                             UnicodeString& adjustedIntervalPattern);
1026*0e209d39SAndroid Build Coastguard Worker 
1027*0e209d39SAndroid Build Coastguard Worker     /**
1028*0e209d39SAndroid Build Coastguard Worker      * Does the same thing as UnicodeString::findAndReplace(), except that it won't perform
1029*0e209d39SAndroid Build Coastguard Worker      * the substitution inside quoted literal text.
1030*0e209d39SAndroid Build Coastguard Worker      * @param targetString The string to perform the find-replace operation on.
1031*0e209d39SAndroid Build Coastguard Worker      * @param strToReplace The string to search for and replace in the target string.
1032*0e209d39SAndroid Build Coastguard Worker      * @param strToReplaceWith The string to substitute in wherever `stringToReplace` was found.
1033*0e209d39SAndroid Build Coastguard Worker      */
1034*0e209d39SAndroid Build Coastguard Worker     static void U_EXPORT2 findReplaceInPattern(UnicodeString& targetString,
1035*0e209d39SAndroid Build Coastguard Worker                                                const UnicodeString& strToReplace,
1036*0e209d39SAndroid Build Coastguard Worker                                                const UnicodeString& strToReplaceWith);
1037*0e209d39SAndroid Build Coastguard Worker 
1038*0e209d39SAndroid Build Coastguard Worker     /**
1039*0e209d39SAndroid Build Coastguard Worker      * Concat a single date pattern with a time interval pattern,
1040*0e209d39SAndroid Build Coastguard Worker      * set it into the intervalPatterns, while field is time field.
1041*0e209d39SAndroid Build Coastguard Worker      * This is used to handle time interval patterns on skeleton with
1042*0e209d39SAndroid Build Coastguard Worker      * both time and date. Present the date followed by
1043*0e209d39SAndroid Build Coastguard Worker      * the range expression for the time.
1044*0e209d39SAndroid Build Coastguard Worker      * @param format         date and time format
1045*0e209d39SAndroid Build Coastguard Worker      * @param datePattern    date pattern
1046*0e209d39SAndroid Build Coastguard Worker      * @param field          time calendar field: AM_PM, HOUR, MINUTE
1047*0e209d39SAndroid Build Coastguard Worker      * @param status         output param set to success/failure code on exit
1048*0e209d39SAndroid Build Coastguard Worker      */
1049*0e209d39SAndroid Build Coastguard Worker     void concatSingleDate2TimeInterval(UnicodeString& format,
1050*0e209d39SAndroid Build Coastguard Worker                                        const UnicodeString& datePattern,
1051*0e209d39SAndroid Build Coastguard Worker                                        UCalendarDateFields field,
1052*0e209d39SAndroid Build Coastguard Worker                                        UErrorCode& status);
1053*0e209d39SAndroid Build Coastguard Worker 
1054*0e209d39SAndroid Build Coastguard Worker     /**
1055*0e209d39SAndroid Build Coastguard Worker      * check whether a calendar field present in a skeleton.
1056*0e209d39SAndroid Build Coastguard Worker      * @param field      calendar field need to check
1057*0e209d39SAndroid Build Coastguard Worker      * @param skeleton   given skeleton on which to check the calendar field
1058*0e209d39SAndroid Build Coastguard Worker      * @return           true if field present in a skeleton.
1059*0e209d39SAndroid Build Coastguard Worker      */
1060*0e209d39SAndroid Build Coastguard Worker     static UBool U_EXPORT2 fieldExistsInSkeleton(UCalendarDateFields field,
1061*0e209d39SAndroid Build Coastguard Worker                                                  const UnicodeString& skeleton);
1062*0e209d39SAndroid Build Coastguard Worker 
1063*0e209d39SAndroid Build Coastguard Worker 
1064*0e209d39SAndroid Build Coastguard Worker     /**
1065*0e209d39SAndroid Build Coastguard Worker      * Split interval patterns into 2 part.
1066*0e209d39SAndroid Build Coastguard Worker      * @param intervalPattern  interval pattern
1067*0e209d39SAndroid Build Coastguard Worker      * @return the index in interval pattern which split the pattern into 2 part
1068*0e209d39SAndroid Build Coastguard Worker      */
1069*0e209d39SAndroid Build Coastguard Worker     static int32_t  U_EXPORT2 splitPatternInto2Part(const UnicodeString& intervalPattern);
1070*0e209d39SAndroid Build Coastguard Worker 
1071*0e209d39SAndroid Build Coastguard Worker 
1072*0e209d39SAndroid Build Coastguard Worker     /**
1073*0e209d39SAndroid Build Coastguard Worker      * Break interval patterns as 2 part and save them into pattern info.
1074*0e209d39SAndroid Build Coastguard Worker      * @param field            calendar field
1075*0e209d39SAndroid Build Coastguard Worker      * @param intervalPattern  interval pattern
1076*0e209d39SAndroid Build Coastguard Worker      */
1077*0e209d39SAndroid Build Coastguard Worker     void setIntervalPattern(UCalendarDateFields field,
1078*0e209d39SAndroid Build Coastguard Worker                             const UnicodeString& intervalPattern);
1079*0e209d39SAndroid Build Coastguard Worker 
1080*0e209d39SAndroid Build Coastguard Worker 
1081*0e209d39SAndroid Build Coastguard Worker     /**
1082*0e209d39SAndroid Build Coastguard Worker      * Break interval patterns as 2 part and save them into pattern info.
1083*0e209d39SAndroid Build Coastguard Worker      * @param field            calendar field
1084*0e209d39SAndroid Build Coastguard Worker      * @param intervalPattern  interval pattern
1085*0e209d39SAndroid Build Coastguard Worker      * @param laterDateFirst   whether later date appear first in interval pattern
1086*0e209d39SAndroid Build Coastguard Worker      */
1087*0e209d39SAndroid Build Coastguard Worker     void setIntervalPattern(UCalendarDateFields field,
1088*0e209d39SAndroid Build Coastguard Worker                             const UnicodeString& intervalPattern,
1089*0e209d39SAndroid Build Coastguard Worker                             UBool laterDateFirst);
1090*0e209d39SAndroid Build Coastguard Worker 
1091*0e209d39SAndroid Build Coastguard Worker 
1092*0e209d39SAndroid Build Coastguard Worker     /**
1093*0e209d39SAndroid Build Coastguard Worker      * Set pattern information.
1094*0e209d39SAndroid Build Coastguard Worker      *
1095*0e209d39SAndroid Build Coastguard Worker      * @param field            calendar field
1096*0e209d39SAndroid Build Coastguard Worker      * @param firstPart        the first part in interval pattern
1097*0e209d39SAndroid Build Coastguard Worker      * @param secondPart       the second part in interval pattern
1098*0e209d39SAndroid Build Coastguard Worker      * @param laterDateFirst   whether the first date in intervalPattern
1099*0e209d39SAndroid Build Coastguard Worker      *                         is earlier date or later date
1100*0e209d39SAndroid Build Coastguard Worker      */
1101*0e209d39SAndroid Build Coastguard Worker     void setPatternInfo(UCalendarDateFields field,
1102*0e209d39SAndroid Build Coastguard Worker                         const UnicodeString* firstPart,
1103*0e209d39SAndroid Build Coastguard Worker                         const UnicodeString* secondPart,
1104*0e209d39SAndroid Build Coastguard Worker                         UBool laterDateFirst);
1105*0e209d39SAndroid Build Coastguard Worker 
1106*0e209d39SAndroid Build Coastguard Worker     /**
1107*0e209d39SAndroid Build Coastguard Worker      * Format 2 Calendars to produce a string.
1108*0e209d39SAndroid Build Coastguard Worker      * Implementation of the similar public format function.
1109*0e209d39SAndroid Build Coastguard Worker      * Must be called with gFormatterMutex already locked.
1110*0e209d39SAndroid Build Coastguard Worker      *
1111*0e209d39SAndroid Build Coastguard Worker      * Note: "fromCalendar" and "toCalendar" are not const,
1112*0e209d39SAndroid Build Coastguard Worker      * since calendar is not const in  SimpleDateFormat::format(Calendar&),
1113*0e209d39SAndroid Build Coastguard Worker      *
1114*0e209d39SAndroid Build Coastguard Worker      * @param fromCalendar      calendar set to the from date in date interval
1115*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
1116*0e209d39SAndroid Build Coastguard Worker      * @param toCalendar        calendar set to the to date in date interval
1117*0e209d39SAndroid Build Coastguard Worker      *                          to be formatted into date interval string
1118*0e209d39SAndroid Build Coastguard Worker      * @param appendTo          Output parameter to receive result.
1119*0e209d39SAndroid Build Coastguard Worker      *                          Result is appended to existing contents.
1120*0e209d39SAndroid Build Coastguard Worker      * @param firstIndex        0 if the first output date is fromCalendar;
1121*0e209d39SAndroid Build Coastguard Worker      *                          1 if it corresponds to toCalendar;
1122*0e209d39SAndroid Build Coastguard Worker      *                          -1 if there is only one date printed.
1123*0e209d39SAndroid Build Coastguard Worker      * @param fphandler         Handler for field position information.
1124*0e209d39SAndroid Build Coastguard Worker      *                          The fields will be from the UDateFormatField enum.
1125*0e209d39SAndroid Build Coastguard Worker      * @param status            Output param filled with success/failure status.
1126*0e209d39SAndroid Build Coastguard Worker      *                          Caller needs to make sure it is SUCCESS
1127*0e209d39SAndroid Build Coastguard Worker      *                          at the function entrance
1128*0e209d39SAndroid Build Coastguard Worker      * @return                  Reference to 'appendTo' parameter.
1129*0e209d39SAndroid Build Coastguard Worker      * @internal (private)
1130*0e209d39SAndroid Build Coastguard Worker      */
1131*0e209d39SAndroid Build Coastguard Worker     UnicodeString& formatImpl(Calendar& fromCalendar,
1132*0e209d39SAndroid Build Coastguard Worker                               Calendar& toCalendar,
1133*0e209d39SAndroid Build Coastguard Worker                               UnicodeString& appendTo,
1134*0e209d39SAndroid Build Coastguard Worker                               int8_t& firstIndex,
1135*0e209d39SAndroid Build Coastguard Worker                               FieldPositionHandler& fphandler,
1136*0e209d39SAndroid Build Coastguard Worker                               UErrorCode& status) const ;
1137*0e209d39SAndroid Build Coastguard Worker 
1138*0e209d39SAndroid Build Coastguard Worker     /** Version of formatImpl for DateInterval. */
1139*0e209d39SAndroid Build Coastguard Worker     UnicodeString& formatIntervalImpl(const DateInterval& dtInterval,
1140*0e209d39SAndroid Build Coastguard Worker                               UnicodeString& appendTo,
1141*0e209d39SAndroid Build Coastguard Worker                               int8_t& firstIndex,
1142*0e209d39SAndroid Build Coastguard Worker                               FieldPositionHandler& fphandler,
1143*0e209d39SAndroid Build Coastguard Worker                               UErrorCode& status) const;
1144*0e209d39SAndroid Build Coastguard Worker 
1145*0e209d39SAndroid Build Coastguard Worker 
1146*0e209d39SAndroid Build Coastguard Worker     // from calendar field to pattern letter
1147*0e209d39SAndroid Build Coastguard Worker     static const char16_t fgCalendarFieldToPatternLetter[];
1148*0e209d39SAndroid Build Coastguard Worker 
1149*0e209d39SAndroid Build Coastguard Worker 
1150*0e209d39SAndroid Build Coastguard Worker     /**
1151*0e209d39SAndroid Build Coastguard Worker      * The interval patterns for this locale.
1152*0e209d39SAndroid Build Coastguard Worker      */
1153*0e209d39SAndroid Build Coastguard Worker     DateIntervalInfo*     fInfo;
1154*0e209d39SAndroid Build Coastguard Worker 
1155*0e209d39SAndroid Build Coastguard Worker     /**
1156*0e209d39SAndroid Build Coastguard Worker      * The DateFormat object used to format single pattern
1157*0e209d39SAndroid Build Coastguard Worker      */
1158*0e209d39SAndroid Build Coastguard Worker     SimpleDateFormat*     fDateFormat;
1159*0e209d39SAndroid Build Coastguard Worker 
1160*0e209d39SAndroid Build Coastguard Worker     /**
1161*0e209d39SAndroid Build Coastguard Worker      * The 2 calendars with the from and to date.
1162*0e209d39SAndroid Build Coastguard Worker      * could re-use the calendar in fDateFormat,
1163*0e209d39SAndroid Build Coastguard Worker      * but keeping 2 calendars make it clear and clean.
1164*0e209d39SAndroid Build Coastguard Worker      */
1165*0e209d39SAndroid Build Coastguard Worker     Calendar* fFromCalendar;
1166*0e209d39SAndroid Build Coastguard Worker     Calendar* fToCalendar;
1167*0e209d39SAndroid Build Coastguard Worker 
1168*0e209d39SAndroid Build Coastguard Worker     Locale fLocale;
1169*0e209d39SAndroid Build Coastguard Worker 
1170*0e209d39SAndroid Build Coastguard Worker     /**
1171*0e209d39SAndroid Build Coastguard Worker      * Following are interval information relevant (locale) to this formatter.
1172*0e209d39SAndroid Build Coastguard Worker      */
1173*0e209d39SAndroid Build Coastguard Worker     UnicodeString fSkeleton;
1174*0e209d39SAndroid Build Coastguard Worker     PatternInfo fIntervalPatterns[DateIntervalInfo::kIPI_MAX_INDEX];
1175*0e209d39SAndroid Build Coastguard Worker 
1176*0e209d39SAndroid Build Coastguard Worker     /**
1177*0e209d39SAndroid Build Coastguard Worker      * Patterns for fallback formatting.
1178*0e209d39SAndroid Build Coastguard Worker      */
1179*0e209d39SAndroid Build Coastguard Worker     UnicodeString* fDatePattern;
1180*0e209d39SAndroid Build Coastguard Worker     UnicodeString* fTimePattern;
1181*0e209d39SAndroid Build Coastguard Worker     UnicodeString* fDateTimeFormat;
1182*0e209d39SAndroid Build Coastguard Worker 
1183*0e209d39SAndroid Build Coastguard Worker     /**
1184*0e209d39SAndroid Build Coastguard Worker      * Other formatting information
1185*0e209d39SAndroid Build Coastguard Worker      */
1186*0e209d39SAndroid Build Coastguard Worker     UDisplayContext fCapitalizationContext;
1187*0e209d39SAndroid Build Coastguard Worker };
1188*0e209d39SAndroid Build Coastguard Worker 
1189*0e209d39SAndroid Build Coastguard Worker inline bool
1190*0e209d39SAndroid Build Coastguard Worker DateIntervalFormat::operator!=(const Format& other) const  {
1191*0e209d39SAndroid Build Coastguard Worker     return !operator==(other);
1192*0e209d39SAndroid Build Coastguard Worker }
1193*0e209d39SAndroid Build Coastguard Worker 
1194*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END
1195*0e209d39SAndroid Build Coastguard Worker 
1196*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */
1197*0e209d39SAndroid Build Coastguard Worker 
1198*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */
1199*0e209d39SAndroid Build Coastguard Worker 
1200*0e209d39SAndroid Build Coastguard Worker #endif // _DTITVFMT_H__
1201*0e209d39SAndroid Build Coastguard Worker //eof
1202