1 // Copyright (C) 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ******************************************************************************* 5 * Copyright (C) 2007-2016, International Business Machines Corporation and * 6 * others. All Rights Reserved. * 7 ******************************************************************************* 8 */ 9 10 #ifndef RELDTFMT_H 11 #define RELDTFMT_H 12 13 #include "unicode/utypes.h" 14 15 /** 16 * \file 17 * \brief C++ API: Format and parse relative dates and times. 18 */ 19 20 #if !UCONFIG_NO_FORMATTING 21 22 #include "unicode/datefmt.h" 23 #include "unicode/smpdtfmt.h" 24 #include "unicode/brkiter.h" 25 26 U_NAMESPACE_BEGIN 27 28 // forward declarations 29 class DateFormatSymbols; 30 class SimpleFormatter; 31 32 // internal structure used for caching strings 33 struct URelativeString; 34 35 /** 36 * This class is normally accessed using the kRelative or k...Relative values of EStyle as 37 * parameters to DateFormat::createDateInstance. 38 * 39 * Example: 40 * DateFormat *fullrelative = DateFormat::createDateInstance(DateFormat::kFullRelative, loc); 41 * 42 * @internal ICU 3.8 43 */ 44 45 class RelativeDateFormat : public DateFormat { 46 public: 47 RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const Locale& locale, UErrorCode& status); 48 49 // overrides 50 /** 51 * Copy constructor. 52 * @internal ICU 3.8 53 */ 54 RelativeDateFormat(const RelativeDateFormat&); 55 56 /** 57 * Assignment operator. 58 * @internal ICU 3.8 59 */ 60 RelativeDateFormat& operator=(const RelativeDateFormat&); 61 62 /** 63 * Destructor. 64 * @internal ICU 3.8 65 */ 66 virtual ~RelativeDateFormat(); 67 68 /** 69 * Clone this Format object polymorphically. The caller owns the result and 70 * should delete it when done. 71 * @return A copy of the object. 72 * @internal ICU 3.8 73 */ 74 virtual Format* clone(void) const; 75 76 /** 77 * Return true if the given Format objects are semantically equal. Objects 78 * of different subclasses are considered unequal. 79 * @param other the object to be compared with. 80 * @return true if the given Format objects are semantically equal. 81 * @internal ICU 3.8 82 */ 83 virtual UBool operator==(const Format& other) const; 84 85 86 using DateFormat::format; 87 88 /** 89 * Format a date or time, which is the standard millis since 24:00 GMT, Jan 90 * 1, 1970. Overrides DateFormat pure virtual method. 91 * <P> 92 * Example: using the US locale: "yyyy.MM.dd e 'at' HH:mm:ss zzz" ->> 93 * 1996.07.10 AD at 15:08:56 PDT 94 * 95 * @param cal Calendar set to the date and time to be formatted 96 * into a date/time string. 97 * @param appendTo Output parameter to receive result. 98 * Result is appended to existing contents. 99 * @param pos The formatting position. On input: an alignment field, 100 * if desired. On output: the offsets of the alignment field. 101 * @return Reference to 'appendTo' parameter. 102 * @internal ICU 3.8 103 */ 104 virtual UnicodeString& format( Calendar& cal, 105 UnicodeString& appendTo, 106 FieldPosition& pos) const; 107 108 /** 109 * Format an object to produce a string. This method handles Formattable 110 * objects with a UDate type. If a the Formattable object type is not a Date, 111 * then it returns a failing UErrorCode. 112 * 113 * @param obj The object to format. Must be a Date. 114 * @param appendTo Output parameter to receive result. 115 * Result is appended to existing contents. 116 * @param pos On input: an alignment field, if desired. 117 * On output: the offsets of the alignment field. 118 * @param status Output param filled with success/failure status. 119 * @return Reference to 'appendTo' parameter. 120 * @internal ICU 3.8 121 */ 122 virtual UnicodeString& format(const Formattable& obj, 123 UnicodeString& appendTo, 124 FieldPosition& pos, 125 UErrorCode& status) const; 126 127 128 /** 129 * Parse a date/time string beginning at the given parse position. For 130 * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date 131 * that is equivalent to Date(837039928046). 132 * <P> 133 * By default, parsing is lenient: If the input is not in the form used by 134 * this object's format method but can still be parsed as a date, then the 135 * parse succeeds. Clients may insist on strict adherence to the format by 136 * calling setLenient(false). 137 * 138 * @param text The date/time string to be parsed 139 * @param cal a Calendar set to the date and time to be formatted 140 * into a date/time string. 141 * @param pos On input, the position at which to start parsing; on 142 * output, the position at which parsing terminated, or the 143 * start position if the parse failed. 144 * @return A valid UDate if the input could be parsed. 145 * @internal ICU 3.8 146 */ 147 virtual void parse( const UnicodeString& text, 148 Calendar& cal, 149 ParsePosition& pos) const; 150 151 /** 152 * Parse a date/time string starting at the given parse position. For 153 * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date 154 * that is equivalent to Date(837039928046). 155 * <P> 156 * By default, parsing is lenient: If the input is not in the form used by 157 * this object's format method but can still be parsed as a date, then the 158 * parse succeeds. Clients may insist on strict adherence to the format by 159 * calling setLenient(false). 160 * 161 * @see DateFormat::setLenient(boolean) 162 * 163 * @param text The date/time string to be parsed 164 * @param pos On input, the position at which to start parsing; on 165 * output, the position at which parsing terminated, or the 166 * start position if the parse failed. 167 * @return A valid UDate if the input could be parsed. 168 * @internal ICU 3.8 169 */ 170 UDate parse( const UnicodeString& text, 171 ParsePosition& pos) const; 172 173 174 /** 175 * Parse a date/time string. For example, a time text "07/10/96 4:5 PM, PDT" 176 * will be parsed into a UDate that is equivalent to Date(837039928046). 177 * Parsing begins at the beginning of the string and proceeds as far as 178 * possible. Assuming no parse errors were encountered, this function 179 * doesn't return any information about how much of the string was consumed 180 * by the parsing. If you need that information, use the version of 181 * parse() that takes a ParsePosition. 182 * 183 * @param text The date/time string to be parsed 184 * @param status Filled in with U_ZERO_ERROR if the parse was successful, and with 185 * an error value if there was a parse error. 186 * @return A valid UDate if the input could be parsed. 187 * @internal ICU 3.8 188 */ 189 virtual UDate parse( const UnicodeString& text, 190 UErrorCode& status) const; 191 192 /** 193 * Return a single pattern string generated by combining the patterns for the 194 * date and time formatters associated with this object. 195 * @param result Output param to receive the pattern. 196 * @return A reference to 'result'. 197 * @internal ICU 4.2 technology preview 198 */ 199 virtual UnicodeString& toPattern(UnicodeString& result, UErrorCode& status) const; 200 201 /** 202 * Get the date pattern for the the date formatter associated with this object. 203 * @param result Output param to receive the date pattern. 204 * @return A reference to 'result'. 205 * @internal ICU 4.2 technology preview 206 */ 207 virtual UnicodeString& toPatternDate(UnicodeString& result, UErrorCode& status) const; 208 209 /** 210 * Get the time pattern for the the time formatter associated with this object. 211 * @param result Output param to receive the time pattern. 212 * @return A reference to 'result'. 213 * @internal ICU 4.2 technology preview 214 */ 215 virtual UnicodeString& toPatternTime(UnicodeString& result, UErrorCode& status) const; 216 217 /** 218 * Apply the given unlocalized date & time pattern strings to this relative date format. 219 * (i.e., after this call, this formatter will format dates and times according to 220 * the new patterns) 221 * 222 * @param datePattern The date pattern to be applied. 223 * @param timePattern The time pattern to be applied. 224 * @internal ICU 4.2 technology preview 225 */ 226 virtual void applyPatterns(const UnicodeString& datePattern, const UnicodeString& timePattern, UErrorCode &status); 227 228 /** 229 * Gets the date/time formatting symbols (this is an object carrying 230 * the various strings and other symbols used in formatting: e.g., month 231 * names and abbreviations, time zone names, AM/PM strings, etc.) 232 * @return a copy of the date-time formatting data associated 233 * with this date-time formatter. 234 * @internal ICU 4.8 235 */ 236 virtual const DateFormatSymbols* getDateFormatSymbols(void) const; 237 238 /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */ 239 /** 240 * Set a particular UDisplayContext value in the formatter, such as 241 * UDISPCTX_CAPITALIZATION_FOR_STANDALONE. Note: For getContext, see 242 * DateFormat. 243 * @param value The UDisplayContext value to set. 244 * @param status Input/output status. If at entry this indicates a failure 245 * status, the function will do nothing; otherwise this will be 246 * updated with any new status from the function. 247 * @internal ICU 53 248 */ 249 virtual void setContext(UDisplayContext value, UErrorCode& status); 250 251 private: 252 SimpleDateFormat *fDateTimeFormatter; 253 UnicodeString fDatePattern; 254 UnicodeString fTimePattern; 255 SimpleFormatter *fCombinedFormat; // the {0} {1} format. 256 257 UDateFormatStyle fDateStyle; 258 Locale fLocale; 259 260 int32_t fDatesLen; // Length of array 261 URelativeString *fDates; // array of strings 262 263 UBool fCombinedHasDateAtStart; 264 UBool fCapitalizationInfoSet; 265 UBool fCapitalizationOfRelativeUnitsForUIListMenu; 266 UBool fCapitalizationOfRelativeUnitsForStandAlone; 267 #if !UCONFIG_NO_BREAK_ITERATION 268 BreakIterator* fCapitalizationBrkIter; 269 #else 270 UObject* fCapitalizationBrkIter; 271 #endif 272 273 /** 274 * Get the string at a specific offset. 275 * @param day day offset ( -1, 0, 1, etc.. ) 276 * @param len on output, length of string. 277 * @return the string, or NULL if none at that location. 278 */ 279 const UChar *getStringForDay(int32_t day, int32_t &len, UErrorCode &status) const; 280 281 /** 282 * Load the Date string array 283 */ 284 void loadDates(UErrorCode &status); 285 286 /** 287 * Set fCapitalizationOfRelativeUnitsForUIListMenu, fCapitalizationOfRelativeUnitsForStandAlone 288 */ 289 void initCapitalizationContextInfo(const Locale& thelocale); 290 291 /** 292 * @return the number of days in "until-now" 293 */ 294 static int32_t dayDifference(Calendar &until, UErrorCode &status); 295 296 /** 297 * initializes fCalendar from parameters. Returns fCalendar as a convenience. 298 * @param adoptZone Zone to be adopted, or NULL for TimeZone::createDefault(). 299 * @param locale Locale of the calendar 300 * @param status Error code 301 * @return the newly constructed fCalendar 302 * @internal ICU 3.8 303 */ 304 Calendar* initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status); 305 306 public: 307 /** 308 * Return the class ID for this class. This is useful only for comparing to 309 * a return value from getDynamicClassID(). For example: 310 * <pre> 311 * . Base* polymorphic_pointer = createPolymorphicObject(); 312 * . if (polymorphic_pointer->getDynamicClassID() == 313 * . erived::getStaticClassID()) ... 314 * </pre> 315 * @return The class ID for all objects of this class. 316 * @internal ICU 3.8 317 */ 318 U_I18N_API static UClassID U_EXPORT2 getStaticClassID(void); 319 320 /** 321 * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This 322 * method is to implement a simple version of RTTI, since not all C++ 323 * compilers support genuine RTTI. Polymorphic operator==() and clone() 324 * methods call this method. 325 * 326 * @return The class ID for this object. All objects of a 327 * given class have the same class ID. Objects of 328 * other classes have different class IDs. 329 * @internal ICU 3.8 330 */ 331 virtual UClassID getDynamicClassID(void) const; 332 }; 333 334 335 U_NAMESPACE_END 336 337 #endif /* #if !UCONFIG_NO_FORMATTING */ 338 339 #endif // RELDTFMT_H 340