# DateIntervalFormat Class Reference

DateIntervalFormat is a class for formatting and parsing date intervals in a language-independent manner. More...

`#include <dtitvfmt.h>`

Inheritance diagram for DateIntervalFormat:

## Data Structures
struct | PatternInfo
## Public Member Functions
virtual | ~DateIntervalFormat ()
| Destructor.
virtual Format * | clone (void) const
| Clone this Format object polymorphically.
virtual UBool | operator== (const Format &other) const
| Return true if the given Format objects are semantically equal.
UBool | operator!= (const Format &other) const
| Return true if the given Format objects are not semantically equal.
virtual UnicodeString & | format (const Formattable &obj, UnicodeString &appendTo, FieldPosition &fieldPosition, UErrorCode &status) const
| Format an object to produce a string.
UnicodeString & | format (const DateInterval *dtInterval, UnicodeString &appendTo, FieldPosition &fieldPosition, UErrorCode &status) const
| Format a DateInterval to produce a string.
UnicodeString & | format (Calendar &fromCalendar, Calendar &toCalendar, UnicodeString &appendTo, FieldPosition &fieldPosition, UErrorCode &status) const
| Format 2 Calendars to produce a string.
virtual void | parseObject (const UnicodeString &source, Formattable &result, ParsePosition &parse_pos) const
| Date interval parsing is not supported.
const DateIntervalInfo * | getDateIntervalInfo (void) const
| Gets the date time interval patterns.
void | setDateIntervalInfo (const DateIntervalInfo &newIntervalPatterns, UErrorCode &status)
| Set the date time interval patterns.
const DateFormat * | getDateFormat (void) const
| Gets the date formatter.
virtual UClassID | getDynamicClassID (void) const
| Returns a unique class ID POLYMORPHICALLY.
## Static Public Member Functions
static DateIntervalFormat * | createInstance (const UnicodeString &skeleton, UErrorCode &status)
| Construct a DateIntervalFormat from skeleton and the default locale.
static DateIntervalFormat * | createInstance (const UnicodeString &skeleton, const Locale &locale, UErrorCode &status)
| Construct a DateIntervalFormat from skeleton and a given locale.
static DateIntervalFormat * | createInstance (const UnicodeString &skeleton, const DateIntervalInfo &dtitvinf, UErrorCode &status)
| Construct a DateIntervalFormat from skeleton DateIntervalInfo, and default locale.
static DateIntervalFormat * | createInstance (const UnicodeString &skeleton, const Locale &locale, const DateIntervalInfo &dtitvinf, UErrorCode &status)
| Construct a DateIntervalFormat from skeleton a DateIntervalInfo, and the given locale.
static UClassID | getStaticClassID (void)
| Return the class ID for this class.
## Protected Member Functions
| DateIntervalFormat (const DateIntervalFormat &)
| Copy constructor.
DateIntervalFormat & | operator= (const DateIntervalFormat &)
| Assignment operator.

## Detailed Description

DateIntervalFormat is a class for formatting and parsing date intervals in a language-independent manner.

Date interval formatting is supported in Gregorian calendar only. And only formatting is supported. Parsing is not supported.

Date interval means from one date to another date, for example, from "Jan 11, 2008" to "Jan 18, 2008". We introduced class DateInterval to represent it. DateInterval is a pair of UDate, which is the standard milliseconds since 24:00 GMT, Jan 1, 1970.

DateIntervalFormat formats a DateInterval into text as compactly as possible. For example, the date interval format from "Jan 11, 2008" to "Jan 18,. 2008" is "Jan 11-18, 2008" for English. And it parses text into DateInterval, although initially, parsing is not supported.

There is no structural information in date time patterns. For any punctuations and string literals inside a date time pattern, we do not know whether it is just a separator, or a prefix, or a suffix. Without such information, so, it is difficult to generate a sub-pattern (or super-pattern) by algorithm. So, formatting a DateInterval is pattern-driven. It is very similar to formatting in SimpleDateFormat. We introduce class DateIntervalInfo to save date interval patterns, similar to date time pattern in SimpleDateFormat.

