ICU 56.1  56.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
tzfmt.h
Go to the documentation of this file.
1 /*
2 *******************************************************************************
3 * Copyright (C) 2011-2015, International Business Machines Corporation and
4 * others. All Rights Reserved.
5 *******************************************************************************
6 */
7 #ifndef __TZFMT_H
8 #define __TZFMT_H
9 
15 #include "unicode/utypes.h"
16 
17 #if !UCONFIG_NO_FORMATTING
18 
19 #include "unicode/format.h"
20 #include "unicode/timezone.h"
21 #include "unicode/tznames.h"
22 
29 typedef enum UTimeZoneFormatStyle {
152 
188 
189  /* The following cannot be #ifndef U_HIDE_INTERNAL_API, needed for other .h declarations */
196 
219 
246 
248 
250 
251 class TimeZoneGenericNames;
252 class TZDBTimeZoneNames;
253 class UVector;
254 
271 public:
276  TimeZoneFormat(const TimeZoneFormat& other);
277 
282  virtual ~TimeZoneFormat();
283 
288  TimeZoneFormat& operator=(const TimeZoneFormat& other);
289 
298  virtual UBool operator==(const Format& other) const;
299 
306  virtual Format* clone() const;
307 
316  static TimeZoneFormat* U_EXPORT2 createInstance(const Locale& locale, UErrorCode& status);
317 
323  const TimeZoneNames* getTimeZoneNames() const;
324 
332  void adoptTimeZoneNames(TimeZoneNames *tznames);
333 
339  void setTimeZoneNames(const TimeZoneNames &tznames);
340 
348  UnicodeString& getGMTPattern(UnicodeString& pattern) const;
349 
358  void setGMTPattern(const UnicodeString& pattern, UErrorCode& status);
359 
368  UnicodeString& getGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, UnicodeString& pattern) const;
369 
378  void setGMTOffsetPattern(UTimeZoneFormatGMTOffsetPatternType type, const UnicodeString& pattern, UErrorCode& status);
379 
389  UnicodeString& getGMTOffsetDigits(UnicodeString& digits) const;
390 
403  void setGMTOffsetDigits(const UnicodeString& digits, UErrorCode& status);
404 
412  UnicodeString& getGMTZeroFormat(UnicodeString& gmtZeroFormat) const;
413 
421  void setGMTZeroFormat(const UnicodeString& gmtZeroFormat, UErrorCode& status);
422 
430  uint32_t getDefaultParseOptions(void) const;
431 
440  void setDefaultParseOptions(uint32_t flags);
441 
457  UnicodeString& formatOffsetISO8601Basic(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
458  UnicodeString& result, UErrorCode& status) const;
459 
475  UnicodeString& formatOffsetISO8601Extended(int32_t offset, UBool useUtcIndicator, UBool isShort, UBool ignoreSeconds,
476  UnicodeString& result, UErrorCode& status) const;
477 
497  UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
498 
518  UnicodeString& formatOffsetShortLocalizedGMT(int32_t offset, UnicodeString& result, UErrorCode& status) const;
519 
520  using Format::format;
521 
535  virtual UnicodeString& format(UTimeZoneFormatStyle style, const TimeZone& tz, UDate date,
536  UnicodeString& name, UTimeZoneFormatTimeType* timeType = NULL) const;
537 
552  int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos) const;
553 
566  int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
567 
580  int32_t parseOffsetShortLocalizedGMT(const UnicodeString& text, ParsePosition& pos) const;
581 
598  virtual TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
599  int32_t parseOptions, UTimeZoneFormatTimeType* timeType = NULL) const;
600 
616  TimeZone* parse(UTimeZoneFormatStyle style, const UnicodeString& text, ParsePosition& pos,
617  UTimeZoneFormatTimeType* timeType = NULL) const;
618 
619  /* ----------------------------------------------
620  * Format APIs
621  * ---------------------------------------------- */
622 
634  virtual UnicodeString& format(const Formattable& obj, UnicodeString& appendTo,
635  FieldPosition& pos, UErrorCode& status) const;
636 
649  virtual void parseObject(const UnicodeString& source, Formattable& result, ParsePosition& parse_pos) const;
650 
655  static UClassID U_EXPORT2 getStaticClassID(void);
656 
661  virtual UClassID getDynamicClassID() const;
662 
663 protected:
670  TimeZoneFormat(const Locale& locale, UErrorCode& status);
671 
672 private:
673  /* Locale of this object */
674  Locale fLocale;
675 
676  /* Stores the region (could be implicit default) */
677  char fTargetRegion[ULOC_COUNTRY_CAPACITY];
678 
679  /* TimeZoneNames object used by this formatter */
680  TimeZoneNames* fTimeZoneNames;
681 
682  /* TimeZoneGenericNames object used by this formatter - lazily instantiated */
683  TimeZoneGenericNames* fTimeZoneGenericNames;
684 
685  /* Localized GMT format pattern - e.g. "GMT{0}" */
686  UnicodeString fGMTPattern;
687 
688  /* Array of offset patterns used by Localized GMT format - e.g. "+HH:mm" */
689  UnicodeString fGMTOffsetPatterns[UTZFMT_PAT_COUNT];
690 
691  /* Localized decimal digits used by Localized GMT format */
692  UChar32 fGMTOffsetDigits[10];
693 
694  /* Localized GMT zero format - e.g. "GMT" */
695  UnicodeString fGMTZeroFormat;
696 
697  /* Bit flags representing parse options */
698  uint32_t fDefParseOptionFlags;
699 
700  /* Constant parts of GMT format pattern, populated from localized GMT format pattern*/
701  UnicodeString fGMTPatternPrefix; /* Substring before {0} */
702  UnicodeString fGMTPatternSuffix; /* Substring after {0} */
703 
704  /* Compiled offset patterns generated from fGMTOffsetPatterns[] */
705  UVector* fGMTOffsetPatternItems[UTZFMT_PAT_COUNT];
706 
707  UBool fAbuttingOffsetHoursAndMinutes;
708 
709  /* TZDBTimeZoneNames object used for parsing */
710  TZDBTimeZoneNames* fTZDBTimeZoneNames;
711 
722  UnicodeString& formatSpecific(const TimeZone& tz, UTimeZoneNameType stdType, UTimeZoneNameType dstType,
723  UDate date, UnicodeString& name, UTimeZoneFormatTimeType *timeType) const;
724 
733  UnicodeString& formatGeneric(const TimeZone& tz, int32_t genType, UDate date, UnicodeString& name) const;
734 
740  const TimeZoneGenericNames* getTimeZoneGenericNames(UErrorCode& status) const;
741 
747  const TZDBTimeZoneNames* getTZDBTimeZoneNames(UErrorCode& status) const;
748 
756  UnicodeString& formatExemplarLocation(const TimeZone& tz, UnicodeString& name) const;
757 
761  enum OffsetFields {
762  FIELDS_H,
763  FIELDS_HM,
764  FIELDS_HMS
765  };
766 
774  void initGMTPattern(const UnicodeString& gmtPattern, UErrorCode& status);
775 
784  static UVector* parseOffsetPattern(const UnicodeString& pattern, OffsetFields required, UErrorCode& status);
785 
794  static UnicodeString& expandOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
795 
804  static UnicodeString& truncateOffsetPattern(const UnicodeString& offsetHM, UnicodeString& result, UErrorCode& status);
805 
816  static UBool toCodePoints(const UnicodeString& str, UChar32* codeArray, int32_t capacity);
817 
828  UnicodeString& formatOffsetISO8601(int32_t offset, UBool isBasic, UBool useUtcIndicator,
829  UBool isShort, UBool ignoreSeconds, UnicodeString& result, UErrorCode& status) const;
830 
838  UnicodeString& formatOffsetLocalizedGMT(int32_t offset, UBool isShort, UnicodeString& result, UErrorCode& status) const;
839 
854  int32_t parseOffsetISO8601(const UnicodeString& text, ParsePosition& pos, UBool extendedOnly,
855  UBool* hasDigitOffset = NULL) const;
856 
864  void appendOffsetDigits(UnicodeString& buf, int32_t n, uint8_t minDigits) const;
865 
878  int32_t parseOffsetLocalizedGMT(const UnicodeString& text, ParsePosition& pos,
879  UBool isShort, UBool* hasDigitOffset) const;
880 
890  int32_t parseOffsetLocalizedGMTPattern(const UnicodeString& text, int32_t start,
891  UBool isShort, int32_t& parsedLen) const;
892 
901  int32_t parseOffsetFields(const UnicodeString& text, int32_t start, UBool isShort, int32_t& parsedLen) const;
902 
914  int32_t parseOffsetFieldsWithPattern(const UnicodeString& text, int32_t start,
915  UVector* patternItems, UBool forceSingleHourDigit, int32_t& hour, int32_t& min, int32_t& sec) const;
916 
924  int32_t parseAbuttingOffsetFields(const UnicodeString& text, int32_t start, int32_t& parsedLen) const;
925 
933  int32_t parseOffsetDefaultLocalizedGMT(const UnicodeString& text, int start, int32_t& parsedLen) const;
934 
943  int32_t parseDefaultOffsetFields(const UnicodeString& text, int32_t start, UChar separator,
944  int32_t& parsedLen) const;
945 
960  int32_t parseOffsetFieldWithLocalizedDigits(const UnicodeString& text, int32_t start,
961  uint8_t minDigits, uint8_t maxDigits, uint16_t minVal, uint16_t maxVal, int32_t& parsedLen) const;
962 
972  int32_t parseSingleLocalizedDigit(const UnicodeString& text, int32_t start, int32_t& len) const;
973 
983  static UnicodeString& formatOffsetWithAsciiDigits(int32_t offset, UChar sep,
984  OffsetFields minFields, OffsetFields maxFields, UnicodeString& result);
985 
998  static int32_t parseAbuttingAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos,
999  OffsetFields minFields, OffsetFields maxFields, UBool fixedHourWidth);
1000 
1013  static int32_t parseAsciiOffsetFields(const UnicodeString& text, ParsePosition& pos, UChar sep,
1014  OffsetFields minFields, OffsetFields maxFields);
1015 
1022  static UnicodeString& unquote(const UnicodeString& pattern, UnicodeString& result);
1023 
1029  void initGMTOffsetPatterns(UErrorCode& status);
1030 
1037  void checkAbuttingHoursAndMinutes();
1038 
1044  TimeZone* createTimeZoneForOffset(int32_t offset) const;
1045 
1051  static UTimeZoneFormatTimeType getTimeType(UTimeZoneNameType nameType);
1052 
1061  UnicodeString& getTimeZoneID(const TimeZoneNames::MatchInfoCollection* matches, int32_t idx, UnicodeString& tzID) const;
1062 
1063 
1071  UnicodeString& parseZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
1072 
1080  UnicodeString& parseShortZoneID(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
1081 
1089  UnicodeString& parseExemplarLocation(const UnicodeString& text, ParsePosition& pos, UnicodeString& tzID) const;
1090 };
1091 
1093 
1094 #endif /* !UCONFIG_NO_FORMATTING */
1095 #endif