123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- // © 2016 and later: Unicode, Inc. and others.
- // License & terms of use: http://www.unicode.org/copyright.html
- /*
- *******************************************************************************
- * Copyright (C) 2007-2016, International Business Machines Corporation and *
- * others. All Rights Reserved. *
- *******************************************************************************
- */
- #ifndef RELDTFMT_H
- #define RELDTFMT_H
- #include "unicode/utypes.h"
- /**
- * \file
- * \brief C++ API: Format and parse relative dates and times.
- */
- #if !UCONFIG_NO_FORMATTING
- #include "unicode/datefmt.h"
- #include "unicode/smpdtfmt.h"
- #include "unicode/brkiter.h"
- U_NAMESPACE_BEGIN
- // forward declarations
- class DateFormatSymbols;
- class SimpleFormatter;
- // internal structure used for caching strings
- struct URelativeString;
- /**
- * This class is normally accessed using the kRelative or k...Relative values of EStyle as
- * parameters to DateFormat::createDateInstance.
- *
- * Example:
- * DateFormat *fullrelative = DateFormat::createDateInstance(DateFormat::kFullRelative, loc);
- *
- * @internal ICU 3.8
- */
- class RelativeDateFormat : public DateFormat {
- public:
- RelativeDateFormat( UDateFormatStyle timeStyle, UDateFormatStyle dateStyle, const Locale& locale, UErrorCode& status);
- // overrides
- /**
- * Copy constructor.
- * @internal ICU 3.8
- */
- RelativeDateFormat(const RelativeDateFormat&);
- /**
- * Assignment operator.
- * @internal ICU 3.8
- */
- RelativeDateFormat& operator=(const RelativeDateFormat&);
- /**
- * Destructor.
- * @internal ICU 3.8
- */
- virtual ~RelativeDateFormat();
- /**
- * Clone this Format object polymorphically. The caller owns the result and
- * should delete it when done.
- * @return A copy of the object.
- * @internal ICU 3.8
- */
- virtual RelativeDateFormat* clone() const override;
- /**
- * Return true if the given Format objects are semantically equal. Objects
- * of different subclasses are considered unequal.
- * @param other the object to be compared with.
- * @return true if the given Format objects are semantically equal.
- * @internal ICU 3.8
- */
- virtual bool operator==(const Format& other) const override;
- using DateFormat::format;
- /**
- * Format a date or time, which is the standard millis since 24:00 GMT, Jan
- * 1, 1970. Overrides DateFormat pure virtual method.
- * <P>
- * Example: using the US locale: "yyyy.MM.dd e 'at' HH:mm:ss zzz" ->>
- * 1996.07.10 AD at 15:08:56 PDT
- *
- * @param cal Calendar set to the date and time to be formatted
- * into a date/time string.
- * @param appendTo Output parameter to receive result.
- * Result is appended to existing contents.
- * @param pos The formatting position. On input: an alignment field,
- * if desired. On output: the offsets of the alignment field.
- * @return Reference to 'appendTo' parameter.
- * @internal ICU 3.8
- */
- virtual UnicodeString& format( Calendar& cal,
- UnicodeString& appendTo,
- FieldPosition& pos) const override;
- /**
- * Format an object to produce a string. This method handles Formattable
- * objects with a UDate type. If a the Formattable object type is not a Date,
- * then it returns a failing UErrorCode.
- *
- * @param obj The object to format. Must be a Date.
- * @param appendTo Output parameter to receive result.
- * Result is appended to existing contents.
- * @param pos On input: an alignment field, if desired.
- * On output: the offsets of the alignment field.
- * @param status Output param filled with success/failure status.
- * @return Reference to 'appendTo' parameter.
- * @internal ICU 3.8
- */
- virtual UnicodeString& format(const Formattable& obj,
- UnicodeString& appendTo,
- FieldPosition& pos,
- UErrorCode& status) const override;
- /**
- * Parse a date/time string beginning at the given parse position. For
- * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date
- * that is equivalent to Date(837039928046).
- * <P>
- * By default, parsing is lenient: If the input is not in the form used by
- * this object's format method but can still be parsed as a date, then the
- * parse succeeds. Clients may insist on strict adherence to the format by
- * calling setLenient(false).
- *
- * @param text The date/time string to be parsed
- * @param cal a Calendar set to the date and time to be formatted
- * into a date/time string.
- * @param pos On input, the position at which to start parsing; on
- * output, the position at which parsing terminated, or the
- * start position if the parse failed.
- * @return A valid UDate if the input could be parsed.
- * @internal ICU 3.8
- */
- virtual void parse( const UnicodeString& text,
- Calendar& cal,
- ParsePosition& pos) const override;
- /**
- * Parse a date/time string starting at the given parse position. For
- * example, a time text "07/10/96 4:5 PM, PDT" will be parsed into a Date
- * that is equivalent to Date(837039928046).
- * <P>
- * By default, parsing is lenient: If the input is not in the form used by
- * this object's format method but can still be parsed as a date, then the
- * parse succeeds. Clients may insist on strict adherence to the format by
- * calling setLenient(false).
- *
- * @see DateFormat::setLenient(boolean)
- *
- * @param text The date/time string to be parsed
- * @param pos On input, the position at which to start parsing; on
- * output, the position at which parsing terminated, or the
- * start position if the parse failed.
- * @return A valid UDate if the input could be parsed.
- * @internal ICU 3.8
- */
- UDate parse( const UnicodeString& text,
- ParsePosition& pos) const;
- /**
- * Parse a date/time string. For example, a time text "07/10/96 4:5 PM, PDT"
- * will be parsed into a UDate that is equivalent to Date(837039928046).
- * Parsing begins at the beginning of the string and proceeds as far as
- * possible. Assuming no parse errors were encountered, this function
- * doesn't return any information about how much of the string was consumed
- * by the parsing. If you need that information, use the version of
- * parse() that takes a ParsePosition.
- *
- * @param text The date/time string to be parsed
- * @param status Filled in with U_ZERO_ERROR if the parse was successful, and with
- * an error value if there was a parse error.
- * @return A valid UDate if the input could be parsed.
- * @internal ICU 3.8
- */
- virtual UDate parse( const UnicodeString& text,
- UErrorCode& status) const override;
- /**
- * Return a single pattern string generated by combining the patterns for the
- * date and time formatters associated with this object.
- * @param result Output param to receive the pattern.
- * @return A reference to 'result'.
- * @internal ICU 4.2 technology preview
- */
- virtual UnicodeString& toPattern(UnicodeString& result, UErrorCode& status) const;
- /**
- * Get the date pattern for the the date formatter associated with this object.
- * @param result Output param to receive the date pattern.
- * @return A reference to 'result'.
- * @internal ICU 4.2 technology preview
- */
- virtual UnicodeString& toPatternDate(UnicodeString& result, UErrorCode& status) const;
- /**
- * Get the time pattern for the the time formatter associated with this object.
- * @param result Output param to receive the time pattern.
- * @return A reference to 'result'.
- * @internal ICU 4.2 technology preview
- */
- virtual UnicodeString& toPatternTime(UnicodeString& result, UErrorCode& status) const;
- /**
- * Apply the given unlocalized date & time pattern strings to this relative date format.
- * (i.e., after this call, this formatter will format dates and times according to
- * the new patterns)
- *
- * @param datePattern The date pattern to be applied.
- * @param timePattern The time pattern to be applied.
- * @internal ICU 4.2 technology preview
- */
- virtual void applyPatterns(const UnicodeString& datePattern, const UnicodeString& timePattern, UErrorCode &status);
- /**
- * Gets the date/time formatting symbols (this is an object carrying
- * the various strings and other symbols used in formatting: e.g., month
- * names and abbreviations, time zone names, AM/PM strings, etc.)
- * @return a copy of the date-time formatting data associated
- * with this date-time formatter.
- * @internal ICU 4.8
- */
- virtual const DateFormatSymbols* getDateFormatSymbols() const;
- /**
- * Set a particular UDisplayContext value in the formatter, such as
- * UDISPCTX_CAPITALIZATION_FOR_STANDALONE. Note: For getContext, see
- * DateFormat.
- * @param value The UDisplayContext value to set.
- * @param status Input/output status. If at entry this indicates a failure
- * status, the function will do nothing; otherwise this will be
- * updated with any new status from the function.
- * @internal ICU 53
- */
- virtual void setContext(UDisplayContext value, UErrorCode& status) override;
- private:
- SimpleDateFormat *fDateTimeFormatter;
- UnicodeString fDatePattern;
- UnicodeString fTimePattern;
- SimpleFormatter *fCombinedFormat; // the {0} {1} format.
- UDateFormatStyle fDateStyle;
- Locale fLocale;
- int32_t fDatesLen; // Length of array
- URelativeString *fDates; // array of strings
- UBool fCombinedHasDateAtStart;
- UBool fCapitalizationInfoSet;
- UBool fCapitalizationOfRelativeUnitsForUIListMenu;
- UBool fCapitalizationOfRelativeUnitsForStandAlone;
- #if !UCONFIG_NO_BREAK_ITERATION
- BreakIterator* fCapitalizationBrkIter;
- #else
- UObject* fCapitalizationBrkIter;
- #endif
- /**
- * Get the string at a specific offset.
- * @param day day offset ( -1, 0, 1, etc.. )
- * @param len on output, length of string.
- * @return the string, or nullptr if none at that location.
- */
- const char16_t *getStringForDay(int32_t day, int32_t &len, UErrorCode &status) const;
- /**
- * Load the Date string array
- */
- void loadDates(UErrorCode &status);
- /**
- * Set fCapitalizationOfRelativeUnitsForUIListMenu, fCapitalizationOfRelativeUnitsForStandAlone
- */
- void initCapitalizationContextInfo(const Locale& thelocale);
- /**
- * @return the number of days in "until-now"
- */
- static int32_t dayDifference(Calendar &until, UErrorCode &status);
- /**
- * initializes fCalendar from parameters. Returns fCalendar as a convenience.
- * @param adoptZone Zone to be adopted, or nullptr for TimeZone::createDefault().
- * @param locale Locale of the calendar
- * @param status Error code
- * @return the newly constructed fCalendar
- * @internal ICU 3.8
- */
- Calendar* initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
- public:
- /**
- * Return the class ID for this class. This is useful only for comparing to
- * a return value from getDynamicClassID(). For example:
- * <pre>
- * . Base* polymorphic_pointer = createPolymorphicObject();
- * . if (polymorphic_pointer->getDynamicClassID() ==
- * . erived::getStaticClassID()) ...
- * </pre>
- * @return The class ID for all objects of this class.
- * @internal ICU 3.8
- */
- U_I18N_API static UClassID U_EXPORT2 getStaticClassID();
- /**
- * 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.
- *
- * @return 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.
- * @internal ICU 3.8
- */
- virtual UClassID getDynamicClassID() const override;
- };
- U_NAMESPACE_END
- #endif /* #if !UCONFIG_NO_FORMATTING */
- #endif // RELDTFMT_H
|