1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2007-2013, International Business Machines Corporation and 6*0e209d39SAndroid Build Coastguard Worker * others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ******************************************************************************* 8*0e209d39SAndroid Build Coastguard Worker */ 9*0e209d39SAndroid Build Coastguard Worker #ifndef BASICTZ_H 10*0e209d39SAndroid Build Coastguard Worker #define BASICTZ_H 11*0e209d39SAndroid Build Coastguard Worker 12*0e209d39SAndroid Build Coastguard Worker /** 13*0e209d39SAndroid Build Coastguard Worker * \file 14*0e209d39SAndroid Build Coastguard Worker * \brief C++ API: ICU TimeZone base class 15*0e209d39SAndroid Build Coastguard Worker */ 16*0e209d39SAndroid Build Coastguard Worker 17*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 18*0e209d39SAndroid Build Coastguard Worker 19*0e209d39SAndroid Build Coastguard Worker #if U_SHOW_CPLUSPLUS_API 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker #include "unicode/timezone.h" 24*0e209d39SAndroid Build Coastguard Worker #include "unicode/tzrule.h" 25*0e209d39SAndroid Build Coastguard Worker #include "unicode/tztrans.h" 26*0e209d39SAndroid Build Coastguard Worker 27*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 28*0e209d39SAndroid Build Coastguard Worker 29*0e209d39SAndroid Build Coastguard Worker // forward declarations 30*0e209d39SAndroid Build Coastguard Worker class UVector; 31*0e209d39SAndroid Build Coastguard Worker 32*0e209d39SAndroid Build Coastguard Worker /** 33*0e209d39SAndroid Build Coastguard Worker * <code>BasicTimeZone</code> is an abstract class extending <code>TimeZone</code>. 34*0e209d39SAndroid Build Coastguard Worker * This class provides some additional methods to access time zone transitions and rules. 35*0e209d39SAndroid Build Coastguard Worker * All ICU <code>TimeZone</code> concrete subclasses extend this class. 36*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 37*0e209d39SAndroid Build Coastguard Worker */ 38*0e209d39SAndroid Build Coastguard Worker class U_I18N_API BasicTimeZone: public TimeZone { 39*0e209d39SAndroid Build Coastguard Worker public: 40*0e209d39SAndroid Build Coastguard Worker /** 41*0e209d39SAndroid Build Coastguard Worker * Destructor. 42*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 43*0e209d39SAndroid Build Coastguard Worker */ 44*0e209d39SAndroid Build Coastguard Worker virtual ~BasicTimeZone(); 45*0e209d39SAndroid Build Coastguard Worker 46*0e209d39SAndroid Build Coastguard Worker /** 47*0e209d39SAndroid Build Coastguard Worker * Clones this object polymorphically. 48*0e209d39SAndroid Build Coastguard Worker * The caller owns the result and should delete it when done. 49*0e209d39SAndroid Build Coastguard Worker * @return clone, or nullptr if an error occurred 50*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 51*0e209d39SAndroid Build Coastguard Worker */ 52*0e209d39SAndroid Build Coastguard Worker virtual BasicTimeZone* clone() const override = 0; 53*0e209d39SAndroid Build Coastguard Worker 54*0e209d39SAndroid Build Coastguard Worker /** 55*0e209d39SAndroid Build Coastguard Worker * Gets the first time zone transition after the base time. 56*0e209d39SAndroid Build Coastguard Worker * @param base The base time. 57*0e209d39SAndroid Build Coastguard Worker * @param inclusive Whether the base time is inclusive or not. 58*0e209d39SAndroid Build Coastguard Worker * @param result Receives the first transition after the base time. 59*0e209d39SAndroid Build Coastguard Worker * @return true if the transition is found. 60*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 61*0e209d39SAndroid Build Coastguard Worker */ 62*0e209d39SAndroid Build Coastguard Worker virtual UBool getNextTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const = 0; 63*0e209d39SAndroid Build Coastguard Worker 64*0e209d39SAndroid Build Coastguard Worker /** 65*0e209d39SAndroid Build Coastguard Worker * Gets the most recent time zone transition before the base time. 66*0e209d39SAndroid Build Coastguard Worker * @param base The base time. 67*0e209d39SAndroid Build Coastguard Worker * @param inclusive Whether the base time is inclusive or not. 68*0e209d39SAndroid Build Coastguard Worker * @param result Receives the most recent transition before the base time. 69*0e209d39SAndroid Build Coastguard Worker * @return true if the transition is found. 70*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 71*0e209d39SAndroid Build Coastguard Worker */ 72*0e209d39SAndroid Build Coastguard Worker virtual UBool getPreviousTransition(UDate base, UBool inclusive, TimeZoneTransition& result) const = 0; 73*0e209d39SAndroid Build Coastguard Worker 74*0e209d39SAndroid Build Coastguard Worker /** 75*0e209d39SAndroid Build Coastguard Worker * Checks if the time zone has equivalent transitions in the time range. 76*0e209d39SAndroid Build Coastguard Worker * This method returns true when all of transition times, from/to standard 77*0e209d39SAndroid Build Coastguard Worker * offsets and DST savings used by this time zone match the other in the 78*0e209d39SAndroid Build Coastguard Worker * time range. 79*0e209d39SAndroid Build Coastguard Worker * @param tz The <code>BasicTimeZone</code> object to be compared with. 80*0e209d39SAndroid Build Coastguard Worker * @param start The start time of the evaluated time range (inclusive) 81*0e209d39SAndroid Build Coastguard Worker * @param end The end time of the evaluated time range (inclusive) 82*0e209d39SAndroid Build Coastguard Worker * @param ignoreDstAmount 83*0e209d39SAndroid Build Coastguard Worker * When true, any transitions with only daylight saving amount 84*0e209d39SAndroid Build Coastguard Worker * changes will be ignored, except either of them is zero. 85*0e209d39SAndroid Build Coastguard Worker * For example, a transition from rawoffset 3:00/dstsavings 1:00 86*0e209d39SAndroid Build Coastguard Worker * to rawoffset 2:00/dstsavings 2:00 is excluded from the comparison, 87*0e209d39SAndroid Build Coastguard Worker * but a transition from rawoffset 2:00/dstsavings 1:00 to 88*0e209d39SAndroid Build Coastguard Worker * rawoffset 3:00/dstsavings 0:00 is included. 89*0e209d39SAndroid Build Coastguard Worker * @param ec Output param to filled in with a success or an error. 90*0e209d39SAndroid Build Coastguard Worker * @return true if the other time zone has the equivalent transitions in the 91*0e209d39SAndroid Build Coastguard Worker * time range. 92*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 93*0e209d39SAndroid Build Coastguard Worker */ 94*0e209d39SAndroid Build Coastguard Worker virtual UBool hasEquivalentTransitions(const BasicTimeZone& tz, UDate start, UDate end, 95*0e209d39SAndroid Build Coastguard Worker UBool ignoreDstAmount, UErrorCode& ec) const; 96*0e209d39SAndroid Build Coastguard Worker 97*0e209d39SAndroid Build Coastguard Worker /** 98*0e209d39SAndroid Build Coastguard Worker * Returns the number of <code>TimeZoneRule</code>s which represents time transitions, 99*0e209d39SAndroid Build Coastguard Worker * for this time zone, that is, all <code>TimeZoneRule</code>s for this time zone except 100*0e209d39SAndroid Build Coastguard Worker * <code>InitialTimeZoneRule</code>. The return value range is 0 or any positive value. 101*0e209d39SAndroid Build Coastguard Worker * @param status Receives error status code. 102*0e209d39SAndroid Build Coastguard Worker * @return The number of <code>TimeZoneRule</code>s representing time transitions. 103*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 104*0e209d39SAndroid Build Coastguard Worker */ 105*0e209d39SAndroid Build Coastguard Worker virtual int32_t countTransitionRules(UErrorCode& status) const = 0; 106*0e209d39SAndroid Build Coastguard Worker 107*0e209d39SAndroid Build Coastguard Worker /** 108*0e209d39SAndroid Build Coastguard Worker * Gets the <code>InitialTimeZoneRule</code> and the set of <code>TimeZoneRule</code> 109*0e209d39SAndroid Build Coastguard Worker * which represent time transitions for this time zone. On successful return, 110*0e209d39SAndroid Build Coastguard Worker * the argument initial points to non-nullptr <code>InitialTimeZoneRule</code> and 111*0e209d39SAndroid Build Coastguard Worker * the array trsrules is filled with 0 or multiple <code>TimeZoneRule</code> 112*0e209d39SAndroid Build Coastguard Worker * instances up to the size specified by trscount. The results are referencing the 113*0e209d39SAndroid Build Coastguard Worker * rule instance held by this time zone instance. Therefore, after this time zone 114*0e209d39SAndroid Build Coastguard Worker * is destructed, they are no longer available. 115*0e209d39SAndroid Build Coastguard Worker * @param initial Receives the initial timezone rule 116*0e209d39SAndroid Build Coastguard Worker * @param trsrules Receives the timezone transition rules 117*0e209d39SAndroid Build Coastguard Worker * @param trscount On input, specify the size of the array 'transitions' receiving 118*0e209d39SAndroid Build Coastguard Worker * the timezone transition rules. On output, actual number of 119*0e209d39SAndroid Build Coastguard Worker * rules filled in the array will be set. 120*0e209d39SAndroid Build Coastguard Worker * @param status Receives error status code. 121*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 122*0e209d39SAndroid Build Coastguard Worker */ 123*0e209d39SAndroid Build Coastguard Worker virtual void getTimeZoneRules(const InitialTimeZoneRule*& initial, 124*0e209d39SAndroid Build Coastguard Worker const TimeZoneRule* trsrules[], int32_t& trscount, UErrorCode& status) const = 0; 125*0e209d39SAndroid Build Coastguard Worker 126*0e209d39SAndroid Build Coastguard Worker /** 127*0e209d39SAndroid Build Coastguard Worker * Gets the set of time zone rules valid at the specified time. Some known external time zone 128*0e209d39SAndroid Build Coastguard Worker * implementations are not capable to handle historic time zone rule changes. Also some 129*0e209d39SAndroid Build Coastguard Worker * implementations can only handle certain type of rule definitions. 130*0e209d39SAndroid Build Coastguard Worker * If this time zone does not use any daylight saving time within about 1 year from the specified 131*0e209d39SAndroid Build Coastguard Worker * time, only the <code>InitialTimeZone</code> is returned. Otherwise, the rule for standard 132*0e209d39SAndroid Build Coastguard Worker * time and daylight saving time transitions are returned in addition to the 133*0e209d39SAndroid Build Coastguard Worker * <code>InitialTimeZoneRule</code>. The standard and daylight saving time transition rules are 134*0e209d39SAndroid Build Coastguard Worker * represented by <code>AnnualTimeZoneRule</code> with <code>DateTimeRule::DOW</code> for its date 135*0e209d39SAndroid Build Coastguard Worker * rule and <code>DateTimeRule::WALL_TIME</code> for its time rule. Because daylight saving time 136*0e209d39SAndroid Build Coastguard Worker * rule is changing time to time in many time zones and also mapping a transition time rule to 137*0e209d39SAndroid Build Coastguard Worker * different type is lossy transformation, the set of rules returned by this method may be valid 138*0e209d39SAndroid Build Coastguard Worker * for short period of time. 139*0e209d39SAndroid Build Coastguard Worker * The time zone rule objects returned by this method is owned by the caller, so the caller is 140*0e209d39SAndroid Build Coastguard Worker * responsible for deleting them after use. 141*0e209d39SAndroid Build Coastguard Worker * @param date The date used for extracting time zone rules. 142*0e209d39SAndroid Build Coastguard Worker * @param initial Receives the <code>InitialTimeZone</code>, always not nullptr. 143*0e209d39SAndroid Build Coastguard Worker * @param std Receives the <code>AnnualTimeZoneRule</code> for standard time transitions. 144*0e209d39SAndroid Build Coastguard Worker * When this time time zone does not observe daylight saving times around the 145*0e209d39SAndroid Build Coastguard Worker * specified date, nullptr is set. 146*0e209d39SAndroid Build Coastguard Worker * @param dst Receives the <code>AnnualTimeZoneRule</code> for daylight saving time 147*0e209d39SAndroid Build Coastguard Worker * transitions. When this time zone does not observer daylight saving times 148*0e209d39SAndroid Build Coastguard Worker * around the specified date, nullptr is set. 149*0e209d39SAndroid Build Coastguard Worker * @param status Receives error status code. 150*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 151*0e209d39SAndroid Build Coastguard Worker */ 152*0e209d39SAndroid Build Coastguard Worker virtual void getSimpleRulesNear(UDate date, InitialTimeZoneRule*& initial, 153*0e209d39SAndroid Build Coastguard Worker AnnualTimeZoneRule*& std, AnnualTimeZoneRule*& dst, UErrorCode& status) const; 154*0e209d39SAndroid Build Coastguard Worker 155*0e209d39SAndroid Build Coastguard Worker /** 156*0e209d39SAndroid Build Coastguard Worker * Get time zone offsets from local wall time. 157*0e209d39SAndroid Build Coastguard Worker * @stable ICU 69 158*0e209d39SAndroid Build Coastguard Worker */ 159*0e209d39SAndroid Build Coastguard Worker virtual void getOffsetFromLocal( 160*0e209d39SAndroid Build Coastguard Worker UDate date, UTimeZoneLocalOption nonExistingTimeOpt, 161*0e209d39SAndroid Build Coastguard Worker UTimeZoneLocalOption duplicatedTimeOpt, int32_t& rawOffset, 162*0e209d39SAndroid Build Coastguard Worker int32_t& dstOffset, UErrorCode& status) const; 163*0e209d39SAndroid Build Coastguard Worker 164*0e209d39SAndroid Build Coastguard Worker 165*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API 166*0e209d39SAndroid Build Coastguard Worker /** 167*0e209d39SAndroid Build Coastguard Worker * The time type option bit flags used by getOffsetFromLocal 168*0e209d39SAndroid Build Coastguard Worker * @internal 169*0e209d39SAndroid Build Coastguard Worker */ 170*0e209d39SAndroid Build Coastguard Worker enum { 171*0e209d39SAndroid Build Coastguard Worker kStandard = 0x01, 172*0e209d39SAndroid Build Coastguard Worker kDaylight = 0x03, 173*0e209d39SAndroid Build Coastguard Worker kFormer = 0x04, /* UCAL_TZ_LOCAL_FORMER */ 174*0e209d39SAndroid Build Coastguard Worker kLatter = 0x0C /* UCAL_TZ_LOCAL_LATTER */ 175*0e209d39SAndroid Build Coastguard Worker }; 176*0e209d39SAndroid Build Coastguard Worker 177*0e209d39SAndroid Build Coastguard Worker /** 178*0e209d39SAndroid Build Coastguard Worker * Get time zone offsets from local wall time. 179*0e209d39SAndroid Build Coastguard Worker * @internal 180*0e209d39SAndroid Build Coastguard Worker */ 181*0e209d39SAndroid Build Coastguard Worker void getOffsetFromLocal(UDate date, int32_t nonExistingTimeOpt, int32_t duplicatedTimeOpt, 182*0e209d39SAndroid Build Coastguard Worker int32_t& rawOffset, int32_t& dstOffset, UErrorCode& status) const; 183*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_INTERNAL_API */ 184*0e209d39SAndroid Build Coastguard Worker 185*0e209d39SAndroid Build Coastguard Worker protected: 186*0e209d39SAndroid Build Coastguard Worker 187*0e209d39SAndroid Build Coastguard Worker #ifndef U_HIDE_INTERNAL_API 188*0e209d39SAndroid Build Coastguard Worker /** 189*0e209d39SAndroid Build Coastguard Worker * A time type option bit mask used by getOffsetFromLocal. 190*0e209d39SAndroid Build Coastguard Worker * @internal 191*0e209d39SAndroid Build Coastguard Worker */ 192*0e209d39SAndroid Build Coastguard Worker static constexpr int32_t kStdDstMask = kDaylight; 193*0e209d39SAndroid Build Coastguard Worker /** 194*0e209d39SAndroid Build Coastguard Worker * A time type option bit mask used by getOffsetFromLocal. 195*0e209d39SAndroid Build Coastguard Worker * @internal 196*0e209d39SAndroid Build Coastguard Worker */ 197*0e209d39SAndroid Build Coastguard Worker static constexpr int32_t kFormerLatterMask = kLatter; 198*0e209d39SAndroid Build Coastguard Worker #endif /* U_HIDE_INTERNAL_API */ 199*0e209d39SAndroid Build Coastguard Worker 200*0e209d39SAndroid Build Coastguard Worker /** 201*0e209d39SAndroid Build Coastguard Worker * Default constructor. 202*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 203*0e209d39SAndroid Build Coastguard Worker */ 204*0e209d39SAndroid Build Coastguard Worker BasicTimeZone(); 205*0e209d39SAndroid Build Coastguard Worker 206*0e209d39SAndroid Build Coastguard Worker /** 207*0e209d39SAndroid Build Coastguard Worker * Construct a timezone with a given ID. 208*0e209d39SAndroid Build Coastguard Worker * @param id a system time zone ID 209*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 210*0e209d39SAndroid Build Coastguard Worker */ 211*0e209d39SAndroid Build Coastguard Worker BasicTimeZone(const UnicodeString &id); 212*0e209d39SAndroid Build Coastguard Worker 213*0e209d39SAndroid Build Coastguard Worker /** 214*0e209d39SAndroid Build Coastguard Worker * Copy constructor. 215*0e209d39SAndroid Build Coastguard Worker * @param source the object to be copied. 216*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 217*0e209d39SAndroid Build Coastguard Worker */ 218*0e209d39SAndroid Build Coastguard Worker BasicTimeZone(const BasicTimeZone& source); 219*0e209d39SAndroid Build Coastguard Worker 220*0e209d39SAndroid Build Coastguard Worker /** 221*0e209d39SAndroid Build Coastguard Worker * Copy assignment. 222*0e209d39SAndroid Build Coastguard Worker * @stable ICU 3.8 223*0e209d39SAndroid Build Coastguard Worker */ 224*0e209d39SAndroid Build Coastguard Worker BasicTimeZone& operator=(const BasicTimeZone&) = default; 225*0e209d39SAndroid Build Coastguard Worker 226*0e209d39SAndroid Build Coastguard Worker /** 227*0e209d39SAndroid Build Coastguard Worker * Gets the set of TimeZoneRule instances applicable to the specified time and after. 228*0e209d39SAndroid Build Coastguard Worker * @param start The start date used for extracting time zone rules 229*0e209d39SAndroid Build Coastguard Worker * @param initial Output parameter, receives the InitialTimeZone. 230*0e209d39SAndroid Build Coastguard Worker * Always not nullptr (except in case of error) 231*0e209d39SAndroid Build Coastguard Worker * @param transitionRules Output parameter, a UVector of transition rules. 232*0e209d39SAndroid Build Coastguard Worker * May be nullptr, if there are no transition rules. 233*0e209d39SAndroid Build Coastguard Worker * The caller owns the returned vector; the UVector owns the rules. 234*0e209d39SAndroid Build Coastguard Worker * @param status Receives error status code 235*0e209d39SAndroid Build Coastguard Worker */ 236*0e209d39SAndroid Build Coastguard Worker void getTimeZoneRulesAfter(UDate start, InitialTimeZoneRule*& initial, UVector*& transitionRules, 237*0e209d39SAndroid Build Coastguard Worker UErrorCode& status) const; 238*0e209d39SAndroid Build Coastguard Worker }; 239*0e209d39SAndroid Build Coastguard Worker 240*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 241*0e209d39SAndroid Build Coastguard Worker 242*0e209d39SAndroid Build Coastguard Worker #endif /* #if !UCONFIG_NO_FORMATTING */ 243*0e209d39SAndroid Build Coastguard Worker 244*0e209d39SAndroid Build Coastguard Worker #endif /* U_SHOW_CPLUSPLUS_API */ 245*0e209d39SAndroid Build Coastguard Worker 246*0e209d39SAndroid Build Coastguard Worker #endif // BASICTZ_H 247*0e209d39SAndroid Build Coastguard Worker 248*0e209d39SAndroid Build Coastguard Worker //eof 249