xref: /aosp_15_r20/external/icu/libicu/cts_headers/unicode/basictz.h (revision 0e209d3975ff4a8c132096b14b0e9364a753506e)
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