1 // © 2016 and later: Unicode, Inc. and others.
2 // License & terms of use: http://www.unicode.org/copyright.html
4 *****************************************************************************
5 * Copyright (C) 2014-2016, International Business Machines Corporation and
8 *****************************************************************************
11 *****************************************************************************
14 #ifndef __RELDATEFMT_H
15 #define __RELDATEFMT_H
17 #include "unicode/utypes.h"
18 #include "unicode/uobject.h"
19 #include "unicode/udisplaycontext.h"
20 #include "unicode/ureldatefmt.h"
21 #include "unicode/locid.h"
25 * \brief C++ API: Formats relative dates such as "1 day ago" or "tomorrow"
28 #if !UCONFIG_NO_FORMATTING
31 * Represents the unit for formatting a relative date. e.g "in 5 days"
35 typedef enum UDateRelativeUnit
{
41 UDAT_RELATIVE_SECONDS
,
47 UDAT_RELATIVE_MINUTES
,
79 #ifndef U_HIDE_DEPRECATED_API
81 * One more than the highest normal UDateRelativeUnit value.
82 * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
84 UDAT_RELATIVE_UNIT_COUNT
85 #endif // U_HIDE_DEPRECATED_API
89 * Represents an absolute unit.
92 typedef enum UDateAbsoluteUnit
{
94 // Days of week have to remain together and in order from Sunday to
100 UDAT_ABSOLUTE_SUNDAY
,
106 UDAT_ABSOLUTE_MONDAY
,
112 UDAT_ABSOLUTE_TUESDAY
,
118 UDAT_ABSOLUTE_WEDNESDAY
,
124 UDAT_ABSOLUTE_THURSDAY
,
130 UDAT_ABSOLUTE_FRIDAY
,
136 UDAT_ABSOLUTE_SATURDAY
,
168 #ifndef U_HIDE_DEPRECATED_API
170 * One more than the highest normal UDateAbsoluteUnit value.
171 * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
173 UDAT_ABSOLUTE_UNIT_COUNT
174 #endif // U_HIDE_DEPRECATED_API
178 * Represents a direction for an absolute unit e.g "Next Tuesday"
182 typedef enum UDateDirection
{
185 * Two before. Not fully supported in every locale.
188 UDAT_DIRECTION_LAST_2
,
209 * Two after. Not fully supported in every locale.
212 UDAT_DIRECTION_NEXT_2
,
215 * Plain, which means the absence of a qualifier.
218 UDAT_DIRECTION_PLAIN
,
220 #ifndef U_HIDE_DEPRECATED_API
222 * One more than the highest normal UDateDirection value.
223 * @deprecated ICU 58 The numeric value may change over time, see ICU ticket #12420.
226 #endif // U_HIDE_DEPRECATED_API
229 #if !UCONFIG_NO_BREAK_ITERATION
231 #if U_SHOW_CPLUSPLUS_API
235 class RelativeDateTimeCacheData
;
236 class SharedNumberFormat
;
237 class SharedPluralRules
;
238 class SharedBreakIterator
;
243 * Formats simple relative dates. There are two types of relative dates that
246 * <li>relative dates with a quantity e.g "in 5 days"</li>
247 * <li>relative dates without a quantity e.g "next Tuesday"</li>
250 * This API is very basic and is intended to be a building block for more
251 * fancy APIs. The caller tells it exactly what to display in a locale
252 * independent way. While this class automatically provides the correct plural
253 * forms, the grammatical form is otherwise as neutral as possible. It is the
254 * caller's responsibility to handle cut-off logic such as deciding between
255 * displaying "in 7 days" or "in 1 week." This API supports relative dates
256 * involving one single unit. This API does not support relative dates
257 * involving compound units,
258 * e.g "in 5 days and 4 hours" nor does it support parsing.
260 * This class is mostly thread safe and immutable with the following caveats:
261 * 1. The assignment operator violates Immutability. It must not be used
262 * concurrently with other operations.
263 * 2. Caller must not hold onto adopted pointers.
265 * This class is not intended for public subclassing.
267 * Here are some examples of use:
270 * UErrorCode status = U_ZERO_ERROR;
271 * UnicodeString appendTo;
272 * RelativeDateTimeFormatter fmt(status);
273 * // Appends "in 1 day"
275 * 1, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status);
276 * // Appends "in 3 days"
278 * 3, UDAT_DIRECTION_NEXT, UDAT_RELATIVE_DAYS, appendTo, status);
279 * // Appends "3.2 years ago"
281 * 3.2, UDAT_DIRECTION_LAST, UDAT_RELATIVE_YEARS, appendTo, status);
282 * // Appends "last Sunday"
283 * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
284 * // Appends "this Sunday"
285 * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
286 * // Appends "next Sunday"
287 * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
288 * // Appends "Sunday"
289 * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_SUNDAY, appendTo, status);
291 * // Appends "yesterday"
292 * fmt.format(UDAT_DIRECTION_LAST, UDAT_ABSOLUTE_DAY, appendTo, status);
294 * fmt.format(UDAT_DIRECTION_THIS, UDAT_ABSOLUTE_DAY, appendTo, status);
295 * // Appends "tomorrow"
296 * fmt.format(UDAT_DIRECTION_NEXT, UDAT_ABSOLUTE_DAY, appendTo, status);
298 * fmt.format(UDAT_DIRECTION_PLAIN, UDAT_ABSOLUTE_NOW, appendTo, status);
303 * In the future, we may add more forms, such as abbreviated/short forms
304 * (3 secs ago), and relative day periods ("yesterday afternoon"), etc.
306 * The RelativeDateTimeFormatter class is not intended for public subclassing.
310 class U_I18N_API RelativeDateTimeFormatter
: public UObject
{
314 * Create RelativeDateTimeFormatter with default locale.
317 RelativeDateTimeFormatter(UErrorCode
& status
);
320 * Create RelativeDateTimeFormatter with given locale.
323 RelativeDateTimeFormatter(const Locale
& locale
, UErrorCode
& status
);
326 * Create RelativeDateTimeFormatter with given locale and NumberFormat.
328 * @param locale the locale
329 * @param nfToAdopt Constructed object takes ownership of this pointer.
330 * It is an error for caller to delete this pointer or change its
331 * contents after calling this constructor.
332 * @status Any error is returned here.
335 RelativeDateTimeFormatter(
336 const Locale
& locale
, NumberFormat
*nfToAdopt
, UErrorCode
& status
);
339 * Create RelativeDateTimeFormatter with given locale, NumberFormat,
340 * and capitalization context.
342 * @param locale the locale
343 * @param nfToAdopt Constructed object takes ownership of this pointer.
344 * It is an error for caller to delete this pointer or change its
345 * contents after calling this constructor. Caller may pass NULL for
346 * this argument if they want default number format behavior.
347 * @param style the format style. The UDAT_RELATIVE bit field has no effect.
348 * @param capitalizationContext A value from UDisplayContext that pertains to
350 * @status Any error is returned here.
353 RelativeDateTimeFormatter(
354 const Locale
& locale
,
355 NumberFormat
*nfToAdopt
,
356 UDateRelativeDateTimeFormatterStyle style
,
357 UDisplayContext capitalizationContext
,
364 RelativeDateTimeFormatter(const RelativeDateTimeFormatter
& other
);
367 * Assignment operator.
370 RelativeDateTimeFormatter
& operator=(
371 const RelativeDateTimeFormatter
& other
);
377 virtual ~RelativeDateTimeFormatter();
380 * Formats a relative date with a quantity such as "in 5 days" or
382 * @param quantity The numerical amount e.g 5. This value is formatted
383 * according to this object's NumberFormat object.
384 * @param direction NEXT means a future relative date; LAST means a past
385 * relative date. If direction is anything else, this method sets
386 * status to U_ILLEGAL_ARGUMENT_ERROR.
387 * @param unit the unit e.g day? month? year?
388 * @param appendTo The string to which the formatted result will be
390 * @param status ICU error code returned here.
394 UnicodeString
& format(
396 UDateDirection direction
,
397 UDateRelativeUnit unit
,
398 UnicodeString
& appendTo
,
399 UErrorCode
& status
) const;
402 * Formats a relative date without a quantity.
403 * @param direction NEXT, LAST, THIS, etc.
404 * @param unit e.g SATURDAY, DAY, MONTH
405 * @param appendTo The string to which the formatted result will be
406 * appended. If the value of direction is documented as not being fully
407 * supported in all locales then this method leaves appendTo unchanged if
408 * no format string is available.
409 * @param status ICU error code returned here.
413 UnicodeString
& format(
414 UDateDirection direction
,
415 UDateAbsoluteUnit unit
,
416 UnicodeString
& appendTo
,
417 UErrorCode
& status
) const;
420 * Format a combination of URelativeDateTimeUnit and numeric offset
421 * using a numeric style, e.g. "1 week ago", "in 1 week",
422 * "5 weeks ago", "in 5 weeks".
424 * @param offset The signed offset for the specified unit. This
425 * will be formatted according to this object's
426 * NumberFormat object.
427 * @param unit The unit to use when formatting the relative
428 * date, e.g. UDAT_REL_UNIT_WEEK,
429 * UDAT_REL_UNIT_FRIDAY.
430 * @param appendTo The string to which the formatted result will be
432 * @param status ICU error code returned here.
436 UnicodeString
& formatNumeric(
438 URelativeDateTimeUnit unit
,
439 UnicodeString
& appendTo
,
440 UErrorCode
& status
) const;
443 * Format a combination of URelativeDateTimeUnit and numeric offset
444 * using a text style if possible, e.g. "last week", "this week",
445 * "next week", "yesterday", "tomorrow". Falls back to numeric
446 * style if no appropriate text term is available for the specified
447 * offset in the object's locale.
449 * @param offset The signed offset for the specified unit.
450 * @param unit The unit to use when formatting the relative
451 * date, e.g. UDAT_REL_UNIT_WEEK,
452 * UDAT_REL_UNIT_FRIDAY.
453 * @param appendTo The string to which the formatted result will be
455 * @param status ICU error code returned here.
459 UnicodeString
& format(
461 URelativeDateTimeUnit unit
,
462 UnicodeString
& appendTo
,
463 UErrorCode
& status
) const;
466 * Combines a relative date string and a time string in this object's
467 * locale. This is done with the same date-time separator used for the
468 * default calendar in this locale.
470 * @param relativeDateString the relative date, e.g 'yesterday'
471 * @param timeString the time e.g '3:45'
472 * @param appendTo concatenated date and time appended here
473 * @param status ICU error code returned here.
477 UnicodeString
& combineDateAndTime(
478 const UnicodeString
& relativeDateString
,
479 const UnicodeString
& timeString
,
480 UnicodeString
& appendTo
,
481 UErrorCode
& status
) const;
484 * Returns the NumberFormat this object is using.
488 const NumberFormat
& getNumberFormat() const;
491 * Returns the capitalization context.
495 UDisplayContext
getCapitalizationContext() const;
498 * Returns the format style.
502 UDateRelativeDateTimeFormatterStyle
getFormatStyle() const;
505 const RelativeDateTimeCacheData
* fCache
;
506 const SharedNumberFormat
*fNumberFormat
;
507 const SharedPluralRules
*fPluralRules
;
508 UDateRelativeDateTimeFormatterStyle fStyle
;
509 UDisplayContext fContext
;
510 const SharedBreakIterator
*fOptBreakIterator
;
513 NumberFormat
*nfToAdopt
,
514 BreakIterator
*brkIter
,
516 void adjustForContext(UnicodeString
&) const;
520 #endif // U_SHOW_CPLUSPLUS_API
522 #endif /* !UCONFIG_NO_BREAK_ITERATION */
523 #endif /* !UCONFIG_NO_FORMATTING */
524 #endif /* __RELDATEFMT_H */