Logically, the interval patterns are mappings from (skeleton, the_largest_different_calendar_field) to (date_interval_pattern).

A skeleton

1. only keeps the field pattern letter and ignores all other parts in a pattern, such as space, punctuations, and string literals.
2. hides the order of fields.
3. might hide a field's pattern letter length.

For those non-digit calendar fields, the pattern letter length is important, such as MMM, MMMM, and MMMMM; EEE and EEEE, and the field's pattern letter length is honored.

For the digit calendar fields, such as M or MM, d or dd, yy or yyyy, the field pattern length is ignored and the best match, which is defined in date time patterns, will be returned without honor the field pattern letter length in skeleton.

The calendar fields we support for interval formatting are: year, month, date, day-of-week, am-pm, hour, hour-of-day, and minute. Those calendar fields can be defined in the following order: year > month > date > hour (in day) > minute

The largest different calendar fields between 2 calendars is the first different calendar field in above order.

For example: the largest different calendar fields between "Jan 10, 2007" and "Feb 20, 2008" is year.

For other calendar fields, the compact interval formatting is not supported. And the interval format will be fall back to fall-back patterns, which is mostly "{date0} - {date1}".

There is a set of pre-defined static skeleton strings. There are pre-defined interval patterns for those pre-defined skeletons in locales' resource files. For example, for a skeleton UDAT_YEAR_ABBR_MONTH_DAY, which is "yMMMd", in en_US, if the largest different calendar field between date1 and date2 is "year", the date interval pattern is "MMM d, yyyy - MMM d, yyyy", such as "Jan 10, 2007 - Jan 10, 2008". If the largest different calendar field between date1 and date2 is "month", the date interval pattern is "MMM d - MMM d, yyyy", such as "Jan 10 - Feb 10, 2007". If the largest different calendar field between date1 and date2 is "day", the date interval pattern is ""MMM d-d, yyyy", such as "Jan 10-20, 2007".

For date skeleton, the interval patterns when year, or month, or date is different are defined in resource files. For time skeleton, the interval patterns when am/pm, or hour, or minute is different are defined in resource files.

If a skeleton is not found in a locale's DateIntervalInfo, which means the interval patterns for the skeleton is not defined in resource file, the interval pattern will falls back to the interval "fallback" pattern defined in resource file. If the interval "fallback" pattern is not defined, the default fall-back is "{date0} - {data1}".

For the combination of date and time, The rule to generate interval patterns are:

1. when the year, month, or day differs, falls back to fall-back interval pattern, which mostly is the concatenate the two original expressions with a separator between, For example, interval pattern from "Jan 10, 2007 10:10 am" to "Jan 11, 2007 10:10am" is "Jan 10, 2007 10:10 am - Jan 11, 2007 10:10am"
2. otherwise, present the date followed by the range expression for the time. For example, interval pattern from "Jan 10, 2007 10:10 am" to "Jan 10, 2007 11:10am" is "Jan 10, 2007 10:10 am - 11:10am"

If two dates are the same, the interval pattern is the single date pattern. For example, interval pattern from "Jan 10, 2007" to "Jan 10, 2007" is "Jan 10, 2007".

Or if the presenting fields between 2 dates have the exact same values, the interval pattern is the single date pattern. For example, if user only requests year and month, the interval pattern from "Jan 10, 2007" to "Jan 20, 2007" is "Jan 2007".

DateIntervalFormat needs the following information for correct formatting: time zone, calendar type, pattern, date format symbols, and date interval patterns. It can be instantiated in 2 ways:

1. create an instance using default or given locale plus given skeleton. Users are encouraged to created date interval formatter this way and to use the pre-defined skeleton macros, such as UDAT_YEAR_NUM_MONTH, which consists the calendar fields and the format style.
2. create an instance using default or given locale plus given skeleton plus a given DateIntervalInfo. This factory method is for powerful users who want to provide their own interval patterns. Locale provides the timezone, calendar, and format symbols information. Local plus skeleton provides full pattern information. DateIntervalInfo provides the date interval patterns.

