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 "yMMMd", 199*0e209d39SAndroid Build Coastguard Worker * in en_US, if the largest different calendar field between date1 and date2 200*0e209d39SAndroid Build Coastguard Worker * is "year", the date interval pattern is "MMM d, yyyy - MMM d, yyyy", 201*0e209d39SAndroid Build Coastguard Worker * such as "Jan 10, 2007 - Jan 10, 2008". 202*0e209d39SAndroid Build Coastguard Worker * If the largest different calendar field between date1 and date2 is "month", 203*0e209d39SAndroid Build Coastguard Worker * the date interval pattern is "MMM d - MMM d, yyyy", 204*0e209d39SAndroid Build Coastguard Worker * such as "Jan 10 - Feb 10, 2007". 205*0e209d39SAndroid Build Coastguard Worker * If the largest different calendar field between date1 and date2 is "day", 206*0e209d39SAndroid Build Coastguard Worker * the date interval pattern is "MMM d-d, yyyy", such as "Jan 10-20, 2007". 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