ICU 4.6 4.6
|
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