00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef SIMPLETZ_H
00027 #define SIMPLETZ_H
00028
00029 #include "unicode/utypes.h"
00030
00031 #if U_SHOW_CPLUSPLUS_API
00032
00038 #if !UCONFIG_NO_FORMATTING
00039
00040 #include "unicode/basictz.h"
00041
00042 U_NAMESPACE_BEGIN
00043
00044
00045 class InitialTimeZoneRule;
00046 class TimeZoneTransition;
00047 class AnnualTimeZoneRule;
00048
00065 class U_I18N_API SimpleTimeZone: public BasicTimeZone {
00066 public:
00067
00079 enum TimeMode {
00080 WALL_TIME = 0,
00081 STANDARD_TIME,
00082 UTC_TIME
00083 };
00084
00090 SimpleTimeZone(const SimpleTimeZone& source);
00091
00097 SimpleTimeZone& operator=(const SimpleTimeZone& right);
00098
00103 virtual ~SimpleTimeZone();
00104
00114 virtual UBool operator==(const TimeZone& that) const;
00115
00127 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID);
00128
00164 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00165 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00166 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00167 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00168 int8_t savingsEndDayOfWeek, int32_t savingsEndTime,
00169 UErrorCode& status);
00207 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00208 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00209 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00210 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00211 int8_t savingsEndDayOfWeek, int32_t savingsEndTime,
00212 int32_t savingsDST, UErrorCode& status);
00213
00255 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00256 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00257 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00258 TimeMode savingsStartTimeMode,
00259 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00260 int8_t savingsEndDayOfWeek, int32_t savingsEndTime, TimeMode savingsEndTimeMode,
00261 int32_t savingsDST, UErrorCode& status);
00262
00271 void setStartYear(int32_t year);
00272
00315 void setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00316 int32_t time, UErrorCode& status);
00361 void setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00362 int32_t time, TimeMode mode, UErrorCode& status);
00363
00375 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t time,
00376 UErrorCode& status);
00390 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t time,
00391 TimeMode mode, UErrorCode& status);
00392
00409 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00410 int32_t time, UBool after, UErrorCode& status);
00429 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00430 int32_t time, TimeMode mode, UBool after, UErrorCode& status);
00431
00454 void setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00455 int32_t time, UErrorCode& status);
00456
00481 void setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00482 int32_t time, TimeMode mode, UErrorCode& status);
00483
00495 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t time, UErrorCode& status);
00496
00510 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t time,
00511 TimeMode mode, UErrorCode& status);
00512
00529 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00530 int32_t time, UBool after, UErrorCode& status);
00531
00550 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00551 int32_t time, TimeMode mode, UBool after, UErrorCode& status);
00552
00573 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00574 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const;
00575
00591 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00592 uint8_t dayOfWeek, int32_t milliseconds,
00593 int32_t monthLength, UErrorCode& status) const;
00610 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00611 uint8_t dayOfWeek, int32_t milliseconds,
00612 int32_t monthLength, int32_t prevMonthLength,
00613 UErrorCode& status) const;
00614
00620 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00621 int32_t& dstOffset, UErrorCode& ec) const;
00622
00627 virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
00628 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
00629
00637 virtual int32_t getRawOffset(void) const;
00638
00646 virtual void setRawOffset(int32_t offsetMillis);
00647
00657 void setDSTSavings(int32_t millisSavedDuringDST, UErrorCode& status);
00658
00667 virtual int32_t getDSTSavings(void) const;
00668
00675 virtual UBool useDaylightTime(void) const;
00676
00677 #ifndef U_FORCE_HIDE_DEPRECATED_API
00678
00692 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00693 #endif // U_FORCE_HIDE_DEPRECATED_API
00694
00701 UBool hasSameRules(const TimeZone& other) const;
00702
00710 virtual SimpleTimeZone* clone() const;
00711
00720 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00721
00730 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00731
00740 virtual int32_t countTransitionRules(UErrorCode& status) const;
00741
00758 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00759 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const;
00760
00761
00762 public:
00763
00774 virtual UClassID getDynamicClassID(void) const;
00775
00787 static UClassID U_EXPORT2 getStaticClassID(void);
00788
00789 private:
00793 enum EMode
00794 {
00795 DOM_MODE = 1,
00796 DOW_IN_MONTH_MODE,
00797 DOW_GE_DOM_MODE,
00798 DOW_LE_DOM_MODE
00799 };
00800
00801 SimpleTimeZone();
00802
00822 void construct(int32_t rawOffsetGMT,
00823 int8_t startMonth, int8_t startDay, int8_t startDayOfWeek,
00824 int32_t startTime, TimeMode startTimeMode,
00825 int8_t endMonth, int8_t endDay, int8_t endDayOfWeek,
00826 int32_t endTime, TimeMode endTimeMode,
00827 int32_t dstSavings, UErrorCode& status);
00828
00838 static int32_t compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen,
00839 int8_t dayOfMonth,
00840 int8_t dayOfWeek, int32_t millis, int32_t millisDelta,
00841 EMode ruleMode, int8_t ruleMonth, int8_t ruleDayOfWeek,
00842 int8_t ruleDay, int32_t ruleMillis);
00843
00859 void decodeRules(UErrorCode& status);
00860 void decodeStartRule(UErrorCode& status);
00861 void decodeEndRule(UErrorCode& status);
00862
00863 int8_t startMonth, startDay, startDayOfWeek;
00864 int32_t startTime;
00865 TimeMode startTimeMode, endTimeMode;
00866 int8_t endMonth, endDay, endDayOfWeek;
00867 int32_t endTime;
00868 int32_t startYear;
00869 int32_t rawOffset;
00870 UBool useDaylight;
00871 static const int8_t STATICMONTHLENGTH[12];
00872 EMode startMode, endMode;
00873
00878 int32_t dstSavings;
00879
00880
00881 void checkTransitionRules(UErrorCode& status) const;
00882 void initTransitionRules(UErrorCode& status);
00883 void clearTransitionRules(void);
00884 void deleteTransitionRules(void);
00885 UBool transitionRulesInitialized;
00886 InitialTimeZoneRule* initialRule;
00887 TimeZoneTransition* firstTransition;
00888 AnnualTimeZoneRule* stdRule;
00889 AnnualTimeZoneRule* dstRule;
00890 };
00891
00892 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth,
00893 int32_t dayOfWeek,
00894 int32_t time, UErrorCode& status) {
00895 setStartRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00896 }
00897
00898 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00899 int32_t time,
00900 UErrorCode& status) {
00901 setStartRule(month, dayOfMonth, time, WALL_TIME, status);
00902 }
00903
00904 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00905 int32_t dayOfWeek,
00906 int32_t time, UBool after, UErrorCode& status) {
00907 setStartRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00908 }
00909
00910 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfWeekInMonth,
00911 int32_t dayOfWeek,
00912 int32_t time, UErrorCode& status) {
00913 setEndRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00914 }
00915
00916 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth,
00917 int32_t time, UErrorCode& status) {
00918 setEndRule(month, dayOfMonth, time, WALL_TIME, status);
00919 }
00920
00921 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00922 int32_t time, UBool after, UErrorCode& status) {
00923 setEndRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00924 }
00925
00926 inline void
00927 SimpleTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffsetRef,
00928 int32_t& dstOffsetRef, UErrorCode& ec) const {
00929 TimeZone::getOffset(date, local, rawOffsetRef, dstOffsetRef, ec);
00930 }
00931
00932 U_NAMESPACE_END
00933
00934 #endif
00935
00936 #endif
00937
00938 #endif // _SIMPLETZ