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 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;
01076
01085 UDate fDefaultCenturyStart;
01086
01090 int32_t fDefaultCenturyStartYear;
01091
01092 enum ParsedTZType {
01093 TZTYPE_UNK,
01094 TZTYPE_STD,
01095 TZTYPE_DST
01096 };
01097
01098 ParsedTZType tztype;
01099
01100 typedef struct NSOverride {
01101 NumberFormat *nf;
01102 int32_t hash;
01103 NSOverride *next;
01104 } NSOverride;
01105
01106
01107
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
01126
01127
01128
01129
01130
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& ) const
01143 {
01144 return fDefaultCenturyStart;
01145 }
01146
01147 inline UnicodeString&
01148 SimpleDateFormat::format(const Formattable& obj,
01149 UnicodeString& appendTo,
01150 UErrorCode& status) const {
01151
01152
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
01163
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
01174
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
01183
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
01193
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
01205
01206 #endif // _SMPDTFMT
01207