00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef RBTZ_H
00010 #define RBTZ_H
00011
00012 #include "unicode/utypes.h"
00013
00019 #if !UCONFIG_NO_FORMATTING
00020
00021 #include "unicode/basictz.h"
00022 #include "unicode/unistr.h"
00023
00024 U_NAMESPACE_BEGIN
00025
00026
00027 class UVector;
00028 struct Transition;
00029
00036 class U_I18N_API RuleBasedTimeZone : public BasicTimeZone {
00037 public:
00047 RuleBasedTimeZone(const UnicodeString& id, InitialTimeZoneRule* initialRule);
00048
00054 RuleBasedTimeZone(const RuleBasedTimeZone& source);
00055
00060 virtual ~RuleBasedTimeZone();
00061
00067 RuleBasedTimeZone& operator=(const RuleBasedTimeZone& right);
00068
00077 virtual UBool operator==(const TimeZone& that) const;
00078
00087 virtual UBool operator!=(const TimeZone& that) const;
00088
00104 void addTransitionRule(TimeZoneRule* rule, UErrorCode& status);
00105
00115 void complete(UErrorCode& status);
00116
00124 virtual TimeZone* clone(void) const;
00125
00150 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00151 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const;
00152
00172 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00173 uint8_t dayOfWeek, int32_t millis,
00174 int32_t monthLength, UErrorCode& status) const;
00175
00198 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00199 int32_t& dstOffset, UErrorCode& ec) const;
00200
00208 virtual void setRawOffset(int32_t offsetMillis);
00209
00217 virtual int32_t getRawOffset(void) const;
00218
00225 virtual UBool useDaylightTime(void) const;
00226
00240 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00241
00250 virtual UBool hasSameRules(const TimeZone& other) const;
00251
00260 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00261
00270 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00271
00280 virtual int32_t countTransitionRules(UErrorCode& status) const;
00281
00298 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00299 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const;
00300
00305 virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
00306 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
00307
00308 private:
00309 void deleteRules(void);
00310 void deleteTransitions(void);
00311 UVector* copyRules(UVector* source);
00312 TimeZoneRule* findRuleInFinal(UDate date, UBool local,
00313 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00314 UBool findNext(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00315 UBool findPrev(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00316 int32_t getLocalDelta(int32_t rawBefore, int32_t dstBefore, int32_t rawAfter, int32_t dstAfter,
00317 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00318 UDate getTransitionTime(Transition* transition, UBool local,
00319 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00320 void getOffsetInternal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
00321 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& ec) const;
00322 void completeConst(UErrorCode &status) const;
00323
00324 InitialTimeZoneRule *fInitialRule;
00325 UVector *fHistoricRules;
00326 UVector *fFinalRules;
00327 UVector *fHistoricTransitions;
00328 UBool fUpToDate;
00329
00330 public:
00342 static UClassID U_EXPORT2 getStaticClassID(void);
00343
00355 virtual UClassID getDynamicClassID(void) const;
00356 };
00357
00358 U_NAMESPACE_END
00359
00360 #endif
00361
00362 #endif // RBTZ_H
00363
00364