Home | History | Annotate | Download | only in unicode
      1 /*
      2 *******************************************************************************
      3 * Copyright (C) 2007-2008, International Business Machines Corporation and    *
      4 * others. All Rights Reserved.                                                *
      5 *******************************************************************************
      6 */
      7 #ifndef TZRULE_H
      8 #define TZRULE_H
      9 
     10 /**
     11  * \file
     12  * \brief C++ API: Time zone rule classes
     13  */
     14 
     15 #include "unicode/utypes.h"
     16 
     17 #if !UCONFIG_NO_FORMATTING
     18 
     19 #include "unicode/uobject.h"
     20 #include "unicode/unistr.h"
     21 #include "unicode/dtrule.h"
     22 
     23 U_NAMESPACE_BEGIN
     24 
     25 /**
     26  * <code>TimeZoneRule</code> is a class representing a rule for time zone.
     27  * <code>TimeZoneRule</code> has a set of time zone attributes, such as zone name,
     28  * raw offset (UTC offset for standard time) and daylight saving time offset.
     29  *
     30  * @stable ICU 3.8
     31  */
     32 class U_I18N_API TimeZoneRule : public UObject {
     33 public:
     34     /**
     35      * Destructor.
     36      * @stable ICU 3.8
     37      */
     38     virtual ~TimeZoneRule();
     39 
     40     /**
     41      * Clone this TimeZoneRule object polymorphically. The caller owns the result and
     42      * should delete it when done.
     43      * @return  A copy of the object.
     44      * @stable ICU 3.8
     45      */
     46     virtual TimeZoneRule* clone(void) const = 0;
     47 
     48     /**
     49      * Return true if the given <code>TimeZoneRule</code> objects are semantically equal. Objects
     50      * of different subclasses are considered unequal.
     51      * @param that  The object to be compared with.
     52      * @return  true if the given <code>TimeZoneRule</code> objects are semantically equal.
     53      * @stable ICU 3.8
     54      */
     55     virtual UBool operator==(const TimeZoneRule& that) const;
     56 
     57     /**
     58      * Return true if the given <code>TimeZoneRule</code> objects are semantically unequal. Objects
     59      * of different subclasses are considered unequal.
     60      * @param that  The object to be compared with.
     61      * @return  true if the given <code>TimeZoneRule</code> objects are semantically unequal.
     62      * @stable ICU 3.8
     63      */
     64     virtual UBool operator!=(const TimeZoneRule& that) const;
     65 
     66     /**
     67      * Fills in "name" with the name of this time zone.
     68      * @param name  Receives the name of this time zone.
     69      * @return  A reference to "name"
     70      * @stable ICU 3.8
     71      */
     72     UnicodeString& getName(UnicodeString& name) const;
     73 
     74     /**
     75      * Gets the standard time offset.
     76      * @return  The standard time offset from UTC in milliseconds.
     77      * @stable ICU 3.8
     78      */
     79     int32_t getRawOffset(void) const;
     80 
     81     /**
     82      * Gets the amount of daylight saving delta time from the standard time.
     83      * @return  The amount of daylight saving offset used by this rule
     84      *          in milliseconds.
     85      * @stable ICU 3.8
     86      */
     87     int32_t getDSTSavings(void) const;
     88 
     89     /**
     90      * Returns if this rule represents the same rule and offsets as another.
     91      * When two <code>TimeZoneRule</code> objects differ only its names, this method
     92      * returns true.
     93      * @param other The <code>TimeZoneRule</code> object to be compared with.
     94      * @return  true if the other <code>TimeZoneRule</code> is the same as this one.
     95      * @stable ICU 3.8
     96      */
     97     virtual UBool isEquivalentTo(const TimeZoneRule& other) const;
     98 
     99     /**
    100      * Gets the very first time when this rule takes effect.
    101      * @param prevRawOffset     The standard time offset from UTC before this rule
    102      *                          takes effect in milliseconds.
    103      * @param prevDSTSavings    The amount of daylight saving offset from the
    104      *                          standard time.
    105      * @param result            Receives the very first time when this rule takes effect.
    106      * @return  true if the start time is available.  When false is returned, output parameter
    107      *          "result" is unchanged.
    108      * @stable ICU 3.8
    109      */
    110     virtual UBool getFirstStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const = 0;
    111 
    112     /**
    113      * Gets the final time when this rule takes effect.
    114      * @param prevRawOffset     The standard time offset from UTC before this rule
    115      *                          takes effect in milliseconds.
    116      * @param prevDSTSavings    The amount of daylight saving offset from the
    117      *                          standard time.
    118      * @param result            Receives the final time when this rule takes effect.
    119      * @return  true if the start time is available.  When false is returned, output parameter
    120      *          "result" is unchanged.
    121      * @stable ICU 3.8
    122      */
    123     virtual UBool getFinalStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const = 0;
    124 
    125     /**
    126      * Gets the first time when this rule takes effect after the specified time.
    127      * @param base              The first start time after this base time will be returned.
    128      * @param prevRawOffset     The standard time offset from UTC before this rule
    129      *                          takes effect in milliseconds.
    130      * @param prevDSTSavings    The amount of daylight saving offset from the
    131      *                          standard time.
    132      * @param inclusive         Whether the base time is inclusive or not.
    133      * @param result            Receives The first time when this rule takes effect after
    134      *                          the specified base time.
    135      * @return  true if the start time is available.  When false is returned, output parameter
    136      *          "result" is unchanged.
    137      * @stable ICU 3.8
    138      */
    139     virtual UBool getNextStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    140         UBool inclusive, UDate& result) const = 0;
    141 
    142     /**
    143      * Gets the most recent time when this rule takes effect before the specified time.
    144      * @param base              The most recent time before this base time will be returned.
    145      * @param prevRawOffset     The standard time offset from UTC before this rule
    146      *                          takes effect in milliseconds.
    147      * @param prevDSTSavings    The amount of daylight saving offset from the
    148      *                          standard time.
    149      * @param inclusive         Whether the base time is inclusive or not.
    150      * @param result            Receives The most recent time when this rule takes effect before
    151      *                          the specified base time.
    152      * @return  true if the start time is available.  When false is returned, output parameter
    153      *          "result" is unchanged.
    154      * @stable ICU 3.8
    155      */
    156     virtual UBool getPreviousStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    157         UBool inclusive, UDate& result) const = 0;
    158 
    159 protected:
    160 
    161     /**
    162      * Constructs a <code>TimeZoneRule</code> with the name, the GMT offset of its
    163      * standard time and the amount of daylight saving offset adjustment.
    164      * @param name          The time zone name.
    165      * @param rawOffset     The UTC offset of its standard time in milliseconds.
    166      * @param dstSavings    The amount of daylight saving offset adjustment in milliseconds.
    167      *                      If this ia a rule for standard time, the value of this argument is 0.
    168      * @stable ICU 3.8
    169      */
    170     TimeZoneRule(const UnicodeString& name, int32_t rawOffset, int32_t dstSavings);
    171 
    172     /**
    173      * Copy constructor.
    174      * @param source    The TimeZoneRule object to be copied.
    175      * @stable ICU 3.8
    176      */
    177     TimeZoneRule(const TimeZoneRule& source);
    178 
    179     /**
    180      * Assignment operator.
    181      * @param right The object to be copied.
    182      * @stable ICU 3.8
    183      */
    184     TimeZoneRule& operator=(const TimeZoneRule& right);
    185 
    186 private:
    187     UnicodeString fName; // time name
    188     int32_t fRawOffset;  // UTC offset of the standard time in milliseconds
    189     int32_t fDSTSavings; // DST saving amount in milliseconds
    190 };
    191 
    192 /**
    193  * <code>InitialTimeZoneRule</code> represents a time zone rule
    194  * representing a time zone effective from the beginning and
    195  * has no actual start times.
    196  * @stable ICU 3.8
    197  */
    198 class U_I18N_API InitialTimeZoneRule : public TimeZoneRule {
    199 public:
    200     /**
    201      * Constructs an <code>InitialTimeZoneRule</code> with the name, the GMT offset of its
    202      * standard time and the amount of daylight saving offset adjustment.
    203      * @param name          The time zone name.
    204      * @param rawOffset     The UTC offset of its standard time in milliseconds.
    205      * @param dstSavings    The amount of daylight saving offset adjustment in milliseconds.
    206      *                      If this ia a rule for standard time, the value of this argument is 0.
    207      * @stable ICU 3.8
    208      */
    209     InitialTimeZoneRule(const UnicodeString& name, int32_t rawOffset, int32_t dstSavings);
    210 
    211     /**
    212      * Copy constructor.
    213      * @param source    The InitialTimeZoneRule object to be copied.
    214      * @stable ICU 3.8
    215      */
    216     InitialTimeZoneRule(const InitialTimeZoneRule& source);
    217 
    218     /**
    219      * Destructor.
    220      * @stable ICU 3.8
    221      */
    222     virtual ~InitialTimeZoneRule();
    223 
    224     /**
    225      * Clone this InitialTimeZoneRule object polymorphically. The caller owns the result and
    226      * should delete it when done.
    227      * @return    A copy of the object.
    228      * @stable ICU 3.8
    229      */
    230     virtual InitialTimeZoneRule* clone(void) const;
    231 
    232     /**
    233      * Assignment operator.
    234      * @param right The object to be copied.
    235      * @stable ICU 3.8
    236      */
    237     InitialTimeZoneRule& operator=(const InitialTimeZoneRule& right);
    238 
    239     /**
    240      * Return true if the given <code>TimeZoneRule</code> objects are semantically equal. Objects
    241      * of different subclasses are considered unequal.
    242      * @param that  The object to be compared with.
    243      * @return  true if the given <code>TimeZoneRule</code> objects are semantically equal.
    244      * @stable ICU 3.8
    245      */
    246     virtual UBool operator==(const TimeZoneRule& that) const;
    247 
    248     /**
    249      * Return true if the given <code>TimeZoneRule</code> objects are semantically unequal. Objects
    250      * of different subclasses are considered unequal.
    251      * @param that  The object to be compared with.
    252      * @return  true if the given <code>TimeZoneRule</code> objects are semantically unequal.
    253      * @stable ICU 3.8
    254      */
    255     virtual UBool operator!=(const TimeZoneRule& that) const;
    256 
    257     /**
    258      * Gets the time when this rule takes effect in the given year.
    259      * @param year              The Gregorian year, with 0 == 1 BCE, -1 == 2 BCE, etc.
    260      * @param prevRawOffset     The standard time offset from UTC before this rule
    261      *                          takes effect in milliseconds.
    262      * @param prevDSTSavings    The amount of daylight saving offset from the
    263      *                          standard time.
    264      * @param result            Receives the start time in the year.
    265      * @return  true if this rule takes effect in the year and the result is set to
    266      *          "result".
    267      * @stable ICU 3.8
    268      */
    269     UBool getStartInYear(int32_t year, int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    270 
    271     /**
    272      * Returns if this rule represents the same rule and offsets as another.
    273      * When two <code>TimeZoneRule</code> objects differ only its names, this method
    274      * returns true.
    275      * @param that  The <code>TimeZoneRule</code> object to be compared with.
    276      * @return  true if the other <code>TimeZoneRule</code> is equivalent to this one.
    277      * @stable ICU 3.8
    278      */
    279     virtual UBool isEquivalentTo(const TimeZoneRule& that) const;
    280 
    281     /**
    282      * Gets the very first time when this rule takes effect.
    283      * @param prevRawOffset     The standard time offset from UTC before this rule
    284      *                          takes effect in milliseconds.
    285      * @param prevDSTSavings    The amount of daylight saving offset from the
    286      *                          standard time.
    287      * @param result            Receives the very first time when this rule takes effect.
    288      * @return  true if the start time is available.  When false is returned, output parameter
    289      *          "result" is unchanged.
    290      * @stable ICU 3.8
    291      */
    292     virtual UBool getFirstStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    293 
    294     /**
    295      * Gets the final time when this rule takes effect.
    296      * @param prevRawOffset     The standard time offset from UTC before this rule
    297      *                          takes effect in milliseconds.
    298      * @param prevDSTSavings    The amount of daylight saving offset from the
    299      *                          standard time.
    300      * @param result            Receives the final time when this rule takes effect.
    301      * @return  true if the start time is available.  When false is returned, output parameter
    302      *          "result" is unchanged.
    303      * @stable ICU 3.8
    304      */
    305     virtual UBool getFinalStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    306 
    307     /**
    308      * Gets the first time when this rule takes effect after the specified time.
    309      * @param base              The first start time after this base time will be returned.
    310      * @param prevRawOffset     The standard time offset from UTC before this rule
    311      *                          takes effect in milliseconds.
    312      * @param prevDSTSavings    The amount of daylight saving offset from the
    313      *                          standard time.
    314      * @param inclusive         Whether the base time is inclusive or not.
    315      * @param result            Receives The first time when this rule takes effect after
    316      *                          the specified base time.
    317      * @return  true if the start time is available.  When false is returned, output parameter
    318      *          "result" is unchanged.
    319      * @stable ICU 3.8
    320      */
    321     virtual UBool getNextStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    322         UBool inclusive, UDate& result) const;
    323 
    324     /**
    325      * Gets the most recent time when this rule takes effect before the specified time.
    326      * @param base              The most recent time before this base time will be returned.
    327      * @param prevRawOffset     The standard time offset from UTC before this rule
    328      *                          takes effect in milliseconds.
    329      * @param prevDSTSavings    The amount of daylight saving offset from the
    330      *                          standard time.
    331      * @param inclusive         Whether the base time is inclusive or not.
    332      * @param result            Receives The most recent time when this rule takes effect before
    333      *                          the specified base time.
    334      * @return  true if the start time is available.  When false is returned, output parameter
    335      *          "result" is unchanged.
    336      * @stable ICU 3.8
    337      */
    338     virtual UBool getPreviousStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    339         UBool inclusive, UDate& result) const;
    340 
    341 public:
    342     /**
    343      * Return the class ID for this class. This is useful only for comparing to
    344      * a return value from getDynamicClassID(). For example:
    345      * <pre>
    346      * .   Base* polymorphic_pointer = createPolymorphicObject();
    347      * .   if (polymorphic_pointer->getDynamicClassID() ==
    348      * .       erived::getStaticClassID()) ...
    349      * </pre>
    350      * @return          The class ID for all objects of this class.
    351      * @stable ICU 3.8
    352      */
    353     static UClassID U_EXPORT2 getStaticClassID(void);
    354 
    355     /**
    356      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
    357      * method is to implement a simple version of RTTI, since not all C++
    358      * compilers support genuine RTTI. Polymorphic operator==() and clone()
    359      * methods call this method.
    360      *
    361      * @return          The class ID for this object. All objects of a
    362      *                  given class have the same class ID.  Objects of
    363      *                  other classes have different class IDs.
    364      * @stable ICU 3.8
    365      */
    366     virtual UClassID getDynamicClassID(void) const;
    367 };
    368 
    369 /**
    370  * <code>AnnualTimeZoneRule</code> is a class used for representing a time zone
    371  * rule which takes effect annually.  The calenday system used for the rule is
    372  * is based on Gregorian calendar
    373  *
    374  * @stable ICU 3.8
    375  */
    376 class U_I18N_API AnnualTimeZoneRule : public TimeZoneRule {
    377 public:
    378     /**
    379      * The constant representing the maximum year used for designating
    380      * a rule is permanent.
    381      */
    382     static const int32_t MAX_YEAR;
    383 
    384     /**
    385      * Constructs a <code>AnnualTimeZoneRule</code> with the name, the GMT offset of its
    386      * standard time, the amount of daylight saving offset adjustment, the annual start
    387      * time rule and the start/until years.  The input DateTimeRule is copied by this
    388      * constructor, so the caller remains responsible for deleting the object.
    389      * @param name          The time zone name.
    390      * @param rawOffset     The GMT offset of its standard time in milliseconds.
    391      * @param dstSavings    The amount of daylight saving offset adjustment in
    392      *                      milliseconds.  If this ia a rule for standard time,
    393      *                      the value of this argument is 0.
    394      * @param dateTimeRule  The start date/time rule repeated annually.
    395      * @param startYear     The first year when this rule takes effect.
    396      * @param endYear       The last year when this rule takes effect.  If this
    397      *                      rule is effective forever in future, specify MAX_YEAR.
    398      * @stable ICU 3.8
    399      */
    400     AnnualTimeZoneRule(const UnicodeString& name, int32_t rawOffset, int32_t dstSavings,
    401             const DateTimeRule& dateTimeRule, int32_t startYear, int32_t endYear);
    402 
    403     /**
    404      * Constructs a <code>AnnualTimeZoneRule</code> with the name, the GMT offset of its
    405      * standard time, the amount of daylight saving offset adjustment, the annual start
    406      * time rule and the start/until years.  The input DateTimeRule object is adopted
    407      * by this object, therefore, the caller must not delete the object.
    408      * @param name          The time zone name.
    409      * @param rawOffset     The GMT offset of its standard time in milliseconds.
    410      * @param dstSavings    The amount of daylight saving offset adjustment in
    411      *                      milliseconds.  If this ia a rule for standard time,
    412      *                      the value of this argument is 0.
    413      * @param dateTimeRule  The start date/time rule repeated annually.
    414      * @param startYear     The first year when this rule takes effect.
    415      * @param endYear       The last year when this rule takes effect.  If this
    416      *                      rule is effective forever in future, specify MAX_YEAR.
    417      * @stable ICU 3.8
    418      */
    419     AnnualTimeZoneRule(const UnicodeString& name, int32_t rawOffset, int32_t dstSavings,
    420             DateTimeRule* dateTimeRule, int32_t startYear, int32_t endYear);
    421 
    422     /**
    423      * Copy constructor.
    424      * @param source    The AnnualTimeZoneRule object to be copied.
    425      * @stable ICU 3.8
    426      */
    427     AnnualTimeZoneRule(const AnnualTimeZoneRule& source);
    428 
    429     /**
    430      * Destructor.
    431      * @stable ICU 3.8
    432      */
    433     virtual ~AnnualTimeZoneRule();
    434 
    435     /**
    436      * Clone this AnnualTimeZoneRule object polymorphically. The caller owns the result and
    437      * should delete it when done.
    438      * @return    A copy of the object.
    439      * @stable ICU 3.8
    440      */
    441     virtual AnnualTimeZoneRule* clone(void) const;
    442 
    443     /**
    444      * Assignment operator.
    445      * @param right The object to be copied.
    446      * @stable ICU 3.8
    447      */
    448     AnnualTimeZoneRule& operator=(const AnnualTimeZoneRule& right);
    449 
    450     /**
    451      * Return true if the given <code>TimeZoneRule</code> objects are semantically equal. Objects
    452      * of different subclasses are considered unequal.
    453      * @param that  The object to be compared with.
    454      * @return  true if the given <code>TimeZoneRule</code> objects are semantically equal.
    455      * @stable ICU 3.8
    456      */
    457     virtual UBool operator==(const TimeZoneRule& that) const;
    458 
    459     /**
    460      * Return true if the given <code>TimeZoneRule</code> objects are semantically unequal. Objects
    461      * of different subclasses are considered unequal.
    462      * @param that  The object to be compared with.
    463      * @return  true if the given <code>TimeZoneRule</code> objects are semantically unequal.
    464      * @stable ICU 3.8
    465      */
    466     virtual UBool operator!=(const TimeZoneRule& that) const;
    467 
    468     /**
    469      * Gets the start date/time rule used by this rule.
    470      * @return  The <code>AnnualDateTimeRule</code> which represents the start date/time
    471      *          rule used by this time zone rule.
    472      * @stable ICU 3.8
    473      */
    474     const DateTimeRule* getRule(void) const;
    475 
    476     /**
    477      * Gets the first year when this rule takes effect.
    478      * @return  The start year of this rule.  The year is in Gregorian calendar
    479      *          with 0 == 1 BCE, -1 == 2 BCE, etc.
    480      * @stable ICU 3.8
    481      */
    482     int32_t getStartYear(void) const;
    483 
    484     /**
    485      * Gets the end year when this rule takes effect.
    486      * @return  The end year of this rule (inclusive). The year is in Gregorian calendar
    487      *          with 0 == 1 BCE, -1 == 2 BCE, etc.
    488      * @stable ICU 3.8
    489      */
    490     int32_t getEndYear(void) const;
    491 
    492     /**
    493      * Gets the time when this rule takes effect in the given year.
    494      * @param year              The Gregorian year, with 0 == 1 BCE, -1 == 2 BCE, etc.
    495      * @param prevRawOffset     The standard time offset from UTC before this rule
    496      *                          takes effect in milliseconds.
    497      * @param prevDSTSavings    The amount of daylight saving offset from the
    498      *                          standard time.
    499      * @param result            Receives the start time in the year.
    500      * @return  true if this rule takes effect in the year and the result is set to
    501      *          "result".
    502      * @stable ICU 3.8
    503      */
    504     UBool getStartInYear(int32_t year, int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    505 
    506     /**
    507      * Returns if this rule represents the same rule and offsets as another.
    508      * When two <code>TimeZoneRule</code> objects differ only its names, this method
    509      * returns true.
    510      * @param that  The <code>TimeZoneRule</code> object to be compared with.
    511      * @return  true if the other <code>TimeZoneRule</code> is equivalent to this one.
    512      * @stable ICU 3.8
    513      */
    514     virtual UBool isEquivalentTo(const TimeZoneRule& that) const;
    515 
    516     /**
    517      * Gets the very first time when this rule takes effect.
    518      * @param prevRawOffset     The standard time offset from UTC before this rule
    519      *                          takes effect in milliseconds.
    520      * @param prevDSTSavings    The amount of daylight saving offset from the
    521      *                          standard time.
    522      * @param result            Receives the very first time when this rule takes effect.
    523      * @return  true if the start time is available.  When false is returned, output parameter
    524      *          "result" is unchanged.
    525      * @stable ICU 3.8
    526      */
    527     virtual UBool getFirstStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    528 
    529     /**
    530      * Gets the final time when this rule takes effect.
    531      * @param prevRawOffset     The standard time offset from UTC before this rule
    532      *                          takes effect in milliseconds.
    533      * @param prevDSTSavings    The amount of daylight saving offset from the
    534      *                          standard time.
    535      * @param result            Receives the final time when this rule takes effect.
    536      * @return  true if the start time is available.  When false is returned, output parameter
    537      *          "result" is unchanged.
    538      * @stable ICU 3.8
    539      */
    540     virtual UBool getFinalStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    541 
    542     /**
    543      * Gets the first time when this rule takes effect after the specified time.
    544      * @param base              The first start time after this base time will be returned.
    545      * @param prevRawOffset     The standard time offset from UTC before this rule
    546      *                          takes effect in milliseconds.
    547      * @param prevDSTSavings    The amount of daylight saving offset from the
    548      *                          standard time.
    549      * @param inclusive         Whether the base time is inclusive or not.
    550      * @param result            Receives The first time when this rule takes effect after
    551      *                          the specified base time.
    552      * @return  true if the start time is available.  When false is returned, output parameter
    553      *          "result" is unchanged.
    554      * @stable ICU 3.8
    555      */
    556     virtual UBool getNextStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    557         UBool inclusive, UDate& result) const;
    558 
    559     /**
    560      * Gets the most recent time when this rule takes effect before the specified time.
    561      * @param base              The most recent time before this base time will be returned.
    562      * @param prevRawOffset     The standard time offset from UTC before this rule
    563      *                          takes effect in milliseconds.
    564      * @param prevDSTSavings    The amount of daylight saving offset from the
    565      *                          standard time.
    566      * @param inclusive         Whether the base time is inclusive or not.
    567      * @param result            Receives The most recent time when this rule takes effect before
    568      *                          the specified base time.
    569      * @return  true if the start time is available.  When false is returned, output parameter
    570      *          "result" is unchanged.
    571      * @stable ICU 3.8
    572      */
    573     virtual UBool getPreviousStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    574         UBool inclusive, UDate& result) const;
    575 
    576 
    577 private:
    578     DateTimeRule* fDateTimeRule;
    579     int32_t fStartYear;
    580     int32_t fEndYear;
    581 
    582 public:
    583     /**
    584      * Return the class ID for this class. This is useful only for comparing to
    585      * a return value from getDynamicClassID(). For example:
    586      * <pre>
    587      * .   Base* polymorphic_pointer = createPolymorphicObject();
    588      * .   if (polymorphic_pointer->getDynamicClassID() ==
    589      * .       erived::getStaticClassID()) ...
    590      * </pre>
    591      * @return          The class ID for all objects of this class.
    592      * @stable ICU 3.8
    593      */
    594     static UClassID U_EXPORT2 getStaticClassID(void);
    595 
    596     /**
    597      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
    598      * method is to implement a simple version of RTTI, since not all C++
    599      * compilers support genuine RTTI. Polymorphic operator==() and clone()
    600      * methods call this method.
    601      *
    602      * @return          The class ID for this object. All objects of a
    603      *                  given class have the same class ID.  Objects of
    604      *                  other classes have different class IDs.
    605      * @stable ICU 3.8
    606      */
    607     virtual UClassID getDynamicClassID(void) const;
    608 };
    609 
    610 /**
    611  * <code>TimeArrayTimeZoneRule</code> represents a time zone rule whose start times are
    612  * defined by an array of milliseconds since the standard base time.
    613  *
    614  * @stable ICU 3.8
    615  */
    616 class U_I18N_API TimeArrayTimeZoneRule : public TimeZoneRule {
    617 public:
    618     /**
    619      * Constructs a <code>TimeArrayTimeZoneRule</code> with the name, the GMT offset of its
    620      * standard time, the amount of daylight saving offset adjustment and
    621      * the array of times when this rule takes effect.
    622      * @param name          The time zone name.
    623      * @param rawOffset     The UTC offset of its standard time in milliseconds.
    624      * @param dstSavings    The amount of daylight saving offset adjustment in
    625      *                      milliseconds.  If this ia a rule for standard time,
    626      *                      the value of this argument is 0.
    627      * @param startTimes    The array start times in milliseconds since the base time
    628      *                      (January 1, 1970, 00:00:00).
    629      * @param numStartTimes The number of elements in the parameter "startTimes"
    630      * @param timeRuleType  The time type of the start times, which is one of
    631      *                      <code>DataTimeRule::WALL_TIME</code>, <code>STANDARD_TIME</code>
    632      *                      and <code>UTC_TIME</code>.
    633      * @stable ICU 3.8
    634      */
    635     TimeArrayTimeZoneRule(const UnicodeString& name, int32_t rawOffset, int32_t dstSavings,
    636         const UDate* startTimes, int32_t numStartTimes, DateTimeRule::TimeRuleType timeRuleType);
    637 
    638     /**
    639      * Copy constructor.
    640      * @param source    The TimeArrayTimeZoneRule object to be copied.
    641      * @stable ICU 3.8
    642      */
    643     TimeArrayTimeZoneRule(const TimeArrayTimeZoneRule& source);
    644 
    645     /**
    646      * Destructor.
    647      * @stable ICU 3.8
    648      */
    649     virtual ~TimeArrayTimeZoneRule();
    650 
    651     /**
    652      * Clone this TimeArrayTimeZoneRule object polymorphically. The caller owns the result and
    653      * should delete it when done.
    654      * @return    A copy of the object.
    655      * @stable ICU 3.8
    656      */
    657     virtual TimeArrayTimeZoneRule* clone(void) const;
    658 
    659     /**
    660      * Assignment operator.
    661      * @param right The object to be copied.
    662      * @stable ICU 3.8
    663      */
    664     TimeArrayTimeZoneRule& operator=(const TimeArrayTimeZoneRule& right);
    665 
    666     /**
    667      * Return true if the given <code>TimeZoneRule</code> objects are semantically equal. Objects
    668      * of different subclasses are considered unequal.
    669      * @param that  The object to be compared with.
    670      * @return  true if the given <code>TimeZoneRule</code> objects are semantically equal.
    671      * @stable ICU 3.8
    672      */
    673     virtual UBool operator==(const TimeZoneRule& that) const;
    674 
    675     /**
    676      * Return true if the given <code>TimeZoneRule</code> objects are semantically unequal. Objects
    677      * of different subclasses are considered unequal.
    678      * @param that  The object to be compared with.
    679      * @return  true if the given <code>TimeZoneRule</code> objects are semantically unequal.
    680      * @stable ICU 3.8
    681      */
    682     virtual UBool operator!=(const TimeZoneRule& that) const;
    683 
    684     /**
    685      * Gets the time type of the start times used by this rule.  The return value
    686      * is either <code>DateTimeRule::WALL_TIME</code> or <code>STANDARD_TIME</code>
    687      * or <code>UTC_TIME</code>.
    688      *
    689      * @return The time type used of the start times used by this rule.
    690      * @stable ICU 3.8
    691      */
    692     DateTimeRule::TimeRuleType getTimeType(void) const;
    693 
    694     /**
    695      * Gets a start time at the index stored in this rule.
    696      * @param index     The index of start times
    697      * @param result    Receives the start time at the index
    698      * @return  true if the index is within the valid range and
    699      *          and the result is set.  When false, the output
    700      *          parameger "result" is unchanged.
    701      * @stable ICU 3.8
    702      */
    703     UBool getStartTimeAt(int32_t index, UDate& result) const;
    704 
    705     /**
    706      * Returns the number of start times stored in this rule
    707      * @return The number of start times.
    708      * @stable ICU 3.8
    709      */
    710     int32_t countStartTimes(void) const;
    711 
    712     /**
    713      * Returns if this rule represents the same rule and offsets as another.
    714      * When two <code>TimeZoneRule</code> objects differ only its names, this method
    715      * returns true.
    716      * @param that  The <code>TimeZoneRule</code> object to be compared with.
    717      * @return  true if the other <code>TimeZoneRule</code> is equivalent to this one.
    718      * @stable ICU 3.8
    719      */
    720     virtual UBool isEquivalentTo(const TimeZoneRule& that) const;
    721 
    722     /**
    723      * Gets the very first time when this rule takes effect.
    724      * @param prevRawOffset     The standard time offset from UTC before this rule
    725      *                          takes effect in milliseconds.
    726      * @param prevDSTSavings    The amount of daylight saving offset from the
    727      *                          standard time.
    728      * @param result            Receives the very first time when this rule takes effect.
    729      * @return  true if the start time is available.  When false is returned, output parameter
    730      *          "result" is unchanged.
    731      * @stable ICU 3.8
    732      */
    733     virtual UBool getFirstStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    734 
    735     /**
    736      * Gets the final time when this rule takes effect.
    737      * @param prevRawOffset     The standard time offset from UTC before this rule
    738      *                          takes effect in milliseconds.
    739      * @param prevDSTSavings    The amount of daylight saving offset from the
    740      *                          standard time.
    741      * @param result            Receives the final time when this rule takes effect.
    742      * @return  true if the start time is available.  When false is returned, output parameter
    743      *          "result" is unchanged.
    744      * @stable ICU 3.8
    745      */
    746     virtual UBool getFinalStart(int32_t prevRawOffset, int32_t prevDSTSavings, UDate& result) const;
    747 
    748     /**
    749      * Gets the first time when this rule takes effect after the specified time.
    750      * @param base              The first start time after this base time will be returned.
    751      * @param prevRawOffset     The standard time offset from UTC before this rule
    752      *                          takes effect in milliseconds.
    753      * @param prevDSTSavings    The amount of daylight saving offset from the
    754      *                          standard time.
    755      * @param inclusive         Whether the base time is inclusive or not.
    756      * @param result            Receives The first time when this rule takes effect after
    757      *                          the specified base time.
    758      * @return  true if the start time is available.  When false is returned, output parameter
    759      *          "result" is unchanged.
    760      * @stable ICU 3.8
    761      */
    762     virtual UBool getNextStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    763         UBool inclusive, UDate& result) const;
    764 
    765     /**
    766      * Gets the most recent time when this rule takes effect before the specified time.
    767      * @param base              The most recent time before this base time will be returned.
    768      * @param prevRawOffset     The standard time offset from UTC before this rule
    769      *                          takes effect in milliseconds.
    770      * @param prevDSTSavings    The amount of daylight saving offset from the
    771      *                          standard time.
    772      * @param inclusive         Whether the base time is inclusive or not.
    773      * @param result            Receives The most recent time when this rule takes effect before
    774      *                          the specified base time.
    775      * @return  true if the start time is available.  When false is returned, output parameter
    776      *          "result" is unchanged.
    777      * @stable ICU 3.8
    778      */
    779     virtual UBool getPreviousStart(UDate base, int32_t prevRawOffset, int32_t prevDSTSavings,
    780         UBool inclusive, UDate& result) const;
    781 
    782 
    783 private:
    784     enum { TIMEARRAY_STACK_BUFFER_SIZE = 32 };
    785     UBool initStartTimes(const UDate source[], int32_t size, UErrorCode& ec);
    786     UDate getUTC(UDate time, int32_t raw, int32_t dst) const;
    787 
    788     DateTimeRule::TimeRuleType  fTimeRuleType;
    789     int32_t fNumStartTimes;
    790     UDate*  fStartTimes;
    791     UDate   fLocalStartTimes[TIMEARRAY_STACK_BUFFER_SIZE];
    792 
    793 public:
    794     /**
    795      * Return the class ID for this class. This is useful only for comparing to
    796      * a return value from getDynamicClassID(). For example:
    797      * <pre>
    798      * .   Base* polymorphic_pointer = createPolymorphicObject();
    799      * .   if (polymorphic_pointer->getDynamicClassID() ==
    800      * .       erived::getStaticClassID()) ...
    801      * </pre>
    802      * @return          The class ID for all objects of this class.
    803      * @stable ICU 3.8
    804      */
    805     static UClassID U_EXPORT2 getStaticClassID(void);
    806 
    807     /**
    808      * Returns a unique class ID POLYMORPHICALLY. Pure virtual override. This
    809      * method is to implement a simple version of RTTI, since not all C++
    810      * compilers support genuine RTTI. Polymorphic operator==() and clone()
    811      * methods call this method.
    812      *
    813      * @return          The class ID for this object. All objects of a
    814      *                  given class have the same class ID.  Objects of
    815      *                  other classes have different class IDs.
    816      * @stable ICU 3.8
    817      */
    818     virtual UClassID getDynamicClassID(void) const;
    819 };
    820 
    821 
    822 U_NAMESPACE_END
    823 
    824 #endif /* #if !UCONFIG_NO_FORMATTING */
    825 
    826 #endif // TZRULE_H
    827 
    828 //eof
    829