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 UBool operator==(const TimeZone& that) const;
00080
00089 virtual UBool operator!=(const TimeZone& that) const;
00090
00106 void addTransitionRule(TimeZoneRule* rule, UErrorCode& status);
00107
00117 void complete(UErrorCode& status);
00118
00126 virtual RuleBasedTimeZone* clone() const;
00127
00152 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00153 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const;
00154
00174 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00175 uint8_t dayOfWeek, int32_t millis,
00176 int32_t monthLength, UErrorCode& status) const;
00177
00200 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00201 int32_t& dstOffset, UErrorCode& ec) const;
00202
00210 virtual void setRawOffset(int32_t offsetMillis);
00211
00219 virtual int32_t getRawOffset(void) const;
00220
00227 virtual UBool useDaylightTime(void) const;
00228
00229 #ifndef U_FORCE_HIDE_DEPRECATED_API
00230
00243 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00244 #endif // U_FORCE_HIDE_DEPRECATED_API
00245
00254 virtual UBool hasSameRules(const TimeZone& other) const;
00255
00264 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00265
00274 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00275
00284 virtual int32_t countTransitionRules(UErrorCode& status) const;
00285
00302 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00303 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const;
00304
00309 virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
00310 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
00311
00312 private:
00313 void deleteRules(void);
00314 void deleteTransitions(void);
00315 UVector* copyRules(UVector* source);
00316 TimeZoneRule* findRuleInFinal(UDate date, UBool local,
00317 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00318 UBool findNext(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00319 UBool findPrev(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00320 int32_t getLocalDelta(int32_t rawBefore, int32_t dstBefore, int32_t rawAfter, int32_t dstAfter,
00321 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00322 UDate getTransitionTime(Transition* transition, UBool local,
00323 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00324 void getOffsetInternal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
00325 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& ec) const;
00326 void completeConst(UErrorCode &status) const;
00327
00328 InitialTimeZoneRule *fInitialRule;
00329 UVector *fHistoricRules;
00330 UVector *fFinalRules;
00331 UVector *fHistoricTransitions;
00332 UBool fUpToDate;
00333
00334 public:
00346 static UClassID U_EXPORT2 getStaticClassID(void);
00347
00359 virtual UClassID getDynamicClassID(void) const;
00360 };
00361
00362 U_NAMESPACE_END
00363
00364 #endif
00365
00366 #endif
00367
00368 #endif // RBTZ_H
00369
00370