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