00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef SMPDTFMT_H
00024 #define SMPDTFMT_H
00025
00026 #include "unicode/utypes.h"
00027
00033 #if !UCONFIG_NO_FORMATTING
00034
00035 #include "unicode/datefmt.h"
00036
00037 U_NAMESPACE_BEGIN
00038
00039 class DateFormatSymbols;
00040 class DateFormat;
00041 class MessageFormat;
00042
00213 class U_I18N_API SimpleDateFormat: public DateFormat {
00214 public:
00224 SimpleDateFormat(UErrorCode& status);
00225
00237 SimpleDateFormat(const UnicodeString& pattern,
00238 UErrorCode& status);
00239
00261 SimpleDateFormat(const UnicodeString& pattern,
00262 const UnicodeString& override,
00263 UErrorCode& status);
00264
00277 SimpleDateFormat(const UnicodeString& pattern,
00278 const Locale& locale,
00279 UErrorCode& status);
00280
00302 SimpleDateFormat(const UnicodeString& pattern,
00303 const UnicodeString& override,
00304 const Locale& locale,
00305 UErrorCode& status);
00306
00316 SimpleDateFormat(const UnicodeString& pattern,
00317 DateFormatSymbols* formatDataToAdopt,
00318 UErrorCode& status);
00319
00329 SimpleDateFormat(const UnicodeString& pattern,
00330 const DateFormatSymbols& formatData,
00331 UErrorCode& status);
00332
00337 SimpleDateFormat(const SimpleDateFormat&);
00338
00343 SimpleDateFormat& operator=(const SimpleDateFormat&);
00344
00349 virtual ~SimpleDateFormat();
00350
00357 virtual Format* clone(void) const;
00358
00366 virtual UBool operator==(const Format& other) const;
00367
00384 virtual UnicodeString& format( Calendar& cal,
00385 UnicodeString& appendTo,
00386 FieldPosition& pos) const;
00387
00407 virtual UnicodeString& format( const Formattable& obj,
00408 UnicodeString& appendTo,
00409 FieldPosition& pos,
00410 UErrorCode& status) const;
00411
00422 UnicodeString& format(UDate date,
00423 UnicodeString& appendTo,
00424 FieldPosition& fieldPosition) const;
00425
00435 UnicodeString& format(const Formattable& obj,
00436 UnicodeString& appendTo,
00437 UErrorCode& status) const;
00438
00447 UnicodeString& format(UDate date, UnicodeString& appendTo) const;
00448
00468 virtual void parse( const UnicodeString& text,
00469 Calendar& cal,
00470 ParsePosition& pos) const;
00471
00491 UDate parse( const UnicodeString& text,
00492 ParsePosition& pos) const;
00493
00494
00510 virtual UDate parse( const UnicodeString& text,
00511 UErrorCode& status) const;
00512
00529 virtual void set2DigitYearStart(UDate d, UErrorCode& status);
00530
00546 UDate get2DigitYearStart(UErrorCode& status) const;
00547
00554 virtual UnicodeString& toPattern(UnicodeString& result) const;
00555
00572 virtual UnicodeString& toLocalizedPattern(UnicodeString& result,
00573 UErrorCode& status) const;
00574
00583 virtual void applyPattern(const UnicodeString& pattern);
00584
00595 virtual void applyLocalizedPattern(const UnicodeString& pattern,
00596 UErrorCode& status);
00597
00606 virtual const DateFormatSymbols* getDateFormatSymbols(void) const;
00607
00614 virtual void adoptDateFormatSymbols(DateFormatSymbols* newFormatSymbols);
00615
00621 virtual void setDateFormatSymbols(const DateFormatSymbols& newFormatSymbols);
00622
00634 static UClassID U_EXPORT2 getStaticClassID(void);
00635
00647 virtual UClassID getDynamicClassID(void) const;
00648
00658 virtual void adoptCalendar(Calendar* calendarToAdopt);
00659
00670 UBool isFieldUnitIgnored(UCalendarDateFields field) const;
00671
00672
00684 static UBool isFieldUnitIgnored(const UnicodeString& pattern,
00685 UCalendarDateFields field);
00686
00687
00688
00697 const Locale& getSmpFmtLocale(void) const;
00698
00699
00700 private:
00701 friend class DateFormat;
00702
00703 void initializeDefaultCentury(void);
00704
00705 SimpleDateFormat();
00706
00715 SimpleDateFormat(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00716
00725 SimpleDateFormat(const Locale& locale, UErrorCode& status);
00726
00743 void subFormat( UnicodeString &appendTo,
00744 UChar ch,
00745 int32_t count,
00746 FieldPosition& pos,
00747 Calendar& cal,
00748 UErrorCode& status) const;
00749
00762 void zeroPaddingNumber( NumberFormat *currentNumberFormat,
00763 UnicodeString &appendTo,
00764 int32_t value,
00765 int32_t minDigits,
00766 int32_t maxDigits) const;
00767
00772 static UBool isNumeric(UChar formatChar, int32_t count);
00773
00781 Calendar *initializeCalendar(TimeZone* adoptZone, const Locale& locale, UErrorCode& status);
00782
00789 void initializeSymbols(const Locale& locale, Calendar* calendar, UErrorCode& status);
00790
00800 void construct(EStyle timeStyle, EStyle dateStyle, const Locale& locale, UErrorCode& status);
00801
00808 void initialize(const Locale& locale, UErrorCode& status);
00809
00822 int32_t matchString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
00823 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
00824
00837 int32_t matchQuarterString(const UnicodeString& text, int32_t start, UCalendarDateFields field,
00838 const UnicodeString* stringArray, int32_t stringArrayCount, Calendar& cal) const;
00839
00854 int32_t subParse(const UnicodeString& text, int32_t& start, UChar ch, int32_t count,
00855 UBool obeyCount, UBool allowNegative, UBool ambiguousYear[], Calendar& cal,
00856 int32_t patLoc) const;
00857
00858 void parseInt(const UnicodeString& text,
00859 Formattable& number,
00860 ParsePosition& pos,
00861 UBool allowNegative,
00862 NumberFormat *fmt) const;
00863
00864 void parseInt(const UnicodeString& text,
00865 Formattable& number,
00866 int32_t maxDigits,
00867 ParsePosition& pos,
00868 UBool allowNegative,
00869 NumberFormat *fmt) const;
00870
00871 int32_t checkIntSuffix(const UnicodeString& text, int32_t start,
00872 int32_t patLoc, UBool isNegative) const;
00873
00886 static void translatePattern(const UnicodeString& originalPattern,
00887 UnicodeString& translatedPattern,
00888 const UnicodeString& from,
00889 const UnicodeString& to,
00890 UErrorCode& status);
00891
00899 void parseAmbiguousDatesAsAfter(UDate startDate, UErrorCode& status);
00900
00910 int32_t compareSimpleAffix(const UnicodeString& affix,
00911 const UnicodeString& input,
00912 int32_t pos) const;
00913
00918 int32_t skipRuleWhiteSpace(const UnicodeString& text, int32_t pos) const;
00919
00924 int32_t skipUWhiteSpace(const UnicodeString& text, int32_t pos) const;
00925
00929 void appendGMT(NumberFormat *currentNumberFormat,UnicodeString &appendTo, Calendar& cal, UErrorCode& status) const;
00930 void formatGMTDefault(NumberFormat *currentNumberFormat,UnicodeString &appendTo, int32_t offset) const;
00931 int32_t parseGMT(const UnicodeString &text, ParsePosition &pos) const;
00932 int32_t parseGMTDefault(const UnicodeString &text, ParsePosition &pos) const;
00933 UBool isDefaultGMTFormat() const;
00934
00935 void formatRFC822TZ(UnicodeString &appendTo, int32_t offset) const;
00936
00940 void initGMTFormatters(UErrorCode &status);
00941
00945 void initNumberFormatters(const Locale &locale,UErrorCode &status);
00946
00950 using DateFormat::getNumberFormat;
00951 NumberFormat * getNumberFormat(UDateFormatField index) const;
00952
00956 void processOverrideString(const Locale &locale, const UnicodeString &str, int8_t type, UErrorCode &status);
00957
00961 static const UCalendarDateFields fgPatternIndexToCalendarField[];
00962
00966 static const UDateFormatField fgPatternIndexToDateFormatField[];
00967
00974 static const int32_t fgCalendarFieldToLevel[];
00975 static const int32_t fgPatternCharToLevel[];
00976
00980 UnicodeString fPattern;
00981
00985 UnicodeString fDateOverride;
00986
00990 UnicodeString fTimeOverride;
00991
00992
00996 Locale fLocale;
00997
01002 DateFormatSymbols* fSymbols;
01003
01012 UDate fDefaultCenturyStart;
01013
01017 int32_t fDefaultCenturyStartYear;
01018
01019 enum ParsedTZType {
01020 TZTYPE_UNK,
01021 TZTYPE_STD,
01022 TZTYPE_DST
01023 };
01024
01025 ParsedTZType tztype;
01026
01027 typedef struct NSOverride {
01028 NumberFormat *nf;
01029 int32_t hash;
01030 NSOverride *next;
01031 } NSOverride;
01032
01033
01034
01035
01036 enum {
01037 kGMTNegativeHMS = 0,
01038 kGMTNegativeHM,
01039 kGMTPositiveHMS,
01040 kGMTPositiveHM,
01041
01042 kNumGMTFormatters
01043 };
01044 enum {
01045 kGMTNegativeHMSMinLenIdx = 0,
01046 kGMTPositiveHMSMinLenIdx,
01047
01048 kNumGMTFormatMinLengths
01049 };
01050
01051 MessageFormat **fGMTFormatters;
01052
01053
01054
01055
01056
01057
01058
01059 int32_t fGMTFormatHmsMinLen[kNumGMTFormatMinLengths];
01060
01061 NumberFormat **fNumberFormatters;
01062
01063 NSOverride *fOverrideList;
01064
01065 UBool fHaveDefaultCentury;
01066 };
01067
01068 inline UDate
01069 SimpleDateFormat::get2DigitYearStart(UErrorCode& ) const
01070 {
01071 return fDefaultCenturyStart;
01072 }
01073
01074 inline UnicodeString&
01075 SimpleDateFormat::format(const Formattable& obj,
01076 UnicodeString& appendTo,
01077 UErrorCode& status) const {
01078
01079
01080 return DateFormat::format(obj, appendTo, status);
01081 }
01082
01083 inline UnicodeString&
01084 SimpleDateFormat::format(UDate date,
01085 UnicodeString& appendTo,
01086 FieldPosition& fieldPosition) const {
01087
01088
01089 return DateFormat::format(date, appendTo, fieldPosition);
01090 }
01091
01092 inline UnicodeString&
01093 SimpleDateFormat::format(UDate date, UnicodeString& appendTo) const {
01094 return DateFormat::format(date, appendTo);
01095 }
01096
01097 U_NAMESPACE_END
01098
01099 #endif
01100
01101 #endif // _SMPDTFMT
01102