00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef RBTZ_H
00010 #define RBTZ_H
00011
00012 #include "unicode/utypes.h"
00013
00014 #if U_SHOW_CPLUSPLUS_API
00015
00021 #if !UCONFIG_NO_FORMATTING
00022
00023 #include "unicode/basictz.h"
00024 #include "unicode/unistr.h"
00025
00026 U_NAMESPACE_BEGIN
00027
00028
00029 class UVector;
00030 struct Transition;
00031
00038 class U_I18N_API RuleBasedTimeZone : public BasicTimeZone {
00039 public:
00049 RuleBasedTimeZone(const UnicodeString& id, InitialTimeZoneRule* initialRule);
00050
00056 RuleBasedTimeZone(const RuleBasedTimeZone& source);
00057
00062 virtual ~RuleBasedTimeZone();
00063
00069 RuleBasedTimeZone& operator=(const RuleBasedTimeZone& right);
00070
00079 virtual bool operator==(const TimeZone& that) const override;
00080
00089 virtual bool operator!=(const TimeZone& that) const;
00090
00107 void addTransitionRule(TimeZoneRule* rule, UErrorCode& status);
00108
00118 void complete(UErrorCode& status);
00119
00127 virtual RuleBasedTimeZone* clone() const override;
00128
00153 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00154 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const override;
00155
00175 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00176 uint8_t dayOfWeek, int32_t millis,
00177 int32_t monthLength, UErrorCode& status) const override;
00178
00201 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00202 int32_t& dstOffset, UErrorCode& ec) const override;
00203
00211 virtual void setRawOffset(int32_t offsetMillis) override;
00212
00220 virtual int32_t getRawOffset(void) const override;
00221
00228 virtual UBool useDaylightTime(void) const override;
00229
00230 #ifndef U_FORCE_HIDE_DEPRECATED_API
00231
00244 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const override;
00245 #endif // U_FORCE_HIDE_DEPRECATED_API
00246
00255 virtual UBool hasSameRules(const TimeZone& other) const override;
00256
00265 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const override;
00266
00275 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const override;
00276
00285 virtual int32_t countTransitionRules(UErrorCode& status) const override;
00286
00303 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00304 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const override;
00305
00310 virtual void getOffsetFromLocal(
00311 UDate date, UTimeZoneLocalOption nonExistingTimeOpt,
00312 UTimeZoneLocalOption duplicatedTimeOpt,
00313 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const override;
00314
00315 private:
00316 void deleteRules(void);
00317 void deleteTransitions(void);
00318 UVector* copyRules(UVector* source);
00319 TimeZoneRule* findRuleInFinal(UDate date, UBool local,
00320 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00321 UBool findNext(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00322 UBool findPrev(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00323 int32_t getLocalDelta(int32_t rawBefore, int32_t dstBefore, int32_t rawAfter, int32_t dstAfter,
00324 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00325 UDate getTransitionTime(Transition* transition, UBool local,
00326 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00327 void getOffsetInternal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
00328 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& ec) const;
00329 void completeConst(UErrorCode &status) const;
00330
00331 InitialTimeZoneRule *fInitialRule;
00332 UVector *fHistoricRules;
00333 UVector *fFinalRules;
00334 UVector *fHistoricTransitions;
00335 UBool fUpToDate;
00336
00337 public:
00349 static UClassID U_EXPORT2 getStaticClassID(void);
00350
00362 virtual UClassID getDynamicClassID(void) const override;
00363 };
00364
00365 U_NAMESPACE_END
00366
00367 #endif
00368
00369 #endif
00370
00371 #endif // RBTZ_H
00372
00373