00001
00002
00003
00004
00005
00006
00007 #ifndef RBTZ_H
00008 #define RBTZ_H
00009
00010 #include "unicode/utypes.h"
00011
00017 #if !UCONFIG_NO_FORMATTING
00018
00019 #include "unicode/basictz.h"
00020 #include "unicode/unistr.h"
00021
00022 U_NAMESPACE_BEGIN
00023
00024
00025 class UVector;
00026 struct Transition;
00027
00028 class U_I18N_API RuleBasedTimeZone : public BasicTimeZone {
00029 public:
00039 RuleBasedTimeZone(const UnicodeString& id, InitialTimeZoneRule* initialRule);
00040
00046 RuleBasedTimeZone(const RuleBasedTimeZone& source);
00047
00052 virtual ~RuleBasedTimeZone();
00053
00059 RuleBasedTimeZone& operator=(const RuleBasedTimeZone& right);
00060
00069 virtual UBool operator==(const TimeZone& that) const;
00070
00079 virtual UBool operator!=(const TimeZone& that) const;
00080
00096 void addTransitionRule(TimeZoneRule* rule, UErrorCode& status);
00097
00107 void complete(UErrorCode& status);
00108
00116 virtual TimeZone* clone(void) const;
00117
00142 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00143 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const;
00144
00164 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00165 uint8_t dayOfWeek, int32_t millis,
00166 int32_t monthLength, UErrorCode& status) const;
00167
00190 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00191 int32_t& dstOffset, UErrorCode& ec) const;
00192
00200 virtual void setRawOffset(int32_t offsetMillis);
00201
00209 virtual int32_t getRawOffset(void) const;
00210
00217 virtual UBool useDaylightTime(void) const;
00218
00232 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00233
00242 virtual UBool hasSameRules(const TimeZone& other) const;
00243
00252 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) ;
00253
00262 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) ;
00263
00272 virtual int32_t countTransitionRules(UErrorCode& status) ;
00273
00290 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00291 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) ;
00292
00297 virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
00298 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) ;
00299
00300 private:
00301 void deleteRules(void);
00302 void deleteTransitions(void);
00303 UVector* copyRules(UVector* source);
00304 TimeZoneRule* findRuleInFinal(UDate date, UBool local,
00305 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00306 UBool findNext(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00307 UBool findPrev(UDate base, UBool inclusive, UDate& time, TimeZoneRule*& from, TimeZoneRule*& to) const;
00308 int32_t getLocalDelta(int32_t rawBefore, int32_t dstBefore, int32_t rawAfter, int32_t dstAfter,
00309 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00310 UDate getTransitionTime(Transition* transition, UBool local,
00311 int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt) const;
00312 void getOffsetInternal(UDate date, UBool local, int32_t NonExistingTimeOpt, int32_t DuplicatedTimeOpt,
00313 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& ec) const;
00314
00315 InitialTimeZoneRule *fInitialRule;
00316 UVector *fHistoricRules;
00317 UVector *fFinalRules;
00318 UVector *fHistoricTransitions;
00319 UBool fUpToDate;
00320
00321 public:
00333 static UClassID U_EXPORT2 getStaticClassID(void);
00334
00346 virtual UClassID getDynamicClassID(void) const;
00347 };
00348
00349 U_NAMESPACE_END
00350
00351 #endif
00352
00353 #endif // RBTZ_H
00354
00355