00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef SIMPLETZ_H
00025 #define SIMPLETZ_H
00026
00027 #include "unicode/utypes.h"
00028
00034 #if !UCONFIG_NO_FORMATTING
00035
00036 #include "unicode/basictz.h"
00037
00038 U_NAMESPACE_BEGIN
00039
00040
00041 class InitialTimeZoneRule;
00042 class TimeZoneTransition;
00043 class AnnualTimeZoneRule;
00044
00061 class U_I18N_API SimpleTimeZone: public BasicTimeZone {
00062 public:
00063
00075 enum TimeMode {
00076 WALL_TIME = 0,
00077 STANDARD_TIME,
00078 UTC_TIME
00079 };
00080
00086 SimpleTimeZone(const SimpleTimeZone& source);
00087
00093 SimpleTimeZone& operator=(const SimpleTimeZone& right);
00094
00099 virtual ~SimpleTimeZone();
00100
00110 virtual UBool operator==(const TimeZone& that) const;
00111
00123 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID);
00124
00160 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00161 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00162 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00163 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00164 int8_t savingsEndDayOfWeek, int32_t savingsEndTime,
00165 UErrorCode& status);
00203 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00204 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00205 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00206 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00207 int8_t savingsEndDayOfWeek, int32_t savingsEndTime,
00208 int32_t savingsDST, UErrorCode& status);
00209
00251 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00252 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00253 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00254 TimeMode savingsStartTimeMode,
00255 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00256 int8_t savingsEndDayOfWeek, int32_t savingsEndTime, TimeMode savingsEndTimeMode,
00257 int32_t savingsDST, UErrorCode& status);
00258
00267 void setStartYear(int32_t year);
00268
00311 void setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00312 int32_t time, UErrorCode& status);
00357 void setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00358 int32_t time, TimeMode mode, UErrorCode& status);
00359
00371 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t time,
00372 UErrorCode& status);
00386 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t time,
00387 TimeMode mode, UErrorCode& status);
00388
00405 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00406 int32_t time, UBool after, UErrorCode& status);
00425 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00426 int32_t time, TimeMode mode, UBool after, UErrorCode& status);
00427
00450 void setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00451 int32_t time, UErrorCode& status);
00452
00477 void setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00478 int32_t time, TimeMode mode, UErrorCode& status);
00479
00491 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t time, UErrorCode& status);
00492
00506 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t time,
00507 TimeMode mode, UErrorCode& status);
00508
00525 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00526 int32_t time, UBool after, UErrorCode& status);
00527
00546 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00547 int32_t time, TimeMode mode, UBool after, UErrorCode& status);
00548
00569 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00570 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const;
00571
00587 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00588 uint8_t dayOfWeek, int32_t milliseconds,
00589 int32_t monthLength, UErrorCode& status) const;
00606 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00607 uint8_t dayOfWeek, int32_t milliseconds,
00608 int32_t monthLength, int32_t prevMonthLength,
00609 UErrorCode& status) const;
00610
00616 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00617 int32_t& dstOffset, UErrorCode& ec) const;
00618
00623 virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
00624 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) ;
00625
00633 virtual int32_t getRawOffset(void) const;
00634
00642 virtual void setRawOffset(int32_t offsetMillis);
00643
00652 void setDSTSavings(int32_t millisSavedDuringDST, UErrorCode& status);
00653
00661 virtual int32_t getDSTSavings(void) const;
00662
00669 virtual UBool useDaylightTime(void) const;
00670
00685 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00686
00693 UBool hasSameRules(const TimeZone& other) const;
00694
00702 virtual TimeZone* clone(void) const;
00703
00712 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) ;
00713
00722 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) ;
00723
00732 virtual int32_t countTransitionRules(UErrorCode& status) ;
00733
00750 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00751 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) ;
00752
00753
00754 public:
00755
00766 virtual UClassID getDynamicClassID(void) const;
00767
00779 static UClassID U_EXPORT2 getStaticClassID(void);
00780
00781 private:
00785 enum EMode
00786 {
00787 DOM_MODE = 1,
00788 DOW_IN_MONTH_MODE,
00789 DOW_GE_DOM_MODE,
00790 DOW_LE_DOM_MODE
00791 };
00792
00793 SimpleTimeZone();
00794
00814 void construct(int32_t rawOffsetGMT,
00815 int8_t startMonth, int8_t startDay, int8_t startDayOfWeek,
00816 int32_t startTime, TimeMode startTimeMode,
00817 int8_t endMonth, int8_t endDay, int8_t endDayOfWeek,
00818 int32_t endTime, TimeMode endTimeMode,
00819 int32_t dstSavings, UErrorCode& status);
00820
00830 static int32_t compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen,
00831 int8_t dayOfMonth,
00832 int8_t dayOfWeek, int32_t millis, int32_t millisDelta,
00833 EMode ruleMode, int8_t ruleMonth, int8_t ruleDayOfWeek,
00834 int8_t ruleDay, int32_t ruleMillis);
00835
00851 void decodeRules(UErrorCode& status);
00852 void decodeStartRule(UErrorCode& status);
00853 void decodeEndRule(UErrorCode& status);
00854
00855 int8_t startMonth, startDay, startDayOfWeek;
00856 int32_t startTime;
00857 TimeMode startTimeMode, endTimeMode;
00858 int8_t endMonth, endDay, endDayOfWeek;
00859 int32_t endTime;
00860 int32_t startYear;
00861 int32_t rawOffset;
00862 UBool useDaylight;
00863 static const int8_t STATICMONTHLENGTH[12];
00864 EMode startMode, endMode;
00865
00870 int32_t dstSavings;
00871
00872
00873 void initTransitionRules(UErrorCode& status);
00874 void clearTransitionRules(void);
00875 void deleteTransitionRules(void);
00876 UBool transitionRulesInitialized;
00877 InitialTimeZoneRule* initialRule;
00878 TimeZoneTransition* firstTransition;
00879 AnnualTimeZoneRule* stdRule;
00880 AnnualTimeZoneRule* dstRule;
00881 };
00882
00883 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth,
00884 int32_t dayOfWeek,
00885 int32_t time, UErrorCode& status) {
00886 setStartRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00887 }
00888
00889 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00890 int32_t time,
00891 UErrorCode& status) {
00892 setStartRule(month, dayOfMonth, time, WALL_TIME, status);
00893 }
00894
00895 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00896 int32_t dayOfWeek,
00897 int32_t time, UBool after, UErrorCode& status) {
00898 setStartRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00899 }
00900
00901 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfWeekInMonth,
00902 int32_t dayOfWeek,
00903 int32_t time, UErrorCode& status) {
00904 setEndRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00905 }
00906
00907 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth,
00908 int32_t time, UErrorCode& status) {
00909 setEndRule(month, dayOfMonth, time, WALL_TIME, status);
00910 }
00911
00912 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00913 int32_t time, UBool after, UErrorCode& status) {
00914 setEndRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00915 }
00916
00917 inline void
00918 SimpleTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffsetRef,
00919 int32_t& dstOffsetRef, UErrorCode& ec) const {
00920 TimeZone::getOffset(date, local, rawOffsetRef, dstOffsetRef, ec);
00921 }
00922
00923 U_NAMESPACE_END
00924
00925 #endif
00926
00927 #endif // _SIMPLETZ