00001
00002
00003
00004
00005
00006
00007 #ifndef __TZFMT_H
00008 #define __TZFMT_H
00009
00015 #include "unicode/utypes.h"
00016
00017 #if !UCONFIG_NO_FORMATTING
00018
00019 #include "unicode/format.h"
00020 #include "unicode/timezone.h"
00021 #include "unicode/tznames.h"
00022
00023 U_CDECL_BEGIN
00029 typedef enum UTimeZoneFormatStyle {
00034 UTZFMT_STYLE_GENERIC_LOCATION,
00039 UTZFMT_STYLE_GENERIC_LONG,
00044 UTZFMT_STYLE_GENERIC_SHORT,
00049 UTZFMT_STYLE_SPECIFIC_LONG,
00054 UTZFMT_STYLE_SPECIFIC_SHORT,
00059 UTZFMT_STYLE_LOCALIZED_GMT,
00065 UTZFMT_STYLE_LOCALIZED_GMT_SHORT,
00072 UTZFMT_STYLE_ISO_BASIC_SHORT,
00079 UTZFMT_STYLE_ISO_BASIC_LOCAL_SHORT,
00086 UTZFMT_STYLE_ISO_BASIC_FIXED,
00093 UTZFMT_STYLE_ISO_BASIC_LOCAL_FIXED,
00100 UTZFMT_STYLE_ISO_BASIC_FULL,
00107 UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
00114 UTZFMT_STYLE_ISO_EXTENDED_FIXED,
00121 UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FIXED,
00128 UTZFMT_STYLE_ISO_EXTENDED_FULL,
00135 UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FULL,
00140 UTZFMT_STYLE_ZONE_ID,
00145 UTZFMT_STYLE_ZONE_ID_SHORT,
00150 UTZFMT_STYLE_EXEMPLAR_LOCATION
00151 } UTimeZoneFormatStyle;
00152
00157 typedef enum UTimeZoneFormatGMTOffsetPatternType {
00162 UTZFMT_PAT_POSITIVE_HM,
00167 UTZFMT_PAT_POSITIVE_HMS,
00172 UTZFMT_PAT_NEGATIVE_HM,
00177 UTZFMT_PAT_NEGATIVE_HMS,
00182 UTZFMT_PAT_POSITIVE_H,
00187 UTZFMT_PAT_NEGATIVE_H,
00188
00189
00194 UTZFMT_PAT_COUNT = 6
00195 } UTimeZoneFormatGMTOffsetPatternType;
00196
00202 typedef enum UTimeZoneFormatTimeType {
00207 UTZFMT_TIME_TYPE_UNKNOWN,
00212 UTZFMT_TIME_TYPE_STANDARD,
00217 UTZFMT_TIME_TYPE_DAYLIGHT
00218 } UTimeZoneFormatTimeType;
00219
00224 typedef enum UTimeZoneFormatParseOption {
00229 UTZFMT_PARSE_OPTION_NONE = 0x00,
00236 UTZFMT_PARSE_OPTION_ALL_STYLES = 0x01,
00244 UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS = 0x02
00245 } UTimeZoneFormatParseOption;
00246
00247 U_CDECL_END
00248
00249 U_NAMESPACE_BEGIN
00250
00251 class TimeZoneGenericNames;
00252 class TZDBTimeZoneNames;
00253 class UVector;
00254
00270 class U_I18N_API TimeZoneFormat : public Format {
00271 public:
00276 TimeZoneFormat(const TimeZoneFormat& other);
00277
00282 virtual ~TimeZoneFormat();
00283
00288 TimeZoneFormat& operator=(const TimeZoneFormat& other);
00289
00298 virtual UBool operator==(const Format& other) const;
00299
00306 virtual Format* clone() const;
00307
00316 static TimeZoneFormat* U_EXPORT2 createInstance(const Locale& locale, UErrorCode& status);
00317
00323 const TimeZoneNames* getTimeZoneNames() const;
00324
00332 void adoptTimeZoneNames(TimeZoneNames *tznames);
00333
00339 void setTimeZoneNames(const TimeZoneNames &tznames);
00340
00348 UnicodeString& getGMTPattern(UnicodeString& pattern) const;
00349
00358 void setGMTPattern(const UnicodeString& pattern, UErrorCode& status);
00359
00368 UnicodeString& getGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, UnicodeString& pattern) const;
00369
00378 void setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, const UnicodeString& pattern, UErrorCode& status);
00379
00389 UnicodeString& getGMTOffsetDigits(UnicodeString& digits) const;
00390
00403 void setGMTOffsetDigits(const UnicodeString& digits, UErrorCode& status);
00404
00412 UnicodeString& getGMTZeroFormat(UnicodeString& gmtZeroFormat) const;
00413
00421 void setGMTZeroFormat(const UnicodeString& gmtZeroFormat, UErrorCode& status);
00422
00430 uint32_t getDefaultParseOptions(void) const;
00431
00440 void setDefaultParseOptions(uint32_t flags);
00441
00457 UnicodeString& formatOffsetISO8601Basic(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
00458 UnicodeString& result, UErrorCode& status) const;
00459
00475 UnicodeString& formatOffsetISO8601Extended(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
00476 UnicodeString& result, UErrorCode& status) const;
00477
00497 UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
00498
00518 UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
00519
00520 using Format::format;
00521
00535 virtual UnicodeString& format(UTimeZoneFormatStyle style, const TimeZone& tz, UDate date,
00536 UnicodeString& name, UTimeZoneFormatTimeType* timeType = NULL) const;
00537
00552 int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos) const;
00553
00566 int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
00567
00580 int32_t parseOffsetShortLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
00581
00598 virtual TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
00599 int32_t parseOptions, UTimeZoneFormatTimeType* timeType = NULL) const;
00600
00616 TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
00617 UTimeZoneFormatTimeType* timeType = NULL) const;
00618
00619
00620
00621
00622
00634 virtual UnicodeString& format(const Formattable& obj, UnicodeString& appendTo,
00635 FieldPosition& pos, UErrorCode& status) const;
00636
00649 virtual void parseObject(const UnicodeString& source, Formattable& result, ParsePosition& parse_pos) const;
00650
00655 static UClassID U_EXPORT2 getStaticClassID(void);
00656
00661 virtual UClassID getDynamicClassID() const;
00662
00663 protected:
00670 TimeZoneFormat(const Locale& locale, UErrorCode& status);
00671
00672 private:
00673
00674 Locale fLocale;
00675
00676
00677 char fTargetRegion[ULOC_COUNTRY_CAPACITY];
00678
00679
00680 TimeZoneNames* fTimeZoneNames;
00681
00682
00683 TimeZoneGenericNames* fTimeZoneGenericNames;
00684
00685
00686 UnicodeString fGMTPattern;
00687
00688
00689 UnicodeString fGMTOffsetPatterns[UTZFMT_PAT_COUNT];
00690
00691
00692 UChar32 fGMTOffsetDigits[10];
00693
00694
00695 UnicodeString fGMTZeroFormat;
00696
00697
00698 uint32_t fDefParseOptionFlags;
00699
00700
00701 UnicodeString fGMTPatternPrefix;
00702 UnicodeString fGMTPatternSuffix;
00703
00704
00705 UVector* fGMTOffsetPatternItems[UTZFMT_PAT_COUNT];
00706
00707 UBool fAbuttingOffsetHoursAndMinutes;
00708
00709
00710 TZDBTimeZoneNames* fTZDBTimeZoneNames;
00711
00722 UnicodeString& formatSpecific(const TimeZone& tz, UTimeZoneNameType stdType, UTimeZoneNameType dstType,
00723 UDate date, UnicodeString& name, UTimeZoneFormatTimeType *timeType) const;
00724
00733 UnicodeString& formatGeneric(const TimeZone& tz, int32_t genType, UDate date, UnicodeString& name) const;
00734
00740 const TimeZoneGenericNames* getTimeZoneGenericNames(UErrorCode& status) const;
00741
00747 const TZDBTimeZoneNames* getTZDBTimeZoneNames(UErrorCode& status) const;
00748
00756 UnicodeString& formatExemplarLocation(const TimeZone& tz, UnicodeString& name) const;
00757
00761 enum OffsetFields {
00762 FIELDS_H,
00763 FIELDS_HM,
00764 FIELDS_HMS
00765 };
00766
00774 void initGMTPattern(const UnicodeString& gmtPattern, UErrorCode& status);
00775
00784 static UVector* parseOffsetPattern(const UnicodeString& pattern, OffsetFields required, UErrorCode& status);
00785
00794 static UnicodeString& expandOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
00795
00804 static UnicodeString& truncateOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
00805
00816 static UBool toCodePoints(const UnicodeString& str, UChar32* codeArray, int32_t capacity);
00817
00828 UnicodeString& formatOffsetISO8601(int32_t offset, UBool isBasic, UBool useUtcIndicator,
00829 UBool isShort, UBool ignoreSeconds, UnicodeString& result, UErrorCode& status) const;
00830
00838 UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UBool isShort, UnicodeString& result, UErrorCode& status) const;
00839
00854 int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos, UBool extendedOnly,
00855 UBool* hasDigitOffset = NULL) const;
00856
00864 void appendOffsetDigits(UnicodeString& buf, int32_t n, uint8_t minDigits) const;
00865
00878 int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos,
00879 UBool isShort, UBool* hasDigitOffset) const;
00880
00890 int32_t parseOffsetLocalizedGMTPattern(const UnicodeString& text, int32_t start,
00891 UBool isShort, int32_t& parsedLen) const;
00892
00901 int32_t parseOffsetFields(const UnicodeString& text, int32_t start, UBool isShort, int32_t& parsedLen) const;
00902
00914 int32_t parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t start,
00915 UVector* patternItems, UBool forceSingleHourDigit, int32_t& hour, int32_t& min, int32_t& sec) const;
00916
00924 int32_t parseAbuttingOffsetFields(const UnicodeString& text, int32_t start, int32_t& parsedLen) const;
00925
00933 int32_t parseOffsetDefaultLocalizedGMT(const UnicodeString& text, int start, int32_t& parsedLen) const;
00934
00943 int32_t parseDefaultOffsetFields(const UnicodeString& text, int32_t start, UChar separator,
00944 int32_t& parsedLen) const;
00945
00960 int32_t parseOffsetFieldWithLocalizedDigits(const UnicodeString& text, int32_t start,
00961 uint8_t minDigits, uint8_t maxDigits, uint16_t minVal, uint16_t maxVal, int32_t& parsedLen) const;
00962
00972 int32_t parseSingleLocalizedDigit(const UnicodeString& text, int32_t start, int32_t& len) const;
00973
00983 static UnicodeString& formatOffsetWithAsciiDigits(int32_t offset, UChar sep,
00984 OffsetFields minFields, OffsetFields maxFields, UnicodeString& result);
00985
00998 static int32_t parseAbuttingAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos,
00999 OffsetFields minFields, OffsetFields maxFields, UBool fixedHourWidth);
01000
01013 static int32_t parseAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos, UChar sep,
01014 OffsetFields minFields, OffsetFields maxFields);
01015
01022 static UnicodeString& unquote(const UnicodeString& pattern, UnicodeString& result);
01023
01029 void initGMTOffsetPatterns(UErrorCode& status);
01030
01037 void checkAbuttingHoursAndMinutes();
01038
01044 TimeZone* createTimeZoneForOffset(int32_t offset) const;
01045
01051 static UTimeZoneFormatTimeType getTimeType(UTimeZoneNameType nameType);
01052
01061 UnicodeString& getTimeZoneID(const TimeZoneNames::MatchInfoCollection* matches, int32_t idx, UnicodeString& tzID) const;
01062
01063
01071 UnicodeString& parseZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01072
01080 UnicodeString& parseShortZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01081
01089 UnicodeString& parseExemplarLocation(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01090 };
01091
01092 U_NAMESPACE_END
01093
01094 #endif
01095 #endif