For the calendar field pattern letter, such as G, y, M, d, a, h, H, m, s etc. DateIntervalFormat uses the same syntax as that of DateTime format.

Code Sample: general usage

        // the date interval object which the DateIntervalFormat formats on
       // and parses into
       DateInterval*  dtInterval = new DateInterval(1000*3600*24, 1000*3600*24*2);
       UErrorCode status = U_ZERO_ERROR;
       DateIntervalFormat* dtIntervalFmt = DateIntervalFormat::createInstance(
                               UDAT_YEAR_MONTH_DAY,
                               Locale("en", "GB", ""), status);
       UnicodeUnicodeString dateIntervalString;
       FieldPosition pos = 0;
       // formatting
       dtIntervalFmt->format(dtInterval, dateIntervalUnicodeString, pos, status);
       delete dtIntervalFmt;

Definition at line 218 of file dtitvfmt.h.

## Constructor & Destructor Documentation

virtual DateIntervalFormat::~DateIntervalFormat | ( |  | ) | `[virtual]`

Destructor.

Stable:
  ICU 4.0

DateIntervalFormat::DateIntervalFormat | ( | const DateIntervalFormat & |  | ) | `[protected]`

Copy constructor.

Stable:
  ICU 4.0

## Member Function Documentation

virtual Format* DateIntervalFormat::clone | ( | void |  | ) | const`[virtual]`

Clone this Format object polymorphically.

The caller owns the result and should delete it when done.

Returns:
  A copy of the object.

Stable:
  ICU 4.0

Implements Format.

static DateIntervalFormat* DateIntervalFormat::createInstance | ( | const UnicodeString & | skeleton,
|  | const Locale & | locale,
|  | const DateIntervalInfo & | dtitvinf,
|  | UErrorCode & | status |
| ) |  |  | `[static]`

Construct a DateIntervalFormat from skeleton a DateIntervalInfo, and the given locale.

In this factory method, user provides its own date interval pattern information, instead of using those pre-defined data in resource file. This factory method is for powerful users who want to provide their own interval patterns.

There are pre-defined skeletons (defined in udate.h) having predefined interval patterns in resource files. Users are encouraged to use those macros. For example: DateIntervalFormat::createInstance(UDAT_MONTH_DAY, status)

The DateIntervalInfo provides the interval patterns. and the DateIntervalInfo ownership remains to the caller.

User are encouraged to set default interval pattern in DateIntervalInfo as well, if they want to set other interval patterns ( instead of reading the interval patterns from resource files). When the corresponding interval pattern for a largest calendar different field is not found ( if user not set it ), interval format fallback to the default interval pattern. If user does not provide default interval pattern, it fallback to "{date0} - {date1}"

Parameters:

  | skeleton | the skeleton on which interval format based.
  | locale | the given locale
  | dtitvinf | the DateIntervalInfo object.
  | status | output param set to success/failure code on exit

Returns:
  a date time interval formatter which the caller owns.

Stable:
  ICU 4.0

static DateIntervalFormat* DateIntervalFormat::createInstance | ( | const UnicodeString & | skeleton,
|  | const DateIntervalInfo & | dtitvinf,
|  | UErrorCode & | status |
| ) |  |  | `[static]`

Construct a DateIntervalFormat from skeleton DateIntervalInfo, and default locale.

This is a convenient override of createInstance(const UnicodeString& skeleton, const Locale& locale, const DateIntervalInfo& dtitvinf, UErrorCode&) with the locale value as default locale.

Parameters:

  | skeleton | the skeleton on which interval format based.
  | dtitvinf | the DateIntervalInfo object.
  | status | output param set to success/failure code on exit

Returns:
  a date time interval formatter which the caller owns.

Stable:
  ICU 4.0

static DateIntervalFormat* DateIntervalFormat::createInstance | ( | const UnicodeString & | skeleton,
|  | const Locale & | locale,
|  | UErrorCode & | status |
| ) |  |  | `[static]`

Construct a DateIntervalFormat from skeleton and a given locale.

In this factory method, the date interval pattern information is load from resource files. Users are encouraged to created date interval formatter this way and to use the pre-defined skeleton macros.

There are pre-defined skeletons (defined in udate.h) having predefined interval patterns in resource files. Users are encouraged to use those macros. For example: DateIntervalFormat::createInstance(UDAT_MONTH_DAY, status)

The given Locale provides the interval patterns. For example, for en_GB, if skeleton is UDAT_YEAR_ABBR_MONTH_WEEKDAY_DAY, which is "yMMMEEEd", the interval patterns defined in resource file to above skeleton are: "EEE, d MMM, yyyy - EEE, d MMM, yyyy" for year differs, "EEE, d MMM - EEE, d MMM, yyyy" for month differs, "EEE, d - EEE, d MMM, yyyy" for day differs,

Parameters:

  | skeleton | the skeleton on which interval format based.
  | locale | the given locale
  | status | output param set to success/failure code on exit

Returns:
  a date time interval formatter which the caller owns.

Stable:
  ICU 4.0

static DateIntervalFormat* DateIntervalFormat::createInstance | ( | const UnicodeString & | skeleton,
|  | UErrorCode & | status |
| ) |  |  | `[static]`

Construct a DateIntervalFormat from skeleton and the default locale.

This is a convenient override of createInstance(const UnicodeString& skeleton, const Locale& locale, UErrorCode&) with the value of locale as default locale.

Parameters:

  | skeleton | the skeleton on which interval format based.
  | status | output param set to success/failure code on exit

Returns:
  a date time interval formatter which the caller owns.

Stable:
  ICU 4.0

UnicodeString& DateIntervalFormat::format | ( | Calendar & | fromCalendar,
|  | Calendar & | toCalendar,
|  | UnicodeString & | appendTo,
|  | FieldPosition & | fieldPosition,
|  | UErrorCode & | status |
| ) |  |  | const

Format 2 Calendars to produce a string.

Note: "fromCalendar" and "toCalendar" are not const, since calendar is not const in SimpleDateFormat::format(Calendar&),

Parameters:

  | fromCalendar | calendar set to the from date in date interval to be formatted into date interval string
  | toCalendar | calendar set to the to date in date interval to be formatted into date interval string
  | appendTo | Output parameter to receive result. Result is appended to existing contents.
  | fieldPosition | On input: an alignment field, if desired. On output: the offsets of the alignment field.
  | status | Output param filled with success/failure status. Caller needs to make sure it is SUCCESS at the function entrance

Returns:
  Reference to 'appendTo' parameter.

Stable:
  ICU 4.0

UnicodeString& DateIntervalFormat::format | ( | const DateInterval * | dtInterval,
|  | UnicodeString & | appendTo,
|  | FieldPosition & | fieldPosition,
|  | UErrorCode & | status |
| ) |  |  | const

Format a DateInterval to produce a string.

Parameters:

  | dtInterval | DateInterval to be formatted.
  | appendTo | Output parameter to receive result. Result is appended to existing contents.
  | fieldPosition | On input: an alignment field, if desired. On output: the offsets of the alignment field.
  | status | Output param filled with success/failure status.

Returns:
  Reference to 'appendTo' parameter.

Stable:
  ICU 4.0

virtual UnicodeString& DateIntervalFormat::format | ( | const Formattable & | obj,
|  | UnicodeString & | appendTo,
|  | FieldPosition & | fieldPosition,
|  | UErrorCode & | status |
| ) |  |  | const`[virtual]`

Format an object to produce a string.

This method handles Formattable objects with a DateInterval type. If a the Formattable object type is not a DateInterval, then it returns a failing UErrorCode.

Parameters:

  | obj | The object to format. Must be a DateInterval.
  | appendTo | Output parameter to receive result. Result is appended to existing contents.
  | fieldPosition | On input: an alignment field, if desired. On output: the offsets of the alignment field.
  | status | Output param filled with success/failure status.

Returns:
  Reference to 'appendTo' parameter.

Stable:
  ICU 4.0

Implements Format.

const DateFormat* DateIntervalFormat::getDateFormat | ( | void |  | ) | const

Gets the date formatter.

Returns:
  the date formatter associated with this date interval formatter.

Stable:
  ICU 4.0

const DateIntervalInfo* DateIntervalFormat::getDateIntervalInfo | ( | void |  | ) | const

Gets the date time interval patterns.

Returns:
  the date time interval patterns associated with this date interval formatter.

Stable:
  ICU 4.0

virtual UClassID DateIntervalFormat::getDynamicClassID | ( | void |  | ) | const`[virtual]`

Returns a unique class ID POLYMORPHICALLY.

Pure virtual override. This method is to implement a simple version of RTTI, since not all C++ compilers support genuine RTTI. Polymorphic operator==() and clone() methods call this method.

Returns:
  The class ID for this object. All objects of a given class have the same class ID. Objects of other classes have different class IDs.

Stable:
  ICU 4.0

Implements Format.

static UClassID DateIntervalFormat::getStaticClassID | ( | void |  | ) | `[static]`

Return the class ID for this class.

This is useful only for comparing to a return value from getDynamicClassID(). For example:

     .   Base* polymorphic_pointer = createPolymorphicObject();
     .   if (polymorphic_pointer->getDynamicClassID() ==
     .       erived::getStaticClassID()) ...

Returns:
  The class ID for all objects of this class.

Stable:
  ICU 4.0

UBool DateIntervalFormat::operator!= | ( | const Format & | other | ) | const`[inline]`

Return true if the given Format objects are not semantically equal.

Objects of different subclasses are considered unequal.

Parameters:

  | other | the object to be compared with.

Returns:
  true if the given Format objects are not semantically equal.

Stable:
  ICU 4.0

Reimplemented from Format.

Definition at line 963 of file dtitvfmt.h.

References operator==().

DateIntervalFormat& DateIntervalFormat::operator= | ( | const DateIntervalFormat & |  | ) | `[protected]`

Assignment operator.

Stable:
  ICU 4.0

virtual UBool DateIntervalFormat::operator== | ( | const Format & | other | ) | const`[virtual]`

Return true if the given Format objects are semantically equal.

Objects of different subclasses are considered unequal.

Parameters:

  | other | the object to be compared with.

Returns:
  true if the given Format objects are semantically equal.

Stable:
  ICU 4.0

Implements Format.

Referenced by operator!=().

virtual void DateIntervalFormat::parseObject | ( | const UnicodeString & | source,
|  | Formattable & | result,
|  | ParsePosition & | parse_pos |
| ) |  |  | const`[virtual]`

Date interval parsing is not supported.

Please do not use.

This method should handle parsing of date time interval strings into Formattable objects with DateInterval type, which is a pair of UDate.

Before calling, set parse_pos.index to the offset you want to start parsing at in the source. After calling, parse_pos.index is the end of the text you parsed. If error occurs, index is unchanged.

When parsing, leading whitespace is discarded (with a successful parse), while trailing whitespace is left as is.

See Format::parseObject() for more.

Parameters:

  | source | The string to be parsed into an object.
  | result | Formattable to be set to the parse result. If parse fails, return contents are undefined.
  | parse_pos | The position to start parsing at. Since no parsing is supported, upon return this param is unchanged.

Returns:
  A newly created Formattable* object, or NULL on failure. The caller owns this and should delete it when done.

Internal:
  Do not use. This API is for internal use only. ICU 4.0

Implements Format.

void DateIntervalFormat::setDateIntervalInfo | ( | const DateIntervalInfo & | newIntervalPatterns,
|  | UErrorCode & | status |
| ) |  |  |

Set the date time interval patterns.

Parameters:

  | newIntervalPatterns | the given interval patterns to copy.
  | status | output param set to success/failure code on exit

Stable:
  ICU 4.0

The documentation for this class was generated from the following file:

- dtitvfmt.h