ICU 49.1.1  49.1.1
smpdtfmt.h
Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 1997-2012, International Business Machines Corporation and
00003 * others. All Rights Reserved.
00004 *******************************************************************************
00005 *
00006 * File SMPDTFMT.H
00007 *
00008 * Modification History:
00009 *
00010 *   Date        Name        Description
00011 *   02/19/97    aliu        Converted from java.
00012 *   07/09/97    helena      Make ParsePosition into a class.
00013 *   07/21/98    stephen     Added GMT_PLUS, GMT_MINUS
00014 *                            Changed setTwoDigitStartDate to set2DigitYearStart
00015 *                            Changed getTwoDigitStartDate to get2DigitYearStart
00016 *                            Removed subParseLong
00017 *                            Removed getZoneIndex (added in DateFormatSymbols)
00018 *   06/14/99    stephen     Removed fgTimeZoneDataSuffix
00019 *   10/14/99    aliu        Updated class doc to describe 2-digit year parsing
00020 *                           {j28 4182066}.
00021 *******************************************************************************
00022 */
00023 
00024 #ifndef SMPDTFMT_H
00025 #define SMPDTFMT_H
00026 
00027 #include "unicode/utypes.h"
00028 
00034 #if !UCONFIG_NO_FORMATTING
00035 
00036 #include "unicode/datefmt.h"
00037 
00038 U_NAMESPACE_BEGIN
00039 
00040 class DateFormatSymbols;
00041 class DateFormat;
00042 class MessageFormat;
00043 class FieldPositionHandler;
00044 class TimeZoneFormat;
00045 
00225 class U_I18N_API SimpleDateFormat: public DateFormat {
00226 public:
00236     SimpleDateFormat(UErrorCode& status);
00237 
00249     SimpleDateFormat(const UnicodeString& pattern,
00250                      UErrorCode& status);
00251 
00273     SimpleDateFormat(const UnicodeString& pattern,
00274                      const UnicodeString& override,
00275                      UErrorCode& status);
00276 
00289     SimpleDateFormat(const UnicodeString& pattern,
00290                      const Locale& locale,
00291                      UErrorCode& status);
00292 
00314     SimpleDateFormat(const UnicodeString& pattern,
00315                      const UnicodeString& override,
00316                      const Locale& locale,
00317                      UErrorCode& status);
00318 
00328     SimpleDateFormat(const UnicodeString& pattern,
00329                      DateFormatSymbols* formatDataToAdopt,
00330                      UErrorCode& status);
00331 
00341     SimpleDateFormat(const UnicodeString& pattern,
00342                      const DateFormatSymbols& formatData,
00343                      UErrorCode& status);
00344 
00349     SimpleDateFormat(const SimpleDateFormat&);
00350 
00355     SimpleDateFormat& operator=(const SimpleDateFormat&);
00356 
00361     virtual ~SimpleDateFormat();
00362 
00369     virtual Format* clone(void) const;
00370 
00378     virtual UBool operator==(const Format& other) const;
00379 
00380 
00381     using DateFormat::format;
00382 
00399     virtual UnicodeString& format(  Calendar& cal,
00400                                     UnicodeString& appendTo,
00401                                     FieldPosition& pos) const;
00402 
00403 /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
00428     virtual UnicodeString& format(  Calendar& cal,
00429                                     const UDateFormatContextType* types,
00430                                     const UDateFormatContextValue* values,
00431                                     int32_t typesAndValuesCount,
00432                                     UnicodeString& appendTo,
00433                                     FieldPosition& pos) const;
00434 
00453     virtual UnicodeString& format(  Calendar& cal,
00454                                     UnicodeString& appendTo,
00455                                     FieldPositionIterator* posIter,
00456                                     UErrorCode& status) const;
00457 
00477     virtual UnicodeString& format(  const Formattable& obj,
00478                                     UnicodeString& appendTo,
00479                                     FieldPosition& pos,
00480                                     UErrorCode& status) const;
00481 
00502     virtual UnicodeString& format(  const Formattable& obj,
00503                                     UnicodeString& appendTo,
00504                                     FieldPositionIterator* posIter,
00505                                     UErrorCode& status) const;
00506 
00517     UnicodeString& format(UDate date,
00518                           UnicodeString& appendTo,
00519                           FieldPosition& fieldPosition) const;
00520 
00533     UnicodeString& format(UDate date,
00534                           UnicodeString& appendTo,
00535                           FieldPositionIterator* posIter,
00536                           UErrorCode& status) const;
00537 
00547     UnicodeString& format(const Formattable& obj,
00548                           UnicodeString& appendTo,
00549                           UErrorCode& status) const;
00550 
00559     UnicodeString& format(UDate date, UnicodeString& appendTo) const;
00560 
00588     virtual void parse( const UnicodeString& text,
00589                         Calendar& cal,
00590                         ParsePosition& pos) const;
00591 
00622     UDate parse( const UnicodeString& text,
00623                  ParsePosition& pos) const;
00624 
00625 
00659     virtual UDate parse( const UnicodeString& text,
00660                         UErrorCode& status) const;
00661 
00678     virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00679 
00695     UDate get2DigitYearStart(UErrorCode& status) const;
00696 
00703     virtual UnicodeString& toPattern(UnicodeString& result) const;
00704 
00721     virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
00722                                               UErrorCode& status) const;
00723 
00732     virtual void applyPattern(const UnicodeString& pattern);
00733 
00744     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00745                                        UErrorCode& status);
00746 
00755     virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
00756 
00763     virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
00764 
00770     virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
00771 
00783     static UClassID U_EXPORT2 getStaticClassID(void);
00784 
00796     virtual UClassID getDynamicClassID(void) const;
00797 
00807     virtual void adoptCalendar(Calendar* calendarToAdopt);
00808 
00809 /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
00820     virtual void setDefaultContext(UDateFormatContextType type, UDateFormatContextValue value, 
00821                                    UErrorCode& status);
00822 
00823 /* Cannot use #ifndef U_HIDE_DRAFT_API for the following draft method since it is virtual */
00834     virtual int32_t getDefaultContext(UDateFormatContextType type, UErrorCode& status) const;
00835 
00836 #ifndef U_HIDE_INTERNAL_API
00837 
00844     virtual void adoptTimeZoneFormat(TimeZoneFormat* timeZoneFormatToAdopt);
00845 
00851     virtual void setTimeZoneFormat(const TimeZoneFormat& newTimeZoneFormat);
00852 
00858     virtual const TimeZoneFormat* getTimeZoneFormat(void) const;
00859 #endif  /* U_HIDE_INTERNAL_API */
00860 
00861 #ifndef U_HIDE_INTERNAL_API
00862 
00872     UBool isFieldUnitIgnored(UCalendarDateFields field) const;
00873 
00874 
00886     static UBool isFieldUnitIgnored(const UnicodeString& pattern,
00887                                     UCalendarDateFields field);
00888 
00897     const Locale& getSmpFmtLocale(void) const;
00898 #endif  /* U_HIDE_INTERNAL_API */
00899 
00900 private:
00901     friend class DateFormat;
00902 
00903     void initializeDefaultCentury(void);
00904 
00905     SimpleDateFormat(); // default constructor not implemented
00906 
00915     SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00916 
00925     SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
00926 
00930     UnicodeString& _format(Calendar& cal, UDateFormatContextValue capitalizationContext,
00931                            UnicodeString& appendTo, FieldPositionHandler& handler, UErrorCode& status) const;
00932 
00949     void subFormat(UnicodeString &appendTo,
00950                    UChar ch,
00951                    int32_t count,
00952                    UDateFormatContextValue capitalizationContext,
00953                    int32_t fieldNum,
00954                    FieldPositionHandler& handler,
00955                    Calendar& cal,
00956                    UErrorCode& status) const; // in case of illegal argument
00957 
00971     void zeroPaddingNumber(NumberFormat *currentNumberFormat,
00972                            UnicodeString &appendTo,
00973                            int32_t value,
00974                            int32_t minDigits,
00975                            int32_t maxDigits) const;
00976 
00981     static UBool isNumeric(UChar formatChar, int32_t count);
00982 
00990     Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
00991 
00998     void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
00999 
01009     void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
01010 
01017     void initialize(const Locale& locale, UErrorCode& status);
01018 
01032     int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01033                         const UnicodeString* stringArray, int32_t stringArrayCount,
01034                         const UnicodeString* monthPattern, Calendar& cal) const;
01035 
01048     int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
01049                                const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
01050     
01064     static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
01065                                const UnicodeString &text, int32_t &textOffset, UBool lenient);
01066     
01085     int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
01086                      UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
01087                      int32_t patLoc, MessageFormat * numericLeapMonthFormatter) const;
01088 
01089     void parseInt(const UnicodeString& text,
01090                   Formattable& number,
01091                   ParsePosition& pos,
01092                   UBool allowNegative,
01093                   NumberFormat *fmt) const;
01094 
01095     void parseInt(const UnicodeString& text,
01096                   Formattable& number,
01097                   int32_t maxDigits,
01098                   ParsePosition& pos,
01099                   UBool allowNegative,
01100                   NumberFormat *fmt) const;
01101 
01102     int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
01103                            int32_t patLoc, UBool isNegative) const;
01104 
01117     static void translatePattern(const UnicodeString& originalPattern,
01118                                 UnicodeString& translatedPattern,
01119                                 const UnicodeString& from,
01120                                 const UnicodeString& to,
01121                                 UErrorCode& status);
01122 
01130     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
01131 
01141     int32_t compareSimpleAffix(const UnicodeString& affix,
01142                    const UnicodeString& input,
01143                    int32_t pos) const;
01144 
01149     int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01150 
01155     int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01156 
01160     void initNumberFormatters(const Locale &locale,UErrorCode &status);
01161 
01165      NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
01166 
01170     void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01171 
01175     static const UCalendarDateFields fgPatternIndexToCalendarField[];
01176 
01180     static const UDateFormatField fgPatternIndexToDateFormatField[];
01181 
01185     TimeZoneFormat *tzFormat() const;
01186 
01193     static const int32_t fgCalendarFieldToLevel[];
01194     static const int32_t fgPatternCharToLevel[];
01195 
01199     UnicodeString       fPattern;
01200 
01204     UnicodeString       fDateOverride;
01205 
01209     UnicodeString       fTimeOverride;
01210 
01211 
01215     Locale              fLocale;
01216 
01221     DateFormatSymbols*  fSymbols;   // Owned
01222 
01226     TimeZoneFormat* fTimeZoneFormat;
01227 
01236     UDate                fDefaultCenturyStart;
01237 
01241     /*transient*/ int32_t   fDefaultCenturyStartYear;
01242 
01243     int32_t tztype; // here to avoid api change
01244 
01245     typedef struct NSOverride {
01246         NumberFormat *nf;
01247         int32_t hash;
01248         NSOverride *next;
01249     } NSOverride;
01250 
01251     NumberFormat    **fNumberFormatters;
01252 
01253     NSOverride      *fOverrideList;
01254 
01255     UBool fHaveDefaultCentury;
01256 
01257     UDateFormatContextValue fDefaultCapitalizationContext;
01258 };
01259 
01260 inline UDate
01261 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
01262 {
01263     return fDefaultCenturyStart;
01264 }
01265 
01266 inline UnicodeString&
01267 SimpleDateFormat::format(const Formattable& obj,
01268                          UnicodeString& appendTo,
01269                          UErrorCode& status) const {
01270     // Don't use Format:: - use immediate base class only,
01271     // in case immediate base modifies behavior later.
01272     return DateFormat::format(obj, appendTo, status);
01273 }
01274 
01275 inline UnicodeString&
01276 SimpleDateFormat::format(const Formattable& obj,
01277                          UnicodeString& appendTo,
01278                          FieldPosition& pos,
01279                          UErrorCode& status) const
01280 {
01281     // Don't use Format:: - use immediate base class only,
01282     // in case immediate base modifies behavior later.
01283     return DateFormat::format(obj, appendTo, pos, status);
01284 }
01285 
01286 inline UnicodeString&
01287 SimpleDateFormat::format(const Formattable& obj,
01288                          UnicodeString& appendTo,
01289                          FieldPositionIterator* posIter,
01290                          UErrorCode& status) const
01291 {
01292     // Don't use Format:: - use immediate base class only,
01293     // in case immediate base modifies behavior later.
01294     return DateFormat::format(obj, appendTo, posIter, status);
01295 }
01296 
01297 inline UnicodeString&
01298 SimpleDateFormat::format(UDate date,
01299                          UnicodeString& appendTo,
01300                          FieldPosition& fieldPosition) const {
01301     // Don't use Format:: - use immediate base class only,
01302     // in case immediate base modifies behavior later.
01303     return DateFormat::format(date, appendTo, fieldPosition);
01304 }
01305 
01306 inline UnicodeString&
01307 SimpleDateFormat::format(UDate date,
01308                          UnicodeString& appendTo,
01309                          FieldPositionIterator* posIter,
01310                          UErrorCode& status) const {
01311     // Don't use Format:: - use immediate base class only,
01312     // in case immediate base modifies behavior later.
01313     return DateFormat::format(date, appendTo, posIter, status);
01314 }
01315 
01316 inline UnicodeString&
01317 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01318     return DateFormat::format(date, appendTo);
01319 }
01320 
01321 U_NAMESPACE_END
01322 
01323 #endif /* #if !UCONFIG_NO_FORMATTING */
01324 
01325 #endif // _SMPDTFMT
01326 //eof