00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
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();
00776
00785 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00786
00795 SimpleDateFormat(const Locale& locale, UErrorCode& status);
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;
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 using DateFormat::getNumberFormat;
01025 NumberFormat * getNumberFormat(UDateFormatField index) const;
01026
01030 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
01031
01035 static const UCalendarDateFields fgPatternIndexToCalendarField[];
01036
01040 static const UDateFormatField fgPatternIndexToDateFormatField[];
01041
01048 static const int32_t fgCalendarFieldToLevel[];
01049 static const int32_t fgPatternCharToLevel[];
01050
01054 UnicodeString fPattern;
01055
01059 UnicodeString fDateOverride;
01060
01064 UnicodeString fTimeOverride;
01065
01066
01070 Locale fLocale;
01071
01076 DateFormatSymbols* fSymbols;
01077
01086 UDate fDefaultCenturyStart;
01087
01091 int32_t fDefaultCenturyStartYear;
01092
01093 enum ParsedTZType {
01094 TZTYPE_UNK,
01095 TZTYPE_STD,
01096 TZTYPE_DST
01097 };
01098
01099 ParsedTZType tztype;
01100
01101 typedef struct NSOverride {
01102 NumberFormat *nf;
01103 int32_t hash;
01104 NSOverride *next;
01105 } NSOverride;
01106
01107
01108
01109
01110 enum {
01111 kGMTNegativeHMS = 0,
01112 kGMTNegativeHM,
01113 kGMTPositiveHMS,
01114 kGMTPositiveHM,
01115
01116 kNumGMTFormatters
01117 };
01118 enum {
01119 kGMTNegativeHMSMinLenIdx = 0,
01120 kGMTPositiveHMSMinLenIdx,
01121
01122 kNumGMTFormatMinLengths
01123 };
01124
01125 MessageFormat **fGMTFormatters;
01126
01127
01128
01129
01130
01131
01132
01133 int32_t fGMTFormatHmsMinLen[kNumGMTFormatMinLengths];
01134
01135 NumberFormat **fNumberFormatters;
01136
01137 NSOverride *fOverrideList;
01138
01139 UBool fHaveDefaultCentury;
01140 };
01141
01142 inline UDate
01143 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01144 {
01145 return fDefaultCenturyStart;
01146 }
01147
01148 inline UnicodeString&
01149 SimpleDateFormat::format(const Formattable& obj,
01150 UnicodeString& appendTo,
01151 UErrorCode& status) const {
01152
01153
01154 return DateFormat::format(obj, appendTo, status);
01155 }
01156
01157 inline UnicodeString&
01158 SimpleDateFormat::format(const Formattable& obj,
01159 UnicodeString& appendTo,
01160 FieldPosition& pos,
01161 UErrorCode& status) const
01162 {
01163
01164
01165 return DateFormat::format(obj, appendTo, pos, status);
01166 }
01167
01168 inline UnicodeString&
01169 SimpleDateFormat::format(const Formattable& obj,
01170 UnicodeString& appendTo,
01171 FieldPositionIterator* posIter,
01172 UErrorCode& status) const
01173 {
01174
01175
01176 return DateFormat::format(obj, appendTo, posIter, status);
01177 }
01178
01179 inline UnicodeString&
01180 SimpleDateFormat::format(UDate date,
01181 UnicodeString& appendTo,
01182 FieldPosition& fieldPosition) const {
01183
01184
01185 return DateFormat::format(date, appendTo, fieldPosition);
01186 }
01187
01188 inline UnicodeString&
01189 SimpleDateFormat::format(UDate date,
01190 UnicodeString& appendTo,
01191 FieldPositionIterator* posIter,
01192 UErrorCode& status) const {
01193
01194
01195 return DateFormat::format(date, appendTo, posIter, status);
01196 }
01197
01198 inline UnicodeString&
01199 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01200 return DateFormat::format(date, appendTo);
01201 }
01202
01203 U_NAMESPACE_END
01204
01205 #endif
01206
01207 #endif // _SMPDTFMT
01208