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