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 U_SHOW_CPLUSPLUS_API
00020
00021 #if !UCONFIG_NO_FORMATTING
00022
00023 #include "unicode/format.h"
00024 #include "unicode/timezone.h"
00025 #include "unicode/tznames.h"
00026
00027 U_CDECL_BEGIN
00033 typedef enum UTimeZoneFormatStyle {
00038 UTZFMT_STYLE_GENERIC_LOCATION,
00043 UTZFMT_STYLE_GENERIC_LONG,
00048 UTZFMT_STYLE_GENERIC_SHORT,
00053 UTZFMT_STYLE_SPECIFIC_LONG,
00058 UTZFMT_STYLE_SPECIFIC_SHORT,
00063 UTZFMT_STYLE_LOCALIZED_GMT,
00069 UTZFMT_STYLE_LOCALIZED_GMT_SHORT,
00076 UTZFMT_STYLE_ISO_BASIC_SHORT,
00083 UTZFMT_STYLE_ISO_BASIC_LOCAL_SHORT,
00090 UTZFMT_STYLE_ISO_BASIC_FIXED,
00097 UTZFMT_STYLE_ISO_BASIC_LOCAL_FIXED,
00104 UTZFMT_STYLE_ISO_BASIC_FULL,
00111 UTZFMT_STYLE_ISO_BASIC_LOCAL_FULL,
00118 UTZFMT_STYLE_ISO_EXTENDED_FIXED,
00125 UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FIXED,
00132 UTZFMT_STYLE_ISO_EXTENDED_FULL,
00139 UTZFMT_STYLE_ISO_EXTENDED_LOCAL_FULL,
00144 UTZFMT_STYLE_ZONE_ID,
00149 UTZFMT_STYLE_ZONE_ID_SHORT,
00154 UTZFMT_STYLE_EXEMPLAR_LOCATION
00155 } UTimeZoneFormatStyle;
00156
00161 typedef enum UTimeZoneFormatGMTOffsetPatternType {
00166 UTZFMT_PAT_POSITIVE_HM,
00171 UTZFMT_PAT_POSITIVE_HMS,
00176 UTZFMT_PAT_NEGATIVE_HM,
00181 UTZFMT_PAT_NEGATIVE_HMS,
00186 UTZFMT_PAT_POSITIVE_H,
00191 UTZFMT_PAT_NEGATIVE_H,
00192
00193
00198 UTZFMT_PAT_COUNT = 6
00199 } UTimeZoneFormatGMTOffsetPatternType;
00200
00206 typedef enum UTimeZoneFormatTimeType {
00211 UTZFMT_TIME_TYPE_UNKNOWN,
00216 UTZFMT_TIME_TYPE_STANDARD,
00221 UTZFMT_TIME_TYPE_DAYLIGHT
00222 } UTimeZoneFormatTimeType;
00223
00228 typedef enum UTimeZoneFormatParseOption {
00233 UTZFMT_PARSE_OPTION_NONE = 0x00,
00240 UTZFMT_PARSE_OPTION_ALL_STYLES = 0x01,
00248 UTZFMT_PARSE_OPTION_TZ_DATABASE_ABBREVIATIONS = 0x02
00249 } UTimeZoneFormatParseOption;
00250
00251 U_CDECL_END
00252
00253 U_NAMESPACE_BEGIN
00254
00255 class TimeZoneGenericNames;
00256 class TZDBTimeZoneNames;
00257 class UVector;
00258
00274 class U_I18N_API TimeZoneFormat : public Format {
00275 public:
00280 TimeZoneFormat(const TimeZoneFormat& other);
00281
00286 virtual ~TimeZoneFormat();
00287
00292 TimeZoneFormat& operator=(const TimeZoneFormat& other);
00293
00302 virtual UBool operator==(const Format& other) const;
00303
00310 virtual TimeZoneFormat* clone() const;
00311
00320 static TimeZoneFormat* U_EXPORT2 createInstance(const Locale& locale, UErrorCode& status);
00321
00327 const TimeZoneNames* getTimeZoneNames() const;
00328
00336 void adoptTimeZoneNames(TimeZoneNames *tznames);
00337
00343 void setTimeZoneNames(const TimeZoneNames &tznames);
00344
00352 UnicodeString& getGMTPattern(UnicodeString& pattern) const;
00353
00362 void setGMTPattern(const UnicodeString& pattern, UErrorCode& status);
00363
00372 UnicodeString& getGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, UnicodeString& pattern) const;
00373
00382 void setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, const UnicodeString& pattern, UErrorCode& status);
00383
00393 UnicodeString& getGMTOffsetDigits(UnicodeString& digits) const;
00394
00407 void setGMTOffsetDigits(const UnicodeString& digits, UErrorCode& status);
00408
00416 UnicodeString& getGMTZeroFormat(UnicodeString& gmtZeroFormat) const;
00417
00425 void setGMTZeroFormat(const UnicodeString& gmtZeroFormat, UErrorCode& status);
00426
00434 uint32_t getDefaultParseOptions(void) const;
00435
00444 void setDefaultParseOptions(uint32_t flags);
00445
00461 UnicodeString& formatOffsetISO8601Basic(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
00462 UnicodeString& result, UErrorCode& status) const;
00463
00479 UnicodeString& formatOffsetISO8601Extended(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
00480 UnicodeString& result, UErrorCode& status) const;
00481
00501 UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
00502
00522 UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
00523
00524 using Format::format;
00525
00539 virtual UnicodeString& format(UTimeZoneFormatStyle style, const TimeZone& tz, UDate date,
00540 UnicodeString& name, UTimeZoneFormatTimeType* timeType = NULL) const;
00541
00556 int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos) const;
00557
00570 int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
00571
00584 int32_t parseOffsetShortLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
00585
00602 virtual TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
00603 int32_t parseOptions, UTimeZoneFormatTimeType* timeType = NULL) const;
00604
00620 TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
00621 UTimeZoneFormatTimeType* timeType = NULL) const;
00622
00623
00624
00625
00626
00638 virtual UnicodeString& format(const Formattable& obj, UnicodeString& appendTo,
00639 FieldPosition& pos, UErrorCode& status) const;
00640
00653 virtual void parseObject(const UnicodeString& source, Formattable& result, ParsePosition& parse_pos) const;
00654
00659 static UClassID U_EXPORT2 getStaticClassID(void);
00660
00665 virtual UClassID getDynamicClassID() const;
00666
00667 protected:
00674 TimeZoneFormat(const Locale& locale, UErrorCode& status);
00675
00676 private:
00677
00678 Locale fLocale;
00679
00680
00681 char fTargetRegion[ULOC_COUNTRY_CAPACITY];
00682
00683
00684 TimeZoneNames* fTimeZoneNames;
00685
00686
00687 TimeZoneGenericNames* fTimeZoneGenericNames;
00688
00689
00690 UnicodeString fGMTPattern;
00691
00692
00693 UnicodeString fGMTOffsetPatterns[UTZFMT_PAT_COUNT];
00694
00695
00696 UChar32 fGMTOffsetDigits[10];
00697
00698
00699 UnicodeString fGMTZeroFormat;
00700
00701
00702 uint32_t fDefParseOptionFlags;
00703
00704
00705 UnicodeString fGMTPatternPrefix;
00706 UnicodeString fGMTPatternSuffix;
00707
00708
00709 UVector* fGMTOffsetPatternItems[UTZFMT_PAT_COUNT];
00710
00711 UBool fAbuttingOffsetHoursAndMinutes;
00712
00713
00714 TZDBTimeZoneNames* fTZDBTimeZoneNames;
00715
00726 UnicodeString& formatSpecific(const TimeZone& tz, UTimeZoneNameType stdType, UTimeZoneNameType dstType,
00727 UDate date, UnicodeString& name, UTimeZoneFormatTimeType *timeType) const;
00728
00737 UnicodeString& formatGeneric(const TimeZone& tz, int32_t genType, UDate date, UnicodeString& name) const;
00738
00744 const TimeZoneGenericNames* getTimeZoneGenericNames(UErrorCode& status) const;
00745
00751 const TZDBTimeZoneNames* getTZDBTimeZoneNames(UErrorCode& status) const;
00752
00760 UnicodeString& formatExemplarLocation(const TimeZone& tz, UnicodeString& name) const;
00761
00765 enum OffsetFields {
00766 FIELDS_H,
00767 FIELDS_HM,
00768 FIELDS_HMS
00769 };
00770
00778 void initGMTPattern(const UnicodeString& gmtPattern, UErrorCode& status);
00779
00788 static UVector* parseOffsetPattern(const UnicodeString& pattern, OffsetFields required, UErrorCode& status);
00789
00798 static UnicodeString& expandOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
00799
00808 static UnicodeString& truncateOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
00809
00820 static UBool toCodePoints(const UnicodeString& str, UChar32* codeArray, int32_t capacity);
00821
00832 UnicodeString& formatOffsetISO8601(int32_t offset, UBool isBasic, UBool useUtcIndicator,
00833 UBool isShort, UBool ignoreSeconds, UnicodeString& result, UErrorCode& status) const;
00834
00842 UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UBool isShort, UnicodeString& result, UErrorCode& status) const;
00843
00858 int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos, UBool extendedOnly,
00859 UBool* hasDigitOffset = NULL) const;
00860
00868 void appendOffsetDigits(UnicodeString& buf, int32_t n, uint8_t minDigits) const;
00869
00882 int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos,
00883 UBool isShort, UBool* hasDigitOffset) const;
00884
00894 int32_t parseOffsetLocalizedGMTPattern(const UnicodeString& text, int32_t start,
00895 UBool isShort, int32_t& parsedLen) const;
00896
00905 int32_t parseOffsetFields(const UnicodeString& text, int32_t start, UBool isShort, int32_t& parsedLen) const;
00906
00918 int32_t parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t start,
00919 UVector* patternItems, UBool forceSingleHourDigit, int32_t& hour, int32_t& min, int32_t& sec) const;
00920
00928 int32_t parseAbuttingOffsetFields(const UnicodeString& text, int32_t start, int32_t& parsedLen) const;
00929
00937 int32_t parseOffsetDefaultLocalizedGMT(const UnicodeString& text, int start, int32_t& parsedLen) const;
00938
00947 int32_t parseDefaultOffsetFields(const UnicodeString& text, int32_t start, char16_t separator,
00948 int32_t& parsedLen) const;
00949
00964 int32_t parseOffsetFieldWithLocalizedDigits(const UnicodeString& text, int32_t start,
00965 uint8_t minDigits, uint8_t maxDigits, uint16_t minVal, uint16_t maxVal, int32_t& parsedLen) const;
00966
00976 int32_t parseSingleLocalizedDigit(const UnicodeString& text, int32_t start, int32_t& len) const;
00977
00987 static UnicodeString& formatOffsetWithAsciiDigits(int32_t offset, char16_t sep,
00988 OffsetFields minFields, OffsetFields maxFields, UnicodeString& result);
00989
01002 static int32_t parseAbuttingAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos,
01003 OffsetFields minFields, OffsetFields maxFields, UBool fixedHourWidth);
01004
01017 static int32_t parseAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos, char16_t sep,
01018 OffsetFields minFields, OffsetFields maxFields);
01019
01026 static UnicodeString& unquote(const UnicodeString& pattern, UnicodeString& result);
01027
01033 void initGMTOffsetPatterns(UErrorCode& status);
01034
01041 void checkAbuttingHoursAndMinutes();
01042
01048 TimeZone* createTimeZoneForOffset(int32_t offset) const;
01049
01055 static UTimeZoneFormatTimeType getTimeType(UTimeZoneNameType nameType);
01056
01065 UnicodeString& getTimeZoneID(const TimeZoneNames::MatchInfoCollection* matches, int32_t idx, UnicodeString& tzID) const;
01066
01067
01075 UnicodeString& parseZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01076
01084 UnicodeString& parseShortZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01085
01093 UnicodeString& parseExemplarLocation(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
01094 };
01095
01096 U_NAMESPACE_END
01097
01098 #endif
01099
01100 #endif
01101
01102 #endif