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
00654 void setDSTSavings(int32_t millisSavedDuringDST, UErrorCode& status);
00655
00663 virtual int32_t getDSTSavings(void) const;
00664
00671 virtual UBool useDaylightTime(void) const;
00672
00687 virtual UBool inDaylightTime(UDate date, UErrorCode& status) const;
00688
00695 UBool hasSameRules(const TimeZone& other) const;
00696
00704 virtual TimeZone* clone(void) const;
00705
00714 virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00715
00724 virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const;
00725
00734 virtual int32_t countTransitionRules(UErrorCode& status) const;
00735
00752 virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial,
00753 const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const;
00754
00755
00756 public:
00757
00768 virtual UClassID getDynamicClassID(void) const;
00769
00781 static UClassID U_EXPORT2 getStaticClassID(void);
00782
00783 private:
00787 enum EMode
00788 {
00789 DOM_MODE = 1,
00790 DOW_IN_MONTH_MODE,
00791 DOW_GE_DOM_MODE,
00792 DOW_LE_DOM_MODE
00793 };
00794
00795 SimpleTimeZone();
00796
00816 void construct(int32_t rawOffsetGMT,
00817 int8_t startMonth, int8_t startDay, int8_t startDayOfWeek,
00818 int32_t startTime, TimeMode startTimeMode,
00819 int8_t endMonth, int8_t endDay, int8_t endDayOfWeek,
00820 int32_t endTime, TimeMode endTimeMode,
00821 int32_t dstSavings, UErrorCode& status);
00822
00832 static int32_t compareToRule(int8_t month, int8_t monthLen, int8_t prevMonthLen,
00833 int8_t dayOfMonth,
00834 int8_t dayOfWeek, int32_t millis, int32_t millisDelta,
00835 EMode ruleMode, int8_t ruleMonth, int8_t ruleDayOfWeek,
00836 int8_t ruleDay, int32_t ruleMillis);
00837
00853 void decodeRules(UErrorCode& status);
00854 void decodeStartRule(UErrorCode& status);
00855 void decodeEndRule(UErrorCode& status);
00856
00857 int8_t startMonth, startDay, startDayOfWeek;
00858 int32_t startTime;
00859 TimeMode startTimeMode, endTimeMode;
00860 int8_t endMonth, endDay, endDayOfWeek;
00861 int32_t endTime;
00862 int32_t startYear;
00863 int32_t rawOffset;
00864 UBool useDaylight;
00865 static const int8_t STATICMONTHLENGTH[12];
00866 EMode startMode, endMode;
00867
00872 int32_t dstSavings;
00873
00874
00875 void checkTransitionRules(UErrorCode& status) const;
00876 void initTransitionRules(UErrorCode& status);
00877 void clearTransitionRules(void);
00878 void deleteTransitionRules(void);
00879 UBool transitionRulesInitialized;
00880 InitialTimeZoneRule* initialRule;
00881 TimeZoneTransition* firstTransition;
00882 AnnualTimeZoneRule* stdRule;
00883 AnnualTimeZoneRule* dstRule;
00884 };
00885
00886 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfWeekInMonth,
00887 int32_t dayOfWeek,
00888 int32_t time, UErrorCode& status) {
00889 setStartRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00890 }
00891
00892 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00893 int32_t time,
00894 UErrorCode& status) {
00895 setStartRule(month, dayOfMonth, time, WALL_TIME, status);
00896 }
00897
00898 inline void SimpleTimeZone::setStartRule(int32_t month, int32_t dayOfMonth,
00899 int32_t dayOfWeek,
00900 int32_t time, UBool after, UErrorCode& status) {
00901 setStartRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00902 }
00903
00904 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfWeekInMonth,
00905 int32_t dayOfWeek,
00906 int32_t time, UErrorCode& status) {
00907 setEndRule(month, dayOfWeekInMonth, dayOfWeek, time, WALL_TIME, status);
00908 }
00909
00910 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth,
00911 int32_t time, UErrorCode& status) {
00912 setEndRule(month, dayOfMonth, time, WALL_TIME, status);
00913 }
00914
00915 inline void SimpleTimeZone::setEndRule(int32_t month, int32_t dayOfMonth, int32_t dayOfWeek,
00916 int32_t time, UBool after, UErrorCode& status) {
00917 setEndRule(month, dayOfMonth, dayOfWeek, time, WALL_TIME, after, status);
00918 }
00919
00920 inline void
00921 SimpleTimeZone::getOffset(UDate date, UBool local, int32_t& rawOffsetRef,
00922 int32_t& dstOffsetRef, UErrorCode& ec) const {
00923 TimeZone::getOffset(date, local, rawOffsetRef, dstOffsetRef, ec);
00924 }
00925
00926 U_NAMESPACE_END
00927
00928 #endif
00929
00930 #endif // _SIMPLETZ