ICU 4.8.1.1  4.8.1.1
smpdtfmt.h
Go to the documentation of this file.
00001 /*
00002 * Copyright (C) 1997-2011, 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 
00216 class U_I18N_API SimpleDateFormat: public DateFormat {
00217 public:
00227     SimpleDateFormat(UErrorCode& status);
00228 
00240     SimpleDateFormat(const UnicodeString& pattern,
00241                      UErrorCode& status);
00242 
00264     SimpleDateFormat(const UnicodeString& pattern,
00265                      const UnicodeString& override,
00266                      UErrorCode& status);
00267 
00280     SimpleDateFormat(const UnicodeString& pattern,
00281                      const Locale& locale,
00282                      UErrorCode& status);
00283 
00305     SimpleDateFormat(const UnicodeString& pattern,
00306                      const UnicodeString& override,
00307                      const Locale& locale,
00308                      UErrorCode& status);
00309 
00319     SimpleDateFormat(const UnicodeString& pattern,
00320                      DateFormatSymbols* formatDataToAdopt,
00321                      UErrorCode& status);
00322 
00332     SimpleDateFormat(const UnicodeString& pattern,
00333                      const DateFormatSymbols& formatData,
00334                      UErrorCode& status);
00335 
00340     SimpleDateFormat(const SimpleDateFormat&);
00341 
00346     SimpleDateFormat& operator=(const SimpleDateFormat&);
00347 
00352     virtual ~SimpleDateFormat();
00353 
00360     virtual Format* clone(void) const;
00361 
00369     virtual UBool operator==(const Format& other) const;
00370 
00371 
00372     using DateFormat::format;
00373 
00390     virtual UnicodeString& format(  Calendar& cal,
00391                                     UnicodeString& appendTo,
00392                                     FieldPosition& pos) const;
00393 
00412     virtual UnicodeString& format(  Calendar& cal,
00413                                     UnicodeString& appendTo,
00414                                     FieldPositionIterator* posIter,
00415                                     UErrorCode& status) const;
00416 
00436     virtual UnicodeString& format(  const Formattable& obj,
00437                                     UnicodeString& appendTo,
00438                                     FieldPosition& pos,
00439                                     UErrorCode& status) const;
00440 
00461     virtual UnicodeString& format(  const Formattable& obj,
00462                                     UnicodeString& appendTo,
00463                                     FieldPositionIterator* posIter,
00464                                     UErrorCode& status) const;
00465 
00476     UnicodeString& format(UDate date,
00477                           UnicodeString& appendTo,
00478                           FieldPosition& fieldPosition) const;
00479 
00492     UnicodeString& format(UDate date,
00493                           UnicodeString& appendTo,
00494                           FieldPositionIterator* posIter,
00495                           UErrorCode& status) const;
00496 
00506     UnicodeString& format(const Formattable& obj,
00507                           UnicodeString& appendTo,
00508                           UErrorCode& status) const;
00509 
00518     UnicodeString& format(UDate date, UnicodeString& appendTo) const;
00519 
00539     virtual void parse( const UnicodeString& text,
00540                         Calendar& cal,
00541                         ParsePosition& pos) const;
00542 
00562     UDate parse( const UnicodeString& text,
00563                  ParsePosition& pos) const;
00564 
00565 
00581     virtual UDate parse( const UnicodeString& text,
00582                         UErrorCode& status) const;
00583 
00600     virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00601 
00617     UDate get2DigitYearStart(UErrorCode& status) const;
00618 
00625     virtual UnicodeString& toPattern(UnicodeString& result) const;
00626 
00643     virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
00644                                               UErrorCode& status) const;
00645 
00654     virtual void applyPattern(const UnicodeString& pattern);
00655 
00666     virtual void applyLocalizedPattern(const UnicodeString& pattern,
00667                                        UErrorCode& status);
00668 
00677     virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
00678 
00685     virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
00686 
00692     virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
00693 
00705     static UClassID U_EXPORT2 getStaticClassID(void);
00706 
00718     virtual UClassID getDynamicClassID(void) const;
00719 
00729     virtual void adoptCalendar(Calendar* calendarToAdopt);
00730 
00741     UBool isFieldUnitIgnored(UCalendarDateFields field) const;
00742 
00743 
00755     static UBool isFieldUnitIgnored(const UnicodeString& pattern,
00756                                     UCalendarDateFields field);
00757 
00758 
00759 
00768     const Locale& getSmpFmtLocale(void) const;
00769 
00770 
00771 private:
00772     friend class DateFormat;
00773 
00774     void initializeDefaultCentury(void);
00775 
00776     SimpleDateFormat(); // default constructor not implemented
00777 
00786     SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00787 
00796     SimpleDateFormat(const Locale& locale, UErrorCode& status); // Use default pattern
00797 
00801     UnicodeString& _format(Calendar& cal, UnicodeString& appendTo, FieldPositionHandler& handler,
00802            UErrorCode& status) const;
00803 
00818     void subFormat(UnicodeString &appendTo,
00819                    UChar ch,
00820                    int32_t count,
00821                    FieldPositionHandler& handler,
00822                    Calendar& cal,
00823                    UErrorCode& status) const; // in case of illegal argument
00824 
00838     void zeroPaddingNumber(NumberFormat *currentNumberFormat,
00839                            UnicodeString &appendTo,
00840                            int32_t value,
00841                            int32_t minDigits,
00842                            int32_t maxDigits) const;
00843 
00848     static UBool isNumeric(UChar formatChar, int32_t count);
00849 
00857     Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
00858 
00865     void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
00866 
00876     void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00877 
00884     void initialize(const Locale& locale, UErrorCode& status);
00885 
00898     int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
00899                         const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
00900 
00913     int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
00914                                const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
00915     
00929     static UBool matchLiterals(const UnicodeString &pattern, int32_t &patternOffset,
00930                                const UnicodeString &text, int32_t &textOffset, UBool lenient);
00931     
00949     int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
00950                      UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], int32_t& saveHebrewMonth, Calendar& cal,
00951                      int32_t patLoc) const;
00952 
00953     void parseInt(const UnicodeString& text,
00954                   Formattable& number,
00955                   ParsePosition& pos,
00956                   UBool allowNegative,
00957                   NumberFormat *fmt) const;
00958 
00959     void parseInt(const UnicodeString& text,
00960                   Formattable& number,
00961                   int32_t maxDigits,
00962                   ParsePosition& pos,
00963                   UBool allowNegative,
00964                   NumberFormat *fmt) const;
00965 
00966     int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
00967                            int32_t patLoc, UBool isNegative) const;
00968 
00981     static void translatePattern(const UnicodeString& originalPattern,
00982                                 UnicodeString& translatedPattern,
00983                                 const UnicodeString& from,
00984                                 const UnicodeString& to,
00985                                 UErrorCode& status);
00986 
00994     void         parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
00995 
01005     int32_t compareSimpleAffix(const UnicodeString& affix,
01006                    const UnicodeString& input,
01007                    int32_t pos) const;
01008 
01013     int32_t skipPatternWhiteSpace(const UnicodeString& text, int32_t pos) const;
01014 
01019     int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
01020 
01024     void appendGMT(NumberFormat *currentNumberFormat,UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const;
01025     void formatGMTDefault(NumberFormat *currentNumberFormat,UnicodeString &appendTo, int32_t offset) const;
01026     int32_t parseGMT(const UnicodeString &text, ParsePosition &pos) const;
01027     int32_t parseGMTDefault(const UnicodeString &text, ParsePosition &pos) const;
01028     UBool isDefaultGMTFormat() const;
01029 
01030     void formatRFC822TZ(UnicodeString &appendTo, int32_t offset) const;
01031 
01035     void initGMTFormatters(UErrorCode &status);
01036 
01040     void initNumberFormatters(const Locale &locale,UErrorCode &status);
01041 
01045      NumberFormat * getNumberFormatByIndex(UDateFormatField index) const;
01046 
01050     void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01051 
01055     static const UCalendarDateFields fgPatternIndexToCalendarField[];
01056 
01060     static const UDateFormatField fgPatternIndexToDateFormatField[];
01061 
01065     TimeZoneFormat *tzFormat() const;
01066 
01073     static const int32_t fgCalendarFieldToLevel[];
01074     static const int32_t fgPatternCharToLevel[];
01075 
01079     UnicodeString       fPattern;
01080 
01084     UnicodeString       fDateOverride;
01085 
01089     UnicodeString       fTimeOverride;
01090 
01091 
01095     Locale              fLocale;
01096 
01101     DateFormatSymbols*  fSymbols;   // Owned
01102 
01106     TimeZoneFormat* fTimeZoneFormat;
01107 
01116     UDate                fDefaultCenturyStart;
01117 
01121     /*transient*/ int32_t   fDefaultCenturyStartYear;
01122 
01123     enum ParsedTZType {
01124         TZTYPE_UNK,
01125         TZTYPE_STD,
01126         TZTYPE_DST
01127     };
01128 
01129     ParsedTZType tztype; // here to avoid api change
01130 
01131     typedef struct NSOverride {
01132         NumberFormat *nf;
01133         int32_t hash;
01134         NSOverride *next;
01135     } NSOverride;
01136 
01137     /*
01138      * MessageFormat instances used for localized GMT format
01139      */
01140     enum {
01141         kGMTNegativeHMS = 0,
01142         kGMTNegativeHM,
01143         kGMTPositiveHMS,
01144         kGMTPositiveHM,
01145 
01146         kNumGMTFormatters
01147     };
01148     enum {
01149         kGMTNegativeHMSMinLenIdx = 0,
01150         kGMTPositiveHMSMinLenIdx,
01151 
01152         kNumGMTFormatMinLengths
01153     };
01154 
01155     MessageFormat   **fGMTFormatters;
01156     // If a GMT hour format has a second field, we need to make sure
01157     // the length of input localized GMT string must match the expected
01158     // length.  Otherwise, sub DateForamt handling offset format may
01159     // unexpectedly success parsing input GMT string without second field.
01160     // See #6880 about this issue.
01161     // TODO: SimpleDateFormat should provide an option to invalidate
01162     //
01163     int32_t         fGMTFormatHmsMinLen[kNumGMTFormatMinLengths];
01164 
01165     NumberFormat    **fNumberFormatters;
01166 
01167     NSOverride      *fOverrideList;
01168 
01169     UBool fHaveDefaultCentury;
01170 };
01171 
01172 inline UDate
01173 SimpleDateFormat::get2DigitYearStart(UErrorCode& /*status*/) const
01174 {
01175     return fDefaultCenturyStart;
01176 }
01177 
01178 inline UnicodeString&
01179 SimpleDateFormat::format(const Formattable& obj,
01180                          UnicodeString& appendTo,
01181                          UErrorCode& status) const {
01182     // Don't use Format:: - use immediate base class only,
01183     // in case immediate base modifies behavior later.
01184     return DateFormat::format(obj, appendTo, status);
01185 }
01186 
01187 inline UnicodeString&
01188 SimpleDateFormat::format(const Formattable& obj,
01189                          UnicodeString& appendTo,
01190                          FieldPosition& pos,
01191                          UErrorCode& status) const
01192 {
01193     // Don't use Format:: - use immediate base class only,
01194     // in case immediate base modifies behavior later.
01195     return DateFormat::format(obj, appendTo, pos, status);
01196 }
01197 
01198 inline UnicodeString&
01199 SimpleDateFormat::format(const Formattable& obj,
01200                          UnicodeString& appendTo,
01201                          FieldPositionIterator* posIter,
01202                          UErrorCode& status) const
01203 {
01204     // Don't use Format:: - use immediate base class only,
01205     // in case immediate base modifies behavior later.
01206     return DateFormat::format(obj, appendTo, posIter, status);
01207 }
01208 
01209 inline UnicodeString&
01210 SimpleDateFormat::format(UDate date,
01211                          UnicodeString& appendTo,
01212                          FieldPosition& fieldPosition) const {
01213     // Don't use Format:: - use immediate base class only,
01214     // in case immediate base modifies behavior later.
01215     return DateFormat::format(date, appendTo, fieldPosition);
01216 }
01217 
01218 inline UnicodeString&
01219 SimpleDateFormat::format(UDate date,
01220                          UnicodeString& appendTo,
01221                          FieldPositionIterator* posIter,
01222                          UErrorCode& status) const {
01223     // Don't use Format:: - use immediate base class only,
01224     // in case immediate base modifies behavior later.
01225     return DateFormat::format(date, appendTo, posIter, status);
01226 }
01227 
01228 inline UnicodeString&
01229 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01230     return DateFormat::format(date, appendTo);
01231 }
01232 
01233 U_NAMESPACE_END
01234 
01235 #endif /* #if !UCONFIG_NO_FORMATTING */
01236 
01237 #endif // _SMPDTFMT
01238 //eof
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Friends Defines