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