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
00036 #if !UCONFIG_NO_FORMATTING
00037
00038 #include "unicode/basictz.h"
00039
00040 U_NAMESPACE_BEGIN
00041
00042
00043 class InitialTimeZoneRule;
00044 class TimeZoneTransition;
00045 class AnnualTimeZoneRule;
00046
00063 class U_I18N_API SimpleTimeZone: public BasicTimeZone {
00064 public:
00065
00077 enum TimeMode {
00078 WALL_TIME = 0,
00079 STANDARD_TIME,
00080 UTC_TIME
00081 };
00082
00088 SimpleTimeZone(const SimpleTimeZone& source);
00089
00095 SimpleTimeZone& operator=(const SimpleTimeZone& right);
00096
00101 virtual ~SimpleTimeZone();
00102
00112 virtual UBool operator==(const TimeZone& that) const;
00113
00125 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID);
00126
00162 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00163 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00164 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00165 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00166 int8_t savingsEndDayOfWeek, int32_t savingsEndTime,
00167 UErrorCode& status);
00205 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00206 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00207 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00208 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00209 int8_t savingsEndDayOfWeek, int32_t savingsEndTime,
00210 int32_t savingsDST, UErrorCode& status);
00211
00253 SimpleTimeZone(int32_t rawOffsetGMT, const UnicodeString& ID,
00254 int8_t savingsStartMonth, int8_t savingsStartDayOfWeekInMonth,
00255 int8_t savingsStartDayOfWeek, int32_t savingsStartTime,
00256 TimeMode savingsStartTimeMode,
00257 int8_t savingsEndMonth, int8_t savingsEndDayOfWeekInMonth,
00258 int8_t savingsEndDayOfWeek, int32_t savingsEndTime, TimeMode savingsEndTimeMode,
00259 int32_t savingsDST, UErrorCode& status);
00260
00269 void setStartYear(int32_t year);
00270
00313 void setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00314 int32_t time, UErrorCode& status);
00359 void setStartRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00360 int32_t time, TimeMode mode, UErrorCode& status);
00361
00373 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t time,
00374 UErrorCode& status);
00388 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t time,
00389 TimeMode mode, UErrorCode& status);
00390
00407 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00408 int32_t time, UBool after, UErrorCode& status);
00427 void setStartRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00428 int32_t time, TimeMode mode, UBool after, UErrorCode& status);
00429
00452 void setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00453 int32_t time, UErrorCode& status);
00454
00479 void setEndRule(int32_t month, int32_t dayOfWeekInMonth, int32_t dayOfWeek,
00480 int32_t time, TimeMode mode, UErrorCode& status);
00481
00493 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t time, UErrorCode& status);
00494
00508 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t time,
00509 TimeMode mode, UErrorCode& status);
00510
00527 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00528 int32_t time, UBool after, UErrorCode& status);
00529
00548 void setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00549 int32_t time, TimeMode mode, UBool after, UErrorCode& status);
00550
00571 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00572 uint8_t dayOfWeek, int32_t millis, UErrorCode& status) const;
00573
00589 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00590 uint8_t dayOfWeek, int32_t milliseconds,
00591 int32_t monthLength, UErrorCode& status) const;
00608 virtual int32_t getOffset(uint8_t era, int32_t year, int32_t month, int32_t day,
00609 uint8_t dayOfWeek, int32_t milliseconds,
00610 int32_t monthLength, int32_t prevMonthLength,
00611 UErrorCode& status) const;
00612
00618 virtual void getOffset(UDate date, UBool local, int32_t& rawOffset,
00619 int32_t& dstOffset, UErrorCode& ec) const;
00620
00625 virtual void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt,
00626 int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const;
00627
00635 virtual int32_t getRawOffset(void) const;
00636
00644 virtual void setRawOffset(int32_t offsetMillis);
00645
00655 void setDSTSavings(int32_t millisSavedDuringDST, UErrorCode& status);
00656
00665 virtual int32_t getDSTSavings(void) const;
00666
00673 virtual UBool useDaylightTime(void) const;
00674
00689 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00690
00697 UBool hasSameRules(const TimeZone& other) const;
00698
00706 virtual TimeZone* clone(void) const;
00707
00716 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00717
00726 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00727
00736 virtual int32_t countTransitionRules(UErrorCode& status) const;
00737
00754 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00755 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const;
00756
00757
00758 public:
00759
00770 virtual UClassID getDynamicClassID(void) const;
00771
00783 static UClassID U_EXPORT2 getStaticClassID(void);
00784
00785 private:
00789 enum EMode
00790 {
00791 DOM_MODE = 1,
00792 DOW_IN_MONTH_MODE,
00793 DOW_GE_DOM_MODE,
00794 DOW_LE_DOM_MODE
00795 };
00796
00797 SimpleTimeZone();
00798
00818 void construct(int32_t rawOffsetGMT,
00819 int8_t startMonth, int8_t startDay, int8_t startDayOfWeek,
00820 int32_t startTime, TimeMode startTimeMode,
00821 int8_t endMonth, int8_t endDay, int8_t endDayOfWeek,
00822 int32_t endTime, TimeMode endTimeMode,
00823 int32_t dstSavings, UErrorCode& status);
00824
00834 static int32_t compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen,
00835 int8_t dayOfMonth,
00836 int8_t dayOfWeek, int32_t millis, int32_t millisDelta,
00837 EMode ruleMode, int8_t ruleMonth, int8_t ruleDayOfWeek,
00838 int8_t ruleDay, int32_t ruleMillis);
00839
00855 void decodeRules(UErrorCode& status);
00856 void decodeStartRule(UErrorCode& status);
00857 void decodeEndRule(UErrorCode& status);
00858
00859 int8_t startMonth, startDay, startDayOfWeek;
00860 int32_t startTime;
00861 TimeMode startTimeMode, endTimeMode;
00862 int8_t endMonth, endDay, endDayOfWeek;
00863 int32_t endTime;
00864 int32_t startYear;
00865 int32_t rawOffset;
00866 UBool useDaylight;
00867 static const int8_t STATICMONTHLENGTH[12];
00868 EMode startMode, endMode;
00869
00874 int32_t dstSavings;
00875
00876
00877 void checkTransitionRules(UErrorCode& status) const;
00878 void initTransitionRules(UErrorCode& status);
00879 void clearTransitionRules(void);
00880 void deleteTransitionRules(void);
00881 UBool transitionRulesInitialized;
00882 InitialTimeZoneRule* initialRule;
00883 TimeZoneTransition* firstTransition;
00884 AnnualTimeZoneRule* stdRule;
00885 AnnualTimeZoneRule* dstRule;
00886 };
00887
00888 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth,
00889 int32_t dayOfWeek,
00890 int32_t time, UErrorCode& status) {
00891 setStartRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00892 }
00893
00894 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00895 int32_t time,
00896 UErrorCode& status) {
00897 setStartRule(month, dayOfMonth, time, WALL_TIME, status);
00898 }
00899
00900 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00901 int32_t dayOfWeek,
00902 int32_t time, UBool after, UErrorCode& status) {
00903 setStartRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00904 }
00905
00906 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfWeekInMonth,
00907 int32_t dayOfWeek,
00908 int32_t time, UErrorCode& status) {
00909 setEndRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00910 }
00911
00912 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth,
00913 int32_t time, UErrorCode& status) {
00914 setEndRule(month, dayOfMonth, time, WALL_TIME, status);
00915 }
00916
00917 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00918 int32_t time, UBool after, UErrorCode& status) {
00919 setEndRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00920 }
00921
00922 inline void
00923 SimpleTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffsetRef,
00924 int32_t& dstOffsetRef, UErrorCode& ec) const {
00925 TimeZone::getOffset(date, local, rawOffsetRef, dstOffsetRef, ec);
00926 }
00927
00928 U_NAMESPACE_END
00929
00930 #endif
00931
00932 #endif // _SIMPLETZ