ICU 4.6  4.6
smpdtfmt.h
Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 1997-2010, 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 
00215 class U_I18N_API SimpleDateFormat: public DateFormat {
00216 public:
00226     SimpleDateFormat(UErrorCode& status);
00227 
00239     SimpleDateFormat(const UnicodeString& pattern,
00240                      UErrorCode& status);
00241 
00263     SimpleDateFormat(const UnicodeString& pattern,
00264                      const UnicodeString& override,
00265                      UErrorCode& status);
00266 
00279     SimpleDateFormat(const UnicodeString& pattern,
00280                      const Locale& locale,
00281                      UErrorCode& status);
00282 
00304     SimpleDateFormat(const UnicodeString& pattern,
00305                      const UnicodeString& override,
00306                      const Locale& locale,
00307                      UErrorCode& status);
00308 
00318     SimpleDateFormat(const UnicodeString& pattern,
00319                      DateFormatSymbols* formatDataToAdopt,
00320                      UErrorCode& status);
00321 
00331     SimpleDateFormat(const UnicodeString& pattern,
00332                      const DateFormatSymbols& formatData,
00333                      UErrorCode& status);
00334 
00339     SimpleDateFormat(const SimpleDateFormat&);
00340 
00345     SimpleDateFormat& operator=(const SimpleDateFormat&);
00346 
00351     virtual ~SimpleDateFormat();
00352 
00359     virtual Format* clone(void) const;
00360 
00368     virtual UBool operator==(const Format& other) const;
00369 
00370 
00371     using DateFormat::format;
00372 
00389     virtual UnicodeString& format(  Calendar& cal,
00390                                     UnicodeString& appendTo,
00391                                     FieldPosition& pos) const;
00392 
00411     virtual UnicodeString& format(  Calendar& cal,
00412                                     UnicodeString& appendTo,
00413                                     FieldPositionIterator* posIter,
00414                                     UErrorCode& status) const;
00415 
00435     virtual UnicodeString& format(  const Formattable& obj,
00436                                     UnicodeString& appendTo,
00437                                     FieldPosition& pos,
00438                                     UErrorCode& status) const;
00439 
00460     virtual UnicodeString& format(  const Formattable& obj,
00461                                     UnicodeString& appendTo,
00462                                     FieldPositionIterator* posIter,
00463                                     UErrorCode& status) const;
00464 
00475     UnicodeString& format(UDate date,
00476                           UnicodeString& appendTo,
00477                           FieldPosition& fieldPosition) const;
00478 
00491     UnicodeString& format(UDate date,
00492                           UnicodeString& appendTo,
00493                           FieldPositionIterator* posIter,
00494                           UErrorCode& status) const;
00495 
00505     UnicodeString& format(const Formattable& obj,
00506                           UnicodeString& appendTo,
00507                           UErrorCode& status) const;
00508 
00517     UnicodeString& format(UDate date, UnicodeString& appendTo) const;
00518 
00538     virtual void parse( const UnicodeString& text,
00539                         Calendar& cal,
00540                         ParsePosition& pos) const;
00541 
00561     UDate parse( const UnicodeString& text,
00562                  ParsePosition& pos) const;
00563 
00564 
00580     virtual UDate parse( const UnicodeString& text,
00581                         UErrorCode& status) const;
00582 
00599     virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00600 
00616     UDate get2DigitYearStart(UErrorCode& status) const;
00617 
00624     virtual UnicodeString& toPattern(UnicodeString& result) const;
00625 
00642     virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
00643                                               UErrorCode& status) const;
00644 
00653     virtual void applyPattern(const UnicodeString& pattern);
00654 
00665     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00666                                        UErrorCode& status);
00667 
00676     virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
00677 
00684     virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
00685 
00691     virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
00692 
00704     static UClassID U_EXPORT2 getStaticClassID(void);
00705 
00717     virtual UClassID getDynamicClassID(void) const;
00718 
00728     virtual void adoptCalendar(Calendar* calendarToAdopt);
00729 
00740     UBool isFieldUnitIgnored(UCalendarDateFields field) const;
00741 
00742 
00754     static UBool isFieldUnitIgnored(const UnicodeString& pattern,
00755                                     UCalendarDateFields field);
00756 
00757 
00758 
00767     const Locale& getSmpFmtLocale(void) const;
00768 
00769 
00770 private:
00771     friend class DateFormat;
00772 
00773     void initializeDefaultCentury(void);
00774 
00775     SimpleDateFormat(); // default constructor not implemented
00776 
00785     SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00786 
00795     SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
00796 
00800     UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler,
00801            UErrorCode& status) const;
00802 
00816     void subFormat(UnicodeString &appendTo,
00817                    UChar ch,
00818                    int32_t count,
00819                    FieldPositionHandler& handler,
00820                    Calendar& cal,
00821                    UErrorCode& status) const; // in case of illegal argument
00822 
00835     void zeroPaddingNumber(NumberFormat *currentNumberFormat,
00836                            UnicodeString &appendTo,
00837                            int32_t value,
00838                            int32_t minDigits,
00839                            int32_t maxDigits) const;
00840 
00845     static UBool isNumeric(UChar formatChar, int32_t count);
00846 
00854     Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
00855 
00862     void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
00863 
00873     void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00874 
00881     void initialize(const Locale& locale, UErrorCode& status);
00882 
00895     int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
00896                         const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
00897 
00910     int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
00911                                const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
00912 
00928     int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
00929                      UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
00930                      int32_t patLoc) const;
00931 
00932     void parseInt(const UnicodeString& text,
00933                   Formattable& number,
00934                   ParsePosition& pos,
00935                   UBool allowNegative,
00936                   NumberFormat *fmt) const;
00937 
00938     void parseInt(const UnicodeString& text,
00939                   Formattable& number,
00940                   int32_t maxDigits,
00941                   ParsePosition& pos,
00942                   UBool allowNegative,
00943                   NumberFormat *fmt) const;
00944 
00945     int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
00946                            int32_t patLoc, UBool isNegative) const;
00947 
00960     static void translatePattern(const UnicodeString& originalPattern,
00961                                 UnicodeString& translatedPattern,
00962                                 const UnicodeString& from,
00963                                 const UnicodeString& to,
00964                                 UErrorCode& status);
00965 
00973     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
00974 
00984     int32_t compareSimpleAffix(const UnicodeString& affix,
00985                    const UnicodeString& input,
00986                    int32_t pos) const;
00987 
00992     int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos) const;
00993 
00998     int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
00999 
01003     void appendGMT(NumberFormat *currentNumberFormat,UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const;
01004     void formatGMTDefault(NumberFormat *currentNumberFormat,UnicodeString &appendTo, int32_t offset) const;
01005     int32_t parseGMT(const UnicodeString &text, ParsePosition &pos) const;
01006     int32_t parseGMTDefault(const UnicodeString &text, ParsePosition &pos) const;
01007     UBool isDefaultGMTFormat() const;
01008 
01009     void formatRFC822TZ(UnicodeString &appendTo, int32_t offset) const;
01010 
01014     void initGMTFormatters(UErrorCode &status);
01015 
01019     void initNumberFormatters(const Locale &locale,UErrorCode &status);
01020 
01024      NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
01025 
01029     void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01030 
01034     static const UCalendarDateFields fgPatternIndexToCalendarField[];
01035 
01039     static const UDateFormatField fgPatternIndexToDateFormatField[];
01040 
01047     static const int32_t fgCalendarFieldToLevel[];
01048     static const int32_t fgPatternCharToLevel[];
01049 
01053     UnicodeString       fPattern;
01054 
01058     UnicodeString       fDateOverride;
01059 
01063     UnicodeString       fTimeOverride;
01064 
01065 
01069     Locale              fLocale;
01070 
01075     DateFormatSymbols*  fSymbols;   // Owned
01076 
01085     UDate                fDefaultCenturyStart;
01086 
01090     /*transient*/ int32_t   fDefaultCenturyStartYear;
01091 
01092     enum ParsedTZType {
01093         TZTYPE_UNK,
01094         TZTYPE_STD,
01095         TZTYPE_DST
01096     };
01097 
01098     ParsedTZType tztype; // here to avoid api change
01099 
01100     typedef struct NSOverride {
01101         NumberFormat *nf;
01102         int32_t hash;
01103         NSOverride *next;
01104     } NSOverride;
01105 
01106     /*
01107      * MessageFormat instances used for localized GMT format
01108      */
01109     enum {
01110         kGMTNegativeHMS = 0,
01111         kGMTNegativeHM,
01112         kGMTPositiveHMS,
01113         kGMTPositiveHM,
01114 
01115         kNumGMTFormatters
01116     };
01117     enum {
01118         kGMTNegativeHMSMinLenIdx = 0,
01119         kGMTPositiveHMSMinLenIdx,
01120 
01121         kNumGMTFormatMinLengths
01122     };
01123 
01124     MessageFormat   **fGMTFormatters;
01125     // If a GMT hour format has a second field, we need to make sure
01126     // the length of input localized GMT string must match the expected
01127     // length.  Otherwise, sub DateForamt handling offset format may
01128     // unexpectedly success parsing input GMT string without second field.
01129     // See #6880 about this issue.
01130     // TODO: SimpleDateFormat should provide an option to invalidate
01131     //
01132     int32_t         fGMTFormatHmsMinLen[kNumGMTFormatMinLengths];
01133 
01134     NumberFormat    **fNumberFormatters;
01135 
01136     NSOverride      *fOverrideList;
01137 
01138     UBool fHaveDefaultCentury;
01139 };
01140 
01141 inline UDate
01142 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
01143 {
01144     return fDefaultCenturyStart;
01145 }
01146 
01147 inline UnicodeString&
01148 SimpleDateFormat::format(const Formattable& obj,
01149                          UnicodeString& appendTo,
01150                          UErrorCode& status) const {
01151     // Don't use Format:: - use immediate base class only,
01152     // in case immediate base modifies behavior later.
01153     return DateFormat::format(obj, appendTo, status);
01154 }
01155 
01156 inline UnicodeString&
01157 SimpleDateFormat::format(const Formattable& obj,
01158                          UnicodeString& appendTo,
01159                          FieldPosition& pos,
01160                          UErrorCode& status) const
01161 {
01162     // Don't use Format:: - use immediate base class only,
01163     // in case immediate base modifies behavior later.
01164     return DateFormat::format(obj, appendTo, pos, status);
01165 }
01166 
01167 inline UnicodeString&
01168 SimpleDateFormat::format(const Formattable& obj,
01169                          UnicodeString& appendTo,
01170                          FieldPositionIterator* posIter,
01171                          UErrorCode& status) const
01172 {
01173     // Don't use Format:: - use immediate base class only,
01174     // in case immediate base modifies behavior later.
01175     return DateFormat::format(obj, appendTo, posIter, status);
01176 }
01177 
01178 inline UnicodeString&
01179 SimpleDateFormat::format(UDate date,
01180                          UnicodeString& appendTo,
01181                          FieldPosition& fieldPosition) const {
01182     // Don't use Format:: - use immediate base class only,
01183     // in case immediate base modifies behavior later.
01184     return DateFormat::format(date, appendTo, fieldPosition);
01185 }
01186 
01187 inline UnicodeString&
01188 SimpleDateFormat::format(UDate date,
01189                          UnicodeString& appendTo,
01190                          FieldPositionIterator* posIter,
01191                          UErrorCode& status) const {
01192     // Don't use Format:: - use immediate base class only,
01193     // in case immediate base modifies behavior later.
01194     return DateFormat::format(date, appendTo, posIter, status);
01195 }
01196 
01197 inline UnicodeString&
01198 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01199     return DateFormat::format(date, appendTo);
01200 }
01201 
01202 U_NAMESPACE_END
01203 
01204 #endif /* #if !UCONFIG_NO_FORMATTING */
01205 
01206 #endif // _SMPDTFMT
01207 //eof
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines