00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef __TZFMT_H
00010 #define __TZFMT_H
00011
00017 #include "unicode/utypes.h"
00018
00019 #if !UCONFIG_NO_FORMATTING
00020
00021 #include "unicode/format.h"
00022 #include "unicode/timezone.h"
00023 #include "unicode/tznames.h"
00024
00025 U_CDECL_BEGIN
00031 typedef enum UTimeZoneFormatStyle {
00036 UTZFMT_STYLE_GENERIC_LOCATION,
00041 UTZFMT_STYLE_GENERIC_LONG,
00046 UTZFMT_STYLE_GENERIC_SHORT,
00051 UTZFMT_STYLE_SPECIFIC_LONG,
00056 UTZFMT_STYLE_SPECIFIC_SHORT,
00061 UTZFMT_STYLE_LOCALIZED_GMT,
00067 UTZFMT_STYLE_LOCALIZED_GMT_SHORT,
00074 UTZFMT_STYLE_ISO_BASIC_SHORT,
00081 UTZFMT_STYLE_ISO_BASIC_LOCAL_SHORT,
00088 UTZFMT_STYLE_ISO_BASIC_FIXED,
00095 UTZFMT_STYLE_ISO_BASIC_LOCAL_FIXED,
00102 UTZFMT_STYLE_ISO_BASIC_FULL,
00109 UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
00116 UTZFMT_STYLE_ISO_EXTENDED_FIXED,
00123 UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FIXED,
00130 UTZFMT_STYLE_ISO_EXTENDED_FULL,
00137 UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FULL,
00142 UTZFMT_STYLE_ZONE_ID,
00147 UTZFMT_STYLE_ZONE_ID_SHORT,
00152 UTZFMT_STYLE_EXEMPLAR_LOCATION
00153 } UTimeZoneFormatStyle;
00154
00159 typedef enum UTimeZoneFormatGMTOffsetPatternType {
00164 UTZFMT_PAT_POSITIVE_HM,
00169 UTZFMT_PAT_POSITIVE_HMS,
00174 UTZFMT_PAT_NEGATIVE_HM,
00179 UTZFMT_PAT_NEGATIVE_HMS,
00184 UTZFMT_PAT_POSITIVE_H,
00189 UTZFMT_PAT_NEGATIVE_H,
00190
00191
00196 UTZFMT_PAT_COUNT = 6
00197 } UTimeZoneFormatGMTOffsetPatternType;
00198
00204 typedef enum UTimeZoneFormatTimeType {
00209 UTZFMT_TIME_TYPE_UNKNOWN,
00214 UTZFMT_TIME_TYPE_STANDARD,
00219 UTZFMT_TIME_TYPE_DAYLIGHT
00220 } UTimeZoneFormatTimeType;
00221
00226 typedef enum UTimeZoneFormatParseOption {
00231 UTZFMT_PARSE_OPTION_NONE = 0x00,
00238 UTZFMT_PARSE_OPTION_ALL_STYLES = 0x01,
00246 UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS = 0x02
00247 } UTimeZoneFormatParseOption;
00248
00249 U_CDECL_END
00250
00251 U_NAMESPACE_BEGIN
00252
00253 class TimeZoneGenericNames;
00254 class TZDBTimeZoneNames;
00255 class UVector;
00256
00272 class U_I18N_API TimeZoneFormat : public Format {
00273 public:
00278 TimeZoneFormat(const TimeZoneFormat& other);
00279
00284 virtual ~TimeZoneFormat();
00285
00290 TimeZoneFormat& operator=(const TimeZoneFormat& other);
00291
00300 virtual UBool operator==(const Format& other) const;
00301
00308 virtual Format* clone() const;
00309
00318 static TimeZoneFormat* U_EXPORT2 createInstance(const Locale& locale, UErrorCode& status);
00319
00325 const TimeZoneNames* getTimeZoneNames() const;
00326
00334 void adoptTimeZoneNames(TimeZoneNames *tznames);
00335
00341 void setTimeZoneNames(const TimeZoneNames &tznames);
00342
00350 UnicodeString& getGMTPattern(UnicodeString& pattern) const;
00351
00360 void setGMTPattern(const UnicodeString& pattern, UErrorCode& status);
00361
00370 UnicodeString& getGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, UnicodeString& pattern) const;
00371
00380 void setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, const UnicodeString& pattern, UErrorCode& status);
00381
00391 UnicodeString& getGMTOffsetDigits(UnicodeString& digits) const;
00392
00405 void setGMTOffsetDigits(const UnicodeString& digits, UErrorCode& status);
00406
00414 UnicodeString& getGMTZeroFormat(UnicodeString& gmtZeroFormat) const;
00415
00423 void setGMTZeroFormat(const UnicodeString& gmtZeroFormat, UErrorCode& status);
00424
00432 uint32_t getDefaultParseOptions(void) const;
00433
00442 void setDefaultParseOptions(uint32_t flags);
00443
00459 UnicodeString& formatOffsetISO8601Basic(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
00460 UnicodeString& result, UErrorCode& status) const;
00461
00477 UnicodeString& formatOffsetISO8601Extended(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
00478 UnicodeString& result, UErrorCode& status) const;
00479
00499 UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
00500
00520 UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
00521
00522 using Format::format;
00523
00537 virtual UnicodeString& format(UTimeZoneFormatStyle style, const TimeZone& tz, UDate date,
00538 UnicodeString& name, UTimeZoneFormatTimeType* timeType = NULL) const;
00539
00554 int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos) const;
00555
00568 int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
00569
00582 int32_t parseOffsetShortLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
00583
00600 virtual TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
00601 int32_t parseOptions, UTimeZoneFormatTimeType* timeType = NULL) const;
00602
00618 TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
00619 UTimeZoneFormatTimeType* timeType = NULL) const;
00620
00621
00622
00623
00624
00636 virtual UnicodeString& format(const Formattable& obj, UnicodeString& appendTo,
00637 FieldPosition& pos, UErrorCode& status) const;
00638
00651 virtual void parseObject(const UnicodeString& source, Formattable& result, ParsePosition& parse_pos) const;
00652
00657 static UClassID U_EXPORT2 getStaticClassID(void);
00658
00663 virtual UClassID getDynamicClassID() const;
00664
00665 protected:
00672 TimeZoneFormat(const Locale& locale, UErrorCode& status);
00673
00674 private:
00675
00676 Locale fLocale;
00677
00678
00679 char fTargetRegion[ULOC_COUNTRY_CAPACITY];
00680
00681
00682 TimeZoneNames* fTimeZoneNames;
00683
00684
00685 TimeZoneGenericNames* fTimeZoneGenericNames;
00686
00687
00688 UnicodeString fGMTPattern;
00689
00690
00691 UnicodeString fGMTOffsetPatterns[UTZFMT_PAT_COUNT];
00692
00693
00694 UChar32 fGMTOffsetDigits[10];
00695
00696
00697 UnicodeString fGMTZeroFormat;
00698
00699
00700 uint32_t fDefParseOptionFlags;
00701
00702
00703 UnicodeString fGMTPatternPrefix;
00704 UnicodeString fGMTPatternSuffix;
00705
00706
00707 UVector* fGMTOffsetPatternItems[UTZFMT_PAT_COUNT];
00708
00709 UBool fAbuttingOffsetHoursAndMinutes;
00710
00711
00712 TZDBTimeZoneNames* fTZDBTimeZoneNames;
00713
00724 UnicodeString& formatSpecific(const TimeZone& tz, UTimeZoneNameType stdType, UTimeZoneNameType dstType,
00725 UDate date, UnicodeString& name, UTimeZoneFormatTimeType *timeType) const;
00726
00735 UnicodeString& formatGeneric(const TimeZone& tz, int32_t genType, UDate date, UnicodeString& name) const;
00736
00742 const TimeZoneGenericNames* getTimeZoneGenericNames(UErrorCode& status) const;
00743
00749 const TZDBTimeZoneNames* getTZDBTimeZoneNames(UErrorCode& status) const;
00750
00758 UnicodeString& formatExemplarLocation(const TimeZone& tz, UnicodeString& name) const;
00759
00763 enum OffsetFields {
00764 FIELDS_H,
00765 FIELDS_HM,
00766 FIELDS_HMS
00767 };
00768
00776 void initGMTPattern(const UnicodeString& gmtPattern, UErrorCode& status);
00777
00786 static UVector* parseOffsetPattern(const UnicodeString& pattern, OffsetFields required, UErrorCode& status);
00787
00796 static UnicodeString& expandOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
00797
00806 static UnicodeString& truncateOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
00807
00818 static UBool toCodePoints(const UnicodeString& str, UChar32* codeArray, int32_t capacity);
00819
00830 UnicodeString& formatOffsetISO8601(int32_t offset, UBool isBasic, UBool useUtcIndicator,
00831 UBool isShort, UBool ignoreSeconds, UnicodeString& result, UErrorCode& status) const;
00832
00840 UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UBool isShort, UnicodeString& result, UErrorCode& status) const;
00841
00856 int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos, UBool extendedOnly,
00857 UBool* hasDigitOffset = NULL) const;
00858
00866 void appendOffsetDigits(UnicodeString& buf, int32_t n, uint8_t minDigits) const;
00867
00880 int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos,
00881 UBool isShort, UBool* hasDigitOffset) const;
00882
00892 int32_t parseOffsetLocalizedGMTPattern(const UnicodeString& text, int32_t start,
00893 UBool isShort, int32_t& parsedLen) const;
00894
00903 int32_t parseOffsetFields(const UnicodeString& text, int32_t start, UBool isShort, int32_t& parsedLen) const;
00904
00916 int32_t parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t start,
00917 UVector* patternItems, UBool forceSingleHourDigit, int32_t& hour, int32_t& min, int32_t& sec) const;
00918
00926 int32_t parseAbuttingOffsetFields(const UnicodeString& text, int32_t start, int32_t& parsedLen) const;
00927
00935 int32_t parseOffsetDefaultLocalizedGMT(const UnicodeString& text, int start, int32_t& parsedLen) const;
00936
00945 int32_t parseDefaultOffsetFields(const UnicodeString& text, int32_t start, char16_t separator,
00946 int32_t& parsedLen) const;
00947
00962 int32_t parseOffsetFieldWithLocalizedDigits(const UnicodeString& text, int32_t start,
00963 uint8_t minDigits, uint8_t maxDigits, uint16_t minVal, uint16_t maxVal, int32_t& parsedLen) const;
00964
00974 int32_t parseSingleLocalizedDigit(const UnicodeString& text, int32_t start, int32_t& len) const;
00975
00985 static UnicodeString& formatOffsetWithAsciiDigits(int32_t offset, char16_t sep,
00986 OffsetFields minFields, OffsetFields maxFields, UnicodeString& result);
00987
01000 static int32_t parseAbuttingAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos,
01001 OffsetFields minFields, OffsetFields maxFields, UBool fixedHourWidth);
01002
01015 static int32_t parseAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos, char16_t sep,
01016 OffsetFields minFields, OffsetFields maxFields);
01017
01024 static UnicodeString& unquote(const UnicodeString& pattern, UnicodeString& result);
01025
01031 void initGMTOffsetPatterns(UErrorCode& status);
01032
01039 void checkAbuttingHoursAndMinutes();
01040
01046 TimeZone* createTimeZoneForOffset(int32_t offset) const;
01047
01053 static UTimeZoneFormatTimeType getTimeType(UTimeZoneNameType nameType);
01054
01063 UnicodeString& getTimeZoneID(const TimeZoneNames::MatchInfoCollection* matches, int32_t idx, UnicodeString& tzID) const;
01064
01065
01073 UnicodeString& parseZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01074
01082 UnicodeString& parseShortZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01083
01091 UnicodeString& parseExemplarLocation(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01092 };
01093
01094 U_NAMESPACE_END
01095
01096 #endif
01097 #endif