Home | History | Annotate | Download | only in unicode
      1 /*
      2  *******************************************************************************
      3  * Copyright (C) 1996-2011, International Business Machines Corporation and
      4  * others. All Rights Reserved.
      5  *******************************************************************************
      6  */
      7 
      8 #ifndef UCAL_H
      9 #define UCAL_H
     10 
     11 #include "unicode/utypes.h"
     12 #include "unicode/uenum.h"
     13 #include "unicode/uloc.h"
     14 #include "unicode/localpointer.h"
     15 
     16 #if !UCONFIG_NO_FORMATTING
     17 
     18 /**
     19  * \file
     20  * \brief C API: Calendar
     21  *
     22  * <h2>Calendar C API</h2>
     23  *
     24  * UCalendar C API is used  for converting between a <code>UDate</code> object
     25  * and a set of integer fields such as <code>UCAL_YEAR</code>, <code>UCAL_MONTH</code>,
     26  * <code>UCAL_DAY</code>, <code>UCAL_HOUR</code>, and so on.
     27  * (A <code>UDate</code> object represents a specific instant in
     28  * time with millisecond precision. See UDate
     29  * for information about the <code>UDate</code> .)
     30  *
     31  * <p>
     32  * Types of <code>UCalendar</code> interpret a <code>UDate</code>
     33  * according to the rules of a specific calendar system. The U_STABLE
     34  * provides the enum UCalendarType with UCAL_TRADITIONAL and
     35  * UCAL_GREGORIAN.
     36  * <p>
     37  * Like other locale-sensitive C API, calendar API  provides a
     38  * function, <code>ucal_open()</code>, which returns a pointer to
     39  * <code>UCalendar</code> whose time fields have been initialized
     40  * with the current date and time. We need to specify the type of
     41  * calendar to be opened and the  timezoneId.
     42  * \htmlonly<blockquote>\endhtmlonly
     43  * <pre>
     44  * \code
     45  * UCalendar *caldef;
     46  * UChar *tzId;
     47  * UErrorCode status;
     48  * tzId=(UChar*)malloc(sizeof(UChar) * (strlen("PST") +1) );
     49  * u_uastrcpy(tzId, "PST");
     50  * caldef=ucal_open(tzID, u_strlen(tzID), NULL, UCAL_TRADITIONAL, &status);
     51  * \endcode
     52  * </pre>
     53  * \htmlonly</blockquote>\endhtmlonly
     54  *
     55  * <p>
     56  * A <code>UCalendar</code> object can produce all the time field values
     57  * needed to implement the date-time formatting for a particular language
     58  * and calendar style (for example, Japanese-Gregorian, Japanese-Traditional).
     59  *
     60  * <p>
     61  * When computing a <code>UDate</code> from time fields, two special circumstances
     62  * may arise: there may be insufficient information to compute the
     63  * <code>UDate</code> (such as only year and month but no day in the month),
     64  * or there may be inconsistent information (such as "Tuesday, July 15, 1996"
     65  * -- July 15, 1996 is actually a Monday).
     66  *
     67  * <p>
     68  * <strong>Insufficient information.</strong> The calendar will use default
     69  * information to specify the missing fields. This may vary by calendar; for
     70  * the Gregorian calendar, the default for a field is the same as that of the
     71  * start of the epoch: i.e., UCAL_YEAR = 1970, UCAL_MONTH = JANUARY, UCAL_DATE = 1, etc.
     72  *
     73  * <p>
     74  * <strong>Inconsistent information.</strong> If fields conflict, the calendar
     75  * will give preference to fields set more recently. For example, when
     76  * determining the day, the calendar will look for one of the following
     77  * combinations of fields.  The most recent combination, as determined by the
     78  * most recently set single field, will be used.
     79  *
     80  * \htmlonly<blockquote>\endhtmlonly
     81  * <pre>
     82  * \code
     83  * UCAL_MONTH + UCAL_DAY_OF_MONTH
     84  * UCAL_MONTH + UCAL_WEEK_OF_MONTH + UCAL_DAY_OF_WEEK
     85  * UCAL_MONTH + UCAL_DAY_OF_WEEK_IN_MONTH + UCAL_DAY_OF_WEEK
     86  * UCAL_DAY_OF_YEAR
     87  * UCAL_DAY_OF_WEEK + UCAL_WEEK_OF_YEAR
     88  * \endcode
     89  * </pre>
     90  * \htmlonly</blockquote>\endhtmlonly
     91  *
     92  * For the time of day:
     93  *
     94  * \htmlonly<blockquote>\endhtmlonly
     95  * <pre>
     96  * \code
     97  * UCAL_HOUR_OF_DAY
     98  * UCAL_AM_PM + UCAL_HOUR
     99  * \endcode
    100  * </pre>
    101  * \htmlonly</blockquote>\endhtmlonly
    102  *
    103  * <p>
    104  * <strong>Note:</strong> for some non-Gregorian calendars, different
    105  * fields may be necessary for complete disambiguation. For example, a full
    106  * specification of the historial Arabic astronomical calendar requires year,
    107  * month, day-of-month <em>and</em> day-of-week in some cases.
    108  *
    109  * <p>
    110  * <strong>Note:</strong> There are certain possible ambiguities in
    111  * interpretation of certain singular times, which are resolved in the
    112  * following ways:
    113  * <ol>
    114  *     <li> 24:00:00 "belongs" to the following day. That is,
    115  *          23:59 on Dec 31, 1969 &lt; 24:00 on Jan 1, 1970 &lt; 24:01:00 on Jan 1, 1970
    116  *
    117  *     <li> Although historically not precise, midnight also belongs to "am",
    118  *          and noon belongs to "pm", so on the same day,
    119  *          12:00 am (midnight) &lt; 12:01 am, and 12:00 pm (noon) &lt; 12:01 pm
    120  * </ol>
    121  *
    122  * <p>
    123  * The date or time format strings are not part of the definition of a
    124  * calendar, as those must be modifiable or overridable by the user at
    125  * runtime. Use {@link DateFormat}
    126  * to format dates.
    127  *
    128  * <p>
    129  * <code>Calendar</code> provides an API for field "rolling", where fields
    130  * can be incremented or decremented, but wrap around. For example, rolling the
    131  * month up in the date <code>December 12, <b>1996</b></code> results in
    132  * <code>January 12, <b>1996</b></code>.
    133  *
    134  * <p>
    135  * <code>Calendar</code> also provides a date arithmetic function for
    136  * adding the specified (signed) amount of time to a particular time field.
    137  * For example, subtracting 5 days from the date <code>September 12, 1996</code>
    138  * results in <code>September 7, 1996</code>.
    139  *
    140  * @stable ICU 2.0
    141  */
    142 
    143 /**
    144  * The time zone ID reserved for unknown time zone.
    145  * @draft ICU 4.8
    146  */
    147 #define UCAL_UNKNOWN_ZONE_ID "Etc/Unknown"
    148 
    149 /** A calendar.
    150  *  For usage in C programs.
    151  * @stable ICU 2.0
    152  */
    153 typedef void* UCalendar;
    154 
    155 /** Possible types of UCalendars
    156  * @stable ICU 2.0
    157  */
    158 enum UCalendarType {
    159   /**
    160    * Despite the name, UCAL_TRADITIONAL designates the locale's default calendar,
    161    * which may be the Gregorian calendar or some other calendar.
    162    * @stable ICU 2.0
    163    */
    164   UCAL_TRADITIONAL,
    165   /**
    166    * A better name for UCAL_TRADITIONAL.
    167    * @stable ICU 4.2
    168    */
    169   UCAL_DEFAULT = UCAL_TRADITIONAL,
    170   /**
    171    * Unambiguously designates the Gregorian calendar for the locale.
    172    * @stable ICU 2.0
    173    */
    174   UCAL_GREGORIAN
    175 };
    176 
    177 /** @stable ICU 2.0 */
    178 typedef enum UCalendarType UCalendarType;
    179 
    180 /** Possible fields in a UCalendar
    181  * @stable ICU 2.0
    182  */
    183 enum UCalendarDateFields {
    184   /**
    185    * Field number indicating the era, e.g., AD or BC in the Gregorian (Julian) calendar.
    186    * This is a calendar-specific value.
    187    * @stable ICU 2.6
    188    */
    189   UCAL_ERA,
    190 
    191   /**
    192    * Field number indicating the year. This is a calendar-specific value.
    193    * @stable ICU 2.6
    194    */
    195   UCAL_YEAR,
    196 
    197   /**
    198    * Field number indicating the month. This is a calendar-specific value.
    199    * The first month of the year is
    200    * <code>JANUARY</code>; the last depends on the number of months in a year.
    201    * @see #UCAL_JANUARY
    202    * @see #UCAL_FEBRUARY
    203    * @see #UCAL_MARCH
    204    * @see #UCAL_APRIL
    205    * @see #UCAL_MAY
    206    * @see #UCAL_JUNE
    207    * @see #UCAL_JULY
    208    * @see #UCAL_AUGUST
    209    * @see #UCAL_SEPTEMBER
    210    * @see #UCAL_OCTOBER
    211    * @see #UCAL_NOVEMBER
    212    * @see #UCAL_DECEMBER
    213    * @see #UCAL_UNDECIMBER
    214    * @stable ICU 2.6
    215    */
    216   UCAL_MONTH,
    217 
    218   /**
    219    * Field number indicating the
    220    * week number within the current year.  The first week of the year, as
    221    * defined by <code>UCAL_FIRST_DAY_OF_WEEK</code> and <code>UCAL_MINIMAL_DAYS_IN_FIRST_WEEK</code>
    222    * attributes, has value 1.  Subclasses define
    223    * the value of <code>UCAL_WEEK_OF_YEAR</code> for days before the first week of
    224    * the year.
    225    * @see ucal_getAttribute
    226    * @see ucal_setAttribute
    227    * @stable ICU 2.6
    228    */
    229   UCAL_WEEK_OF_YEAR,
    230 
    231  /**
    232    * Field number indicating the
    233    * week number within the current month.  The first week of the month, as
    234    * defined by <code>UCAL_FIRST_DAY_OF_WEEK</code> and <code>UCAL_MINIMAL_DAYS_IN_FIRST_WEEK</code>
    235    * attributes, has value 1.  Subclasses define
    236    * the value of <code>WEEK_OF_MONTH</code> for days before the first week of
    237    * the month.
    238    * @see ucal_getAttribute
    239    * @see ucal_setAttribute
    240    * @see #UCAL_FIRST_DAY_OF_WEEK
    241    * @see #UCAL_MINIMAL_DAYS_IN_FIRST_WEEK
    242    * @stable ICU 2.6
    243    */
    244   UCAL_WEEK_OF_MONTH,
    245 
    246  /**
    247    * Field number indicating the
    248    * day of the month. This is a synonym for <code>DAY_OF_MONTH</code>.
    249    * The first day of the month has value 1.
    250    * @see #UCAL_DAY_OF_MONTH
    251    * @stable ICU 2.6
    252    */
    253   UCAL_DATE,
    254 
    255  /**
    256    * Field number indicating the day
    257    * number within the current year.  The first day of the year has value 1.
    258    * @stable ICU 2.6
    259    */
    260   UCAL_DAY_OF_YEAR,
    261 
    262  /**
    263    * Field number indicating the day
    264    * of the week.  This field takes values <code>SUNDAY</code>,
    265    * <code>MONDAY</code>, <code>TUESDAY</code>, <code>WEDNESDAY</code>,
    266    * <code>THURSDAY</code>, <code>FRIDAY</code>, and <code>SATURDAY</code>.
    267    * @see #UCAL_SUNDAY
    268    * @see #UCAL_MONDAY
    269    * @see #UCAL_TUESDAY
    270    * @see #UCAL_WEDNESDAY
    271    * @see #UCAL_THURSDAY
    272    * @see #UCAL_FRIDAY
    273    * @see #UCAL_SATURDAY
    274    * @stable ICU 2.6
    275    */
    276   UCAL_DAY_OF_WEEK,
    277 
    278  /**
    279    * Field number indicating the
    280    * ordinal number of the day of the week within the current month. Together
    281    * with the <code>DAY_OF_WEEK</code> field, this uniquely specifies a day
    282    * within a month.  Unlike <code>WEEK_OF_MONTH</code> and
    283    * <code>WEEK_OF_YEAR</code>, this field's value does <em>not</em> depend on
    284    * <code>getFirstDayOfWeek()</code> or
    285    * <code>getMinimalDaysInFirstWeek()</code>.  <code>DAY_OF_MONTH 1</code>
    286    * through <code>7</code> always correspond to <code>DAY_OF_WEEK_IN_MONTH
    287    * 1</code>; <code>8</code> through <code>15</code> correspond to
    288    * <code>DAY_OF_WEEK_IN_MONTH 2</code>, and so on.
    289    * <code>DAY_OF_WEEK_IN_MONTH 0</code> indicates the week before
    290    * <code>DAY_OF_WEEK_IN_MONTH 1</code>.  Negative values count back from the
    291    * end of the month, so the last Sunday of a month is specified as
    292    * <code>DAY_OF_WEEK = SUNDAY, DAY_OF_WEEK_IN_MONTH = -1</code>.  Because
    293    * negative values count backward they will usually be aligned differently
    294    * within the month than positive values.  For example, if a month has 31
    295    * days, <code>DAY_OF_WEEK_IN_MONTH -1</code> will overlap
    296    * <code>DAY_OF_WEEK_IN_MONTH 5</code> and the end of <code>4</code>.
    297    * @see #UCAL_DAY_OF_WEEK
    298    * @see #UCAL_WEEK_OF_MONTH
    299    * @stable ICU 2.6
    300    */
    301   UCAL_DAY_OF_WEEK_IN_MONTH,
    302 
    303  /**
    304    * Field number indicating
    305    * whether the <code>HOUR</code> is before or after noon.
    306    * E.g., at 10:04:15.250 PM the <code>AM_PM</code> is <code>PM</code>.
    307    * @see #UCAL_AM
    308    * @see #UCAL_PM
    309    * @see #UCAL_HOUR
    310    * @stable ICU 2.6
    311    */
    312   UCAL_AM_PM,
    313 
    314  /**
    315    * Field number indicating the
    316    * hour of the morning or afternoon. <code>HOUR</code> is used for the 12-hour
    317    * clock.
    318    * E.g., at 10:04:15.250 PM the <code>HOUR</code> is 10.
    319    * @see #UCAL_AM_PM
    320    * @see #UCAL_HOUR_OF_DAY
    321    * @stable ICU 2.6
    322    */
    323   UCAL_HOUR,
    324 
    325  /**
    326    * Field number indicating the
    327    * hour of the day. <code>HOUR_OF_DAY</code> is used for the 24-hour clock.
    328    * E.g., at 10:04:15.250 PM the <code>HOUR_OF_DAY</code> is 22.
    329    * @see #UCAL_HOUR
    330    * @stable ICU 2.6
    331    */
    332   UCAL_HOUR_OF_DAY,
    333 
    334  /**
    335    * Field number indicating the
    336    * minute within the hour.
    337    * E.g., at 10:04:15.250 PM the <code>UCAL_MINUTE</code> is 4.
    338    * @stable ICU 2.6
    339    */
    340   UCAL_MINUTE,
    341 
    342  /**
    343    * Field number indicating the
    344    * second within the minute.
    345    * E.g., at 10:04:15.250 PM the <code>UCAL_SECOND</code> is 15.
    346    * @stable ICU 2.6
    347    */
    348   UCAL_SECOND,
    349 
    350  /**
    351    * Field number indicating the
    352    * millisecond within the second.
    353    * E.g., at 10:04:15.250 PM the <code>UCAL_MILLISECOND</code> is 250.
    354    * @stable ICU 2.6
    355    */
    356   UCAL_MILLISECOND,
    357 
    358  /**
    359    * Field number indicating the
    360    * raw offset from GMT in milliseconds.
    361    * @stable ICU 2.6
    362    */
    363   UCAL_ZONE_OFFSET,
    364 
    365  /**
    366    * Field number indicating the
    367    * daylight savings offset in milliseconds.
    368    * @stable ICU 2.6
    369    */
    370   UCAL_DST_OFFSET,
    371 
    372  /**
    373    * Field number
    374    * indicating the extended year corresponding to the
    375    * <code>UCAL_WEEK_OF_YEAR</code> field.  This may be one greater or less
    376    * than the value of <code>UCAL_EXTENDED_YEAR</code>.
    377    * @stable ICU 2.6
    378    */
    379   UCAL_YEAR_WOY,
    380 
    381  /**
    382    * Field number
    383    * indicating the localized day of week.  This will be a value from 1
    384    * to 7 inclusive, with 1 being the localized first day of the week.
    385    * @stable ICU 2.6
    386    */
    387   UCAL_DOW_LOCAL,
    388 
    389   /**
    390    * Year of this calendar system, encompassing all supra-year fields. For example,
    391    * in Gregorian/Julian calendars, positive Extended Year values indicate years AD,
    392    *  1 BC = 0 extended, 2 BC = -1 extended, and so on.
    393    * @stable ICU 2.8
    394    */
    395   UCAL_EXTENDED_YEAR,
    396 
    397  /**
    398    * Field number
    399    * indicating the modified Julian day number.  This is different from
    400    * the conventional Julian day number in two regards.  First, it
    401    * demarcates days at local zone midnight, rather than noon GMT.
    402    * Second, it is a local number; that is, it depends on the local time
    403    * zone.  It can be thought of as a single number that encompasses all
    404    * the date-related fields.
    405    * @stable ICU 2.8
    406    */
    407   UCAL_JULIAN_DAY,
    408 
    409   /**
    410    * Ranges from 0 to 23:59:59.999 (regardless of DST).  This field behaves <em>exactly</em>
    411    * like a composite of all time-related fields, not including the zone fields.  As such,
    412    * it also reflects discontinuities of those fields on DST transition days.  On a day
    413    * of DST onset, it will jump forward.  On a day of DST cessation, it will jump
    414    * backward.  This reflects the fact that it must be combined with the DST_OFFSET field
    415    * to obtain a unique local time value.
    416    * @stable ICU 2.8
    417    */
    418   UCAL_MILLISECONDS_IN_DAY,
    419 
    420   /**
    421    * Whether or not the current month is a leap month (0 or 1). See the Chinese calendar for
    422    * an example of this.
    423    */
    424   UCAL_IS_LEAP_MONTH,
    425 
    426   /**
    427    * Field count
    428    * @stable ICU 2.6
    429    */
    430   UCAL_FIELD_COUNT,
    431 
    432  /**
    433    * Field number indicating the
    434    * day of the month. This is a synonym for <code>UCAL_DATE</code>.
    435    * The first day of the month has value 1.
    436    * @see #UCAL_DATE
    437    * Synonym for UCAL_DATE
    438    * @stable ICU 2.8
    439    **/
    440   UCAL_DAY_OF_MONTH=UCAL_DATE
    441 };
    442 
    443 /** @stable ICU 2.0 */
    444 typedef enum UCalendarDateFields UCalendarDateFields;
    445     /**
    446      * Useful constant for days of week. Note: Calendar day-of-week is 1-based. Clients
    447      * who create locale resources for the field of first-day-of-week should be aware of
    448      * this. For instance, in US locale, first-day-of-week is set to 1, i.e., UCAL_SUNDAY.
    449      */
    450 /** Possible days of the week in a UCalendar
    451  * @stable ICU 2.0
    452  */
    453 enum UCalendarDaysOfWeek {
    454   /** Sunday */
    455   UCAL_SUNDAY = 1,
    456   /** Monday */
    457   UCAL_MONDAY,
    458   /** Tuesday */
    459   UCAL_TUESDAY,
    460   /** Wednesday */
    461   UCAL_WEDNESDAY,
    462   /** Thursday */
    463   UCAL_THURSDAY,
    464   /** Friday */
    465   UCAL_FRIDAY,
    466   /** Saturday */
    467   UCAL_SATURDAY
    468 };
    469 
    470 /** @stable ICU 2.0 */
    471 typedef enum UCalendarDaysOfWeek UCalendarDaysOfWeek;
    472 
    473 /** Possible months in a UCalendar. Note: Calendar month is 0-based.
    474  * @stable ICU 2.0
    475  */
    476 enum UCalendarMonths {
    477   /** January */
    478   UCAL_JANUARY,
    479   /** February */
    480   UCAL_FEBRUARY,
    481   /** March */
    482   UCAL_MARCH,
    483   /** April */
    484   UCAL_APRIL,
    485   /** May */
    486   UCAL_MAY,
    487   /** June */
    488   UCAL_JUNE,
    489   /** July */
    490   UCAL_JULY,
    491   /** August */
    492   UCAL_AUGUST,
    493   /** September */
    494   UCAL_SEPTEMBER,
    495   /** October */
    496   UCAL_OCTOBER,
    497   /** November */
    498   UCAL_NOVEMBER,
    499   /** December */
    500   UCAL_DECEMBER,
    501   /** Value of the <code>UCAL_MONTH</code> field indicating the
    502     * thirteenth month of the year. Although the Gregorian calendar
    503     * does not use this value, lunar calendars do.
    504     */
    505   UCAL_UNDECIMBER
    506 };
    507 
    508 /** @stable ICU 2.0 */
    509 typedef enum UCalendarMonths UCalendarMonths;
    510 
    511 /** Possible AM/PM values in a UCalendar
    512  * @stable ICU 2.0
    513  */
    514 enum UCalendarAMPMs {
    515     /** AM */
    516   UCAL_AM,
    517   /** PM */
    518   UCAL_PM
    519 };
    520 
    521 /** @stable ICU 2.0 */
    522 typedef enum UCalendarAMPMs UCalendarAMPMs;
    523 
    524 /**
    525  * System time zone type constants used by filtering zones
    526  * in ucal_openTimeZoneIDEnumeration.
    527  * @see ucal_openTimeZoneIDEnumeration
    528  * @draft ICU 4.8
    529  */
    530 enum USystemTimeZoneType {
    531     /**
    532      * Any system zones.
    533      * @draft ICU 4.8
    534      */
    535     UCAL_ZONE_TYPE_ANY,
    536     /**
    537      * Canonical system zones.
    538      * @draft ICU 4.8
    539      */
    540     UCAL_ZONE_TYPE_CANONICAL,
    541     /**
    542      * Canonical system zones associated with actual locations.
    543      * @draft ICU 4.8
    544      */
    545     UCAL_ZONE_TYPE_CANONICAL_LOCATION
    546 };
    547 
    548 /** @draft ICU 4.8 */
    549 typedef enum USystemTimeZoneType USystemTimeZoneType;
    550 
    551 /**
    552  * Create an enumeration over system time zone IDs with the given
    553  * filter conditions.
    554  * @param zoneType  The system time zone type.
    555  * @param region    The ISO 3166 two-letter country code or UN M.49
    556  *                  three-digit area code.  When NULL, no filtering
    557  *                  done by region.
    558  * @param rawOffset An offset from GMT in milliseconds, ignoring the
    559  *                  effect of daylight savings time, if any. When NULL,
    560  *                  no filtering done by zone offset.
    561  * @param ec        A pointer to an UErrorCode to receive any errors
    562  * @return  an enumeration object that the caller must dispose of
    563  *          using enum_close(), or NULL upon failure. In case of failure,
    564  *          *ec will indicate the error.
    565  * @draft ICU 4.8
    566  */
    567 U_DRAFT UEnumeration* U_EXPORT2
    568 ucal_openTimeZoneIDEnumeration(USystemTimeZoneType zoneType, const char* region,
    569                                 const int32_t* rawOffset, UErrorCode* ec);
    570 
    571 /**
    572  * Create an enumeration over all time zones.
    573  *
    574  * @param ec input/output error code
    575  *
    576  * @return an enumeration object that the caller must dispose of using
    577  * uenum_close(), or NULL upon failure. In case of failure *ec will
    578  * indicate the error.
    579  *
    580  * @stable ICU 2.6
    581  */
    582 U_STABLE UEnumeration* U_EXPORT2
    583 ucal_openTimeZones(UErrorCode* ec);
    584 
    585 /**
    586  * Create an enumeration over all time zones associated with the given
    587  * country. Some zones are affiliated with no country (e.g., "UTC");
    588  * these may also be retrieved, as a group.
    589  *
    590  * @param country the ISO 3166 two-letter country code, or NULL to
    591  * retrieve zones not affiliated with any country
    592  *
    593  * @param ec input/output error code
    594  *
    595  * @return an enumeration object that the caller must dispose of using
    596  * uenum_close(), or NULL upon failure. In case of failure *ec will
    597  * indicate the error.
    598  *
    599  * @stable ICU 2.6
    600  */
    601 U_STABLE UEnumeration* U_EXPORT2
    602 ucal_openCountryTimeZones(const char* country, UErrorCode* ec);
    603 
    604 /**
    605  * Return the default time zone. The default is determined initially
    606  * by querying the host operating system. It may be changed with
    607  * ucal_setDefaultTimeZone() or with the C++ TimeZone API.
    608  *
    609  * @param result A buffer to receive the result, or NULL
    610  *
    611  * @param resultCapacity The capacity of the result buffer
    612  *
    613  * @param ec input/output error code
    614  *
    615  * @return The result string length, not including the terminating
    616  * null
    617  *
    618  * @stable ICU 2.6
    619  */
    620 U_STABLE int32_t U_EXPORT2
    621 ucal_getDefaultTimeZone(UChar* result, int32_t resultCapacity, UErrorCode* ec);
    622 
    623 /**
    624  * Set the default time zone.
    625  *
    626  * @param zoneID null-terminated time zone ID
    627  *
    628  * @param ec input/output error code
    629  *
    630  * @stable ICU 2.6
    631  */
    632 U_STABLE void U_EXPORT2
    633 ucal_setDefaultTimeZone(const UChar* zoneID, UErrorCode* ec);
    634 
    635 /**
    636  * Return the amount of time in milliseconds that the clock is
    637  * advanced during daylight savings time for the given time zone, or
    638  * zero if the time zone does not observe daylight savings time.
    639  *
    640  * @param zoneID null-terminated time zone ID
    641  *
    642  * @param ec input/output error code
    643  *
    644  * @return the number of milliseconds the time is advanced with
    645  * respect to standard time when the daylight savings rules are in
    646  * effect. This is always a non-negative number, most commonly either
    647  * 3,600,000 (one hour) or zero.
    648  *
    649  * @stable ICU 2.6
    650  */
    651 U_STABLE int32_t U_EXPORT2
    652 ucal_getDSTSavings(const UChar* zoneID, UErrorCode* ec);
    653 
    654 /**
    655  * Get the current date and time.
    656  * The value returned is represented as milliseconds from the epoch.
    657  * @return The current date and time.
    658  * @stable ICU 2.0
    659  */
    660 U_STABLE UDate U_EXPORT2
    661 ucal_getNow(void);
    662 
    663 /**
    664  * Open a UCalendar.
    665  * A UCalendar may be used to convert a millisecond value to a year,
    666  * month, and day.
    667  * <p>
    668  * Note: When unknown TimeZone ID is specified, the UCalendar returned
    669  * by the function is initialized with GMT zone with TimeZone ID <code>UCAL_UNKNOWN_ZONE_ID</code>
    670  * ("Etc/Unknown") without any errors/warnings.  If you want to check if a TimeZone ID is valid
    671  * prior to this function, use <code>ucal_getCanonicalTimeZoneID</code>.
    672  *
    673  * @param zoneID The desired TimeZone ID.  If 0, use the default time zone.
    674  * @param len The length of zoneID, or -1 if null-terminated.
    675  * @param locale The desired locale
    676  * @param type The type of UCalendar to open. This can be UCAL_GREGORIAN to open the Gregorian
    677  * calendar for the locale, or UCAL_DEFAULT to open the default calendar for the locale (the
    678  * default calendar may also be Gregorian). To open a specific non-Gregorian calendar for the
    679  * locale, use uloc_setKeywordValue to set the value of the calendar keyword for the locale
    680  * and then pass the locale to ucal_open with UCAL_DEFAULT as the type.
    681  * @param status A pointer to an UErrorCode to receive any errors
    682  * @return A pointer to a UCalendar, or 0 if an error occurred.
    683  * @see #UCAL_UNKNOWN_ZONE_ID
    684  * @stable ICU 2.0
    685  */
    686 U_STABLE UCalendar* U_EXPORT2
    687 ucal_open(const UChar*   zoneID,
    688           int32_t        len,
    689           const char*    locale,
    690           UCalendarType  type,
    691           UErrorCode*    status);
    692 
    693 /**
    694  * Close a UCalendar.
    695  * Once closed, a UCalendar may no longer be used.
    696  * @param cal The UCalendar to close.
    697  * @stable ICU 2.0
    698  */
    699 U_STABLE void U_EXPORT2
    700 ucal_close(UCalendar *cal);
    701 
    702 #if U_SHOW_CPLUSPLUS_API
    703 
    704 U_NAMESPACE_BEGIN
    705 
    706 /**
    707  * \class LocalUCalendarPointer
    708  * "Smart pointer" class, closes a UCalendar via ucal_close().
    709  * For most methods see the LocalPointerBase base class.
    710  *
    711  * @see LocalPointerBase
    712  * @see LocalPointer
    713  * @stable ICU 4.4
    714  */
    715 U_DEFINE_LOCAL_OPEN_POINTER(LocalUCalendarPointer, UCalendar, ucal_close);
    716 
    717 U_NAMESPACE_END
    718 
    719 #endif
    720 
    721 /**
    722  * Open a copy of a UCalendar.
    723  * This function performs a deep copy.
    724  * @param cal The calendar to copy
    725  * @param status A pointer to an UErrorCode to receive any errors.
    726  * @return A pointer to a UCalendar identical to cal.
    727  * @stable ICU 4.0
    728  */
    729 U_STABLE UCalendar* U_EXPORT2
    730 ucal_clone(const UCalendar* cal,
    731            UErrorCode*      status);
    732 
    733 /**
    734  * Set the TimeZone used by a UCalendar.
    735  * A UCalendar uses a timezone for converting from Greenwich time to local time.
    736  * @param cal The UCalendar to set.
    737  * @param zoneID The desired TimeZone ID.  If 0, use the default time zone.
    738  * @param len The length of zoneID, or -1 if null-terminated.
    739  * @param status A pointer to an UErrorCode to receive any errors.
    740  * @stable ICU 2.0
    741  */
    742 U_STABLE void U_EXPORT2
    743 ucal_setTimeZone(UCalendar*    cal,
    744                  const UChar*  zoneID,
    745                  int32_t       len,
    746                  UErrorCode*   status);
    747 
    748 /**
    749  * Possible formats for a UCalendar's display name
    750  * @stable ICU 2.0
    751  */
    752 enum UCalendarDisplayNameType {
    753   /** Standard display name */
    754   UCAL_STANDARD,
    755   /** Short standard display name */
    756   UCAL_SHORT_STANDARD,
    757   /** Daylight savings display name */
    758   UCAL_DST,
    759   /** Short daylight savings display name */
    760   UCAL_SHORT_DST
    761 };
    762 
    763 /** @stable ICU 2.0 */
    764 typedef enum UCalendarDisplayNameType UCalendarDisplayNameType;
    765 
    766 /**
    767  * Get the display name for a UCalendar's TimeZone.
    768  * A display name is suitable for presentation to a user.
    769  * @param cal          The UCalendar to query.
    770  * @param type         The desired display name format; one of UCAL_STANDARD, UCAL_SHORT_STANDARD,
    771  *                     UCAL_DST, UCAL_SHORT_DST
    772  * @param locale       The desired locale for the display name.
    773  * @param result       A pointer to a buffer to receive the formatted number.
    774  * @param resultLength The maximum size of result.
    775  * @param status       A pointer to an UErrorCode to receive any errors
    776  * @return             The total buffer size needed; if greater than resultLength, the output was truncated.
    777  * @stable ICU 2.0
    778  */
    779 U_STABLE int32_t U_EXPORT2
    780 ucal_getTimeZoneDisplayName(const UCalendar*          cal,
    781                             UCalendarDisplayNameType  type,
    782                             const char*               locale,
    783                             UChar*                    result,
    784                             int32_t                   resultLength,
    785                             UErrorCode*               status);
    786 
    787 /**
    788  * Determine if a UCalendar is currently in daylight savings time.
    789  * Daylight savings time is not used in all parts of the world.
    790  * @param cal The UCalendar to query.
    791  * @param status A pointer to an UErrorCode to receive any errors
    792  * @return TRUE if cal is currently in daylight savings time, FALSE otherwise
    793  * @stable ICU 2.0
    794  */
    795 U_STABLE UBool U_EXPORT2
    796 ucal_inDaylightTime(const UCalendar*  cal,
    797                     UErrorCode*       status );
    798 
    799 /**
    800  * Sets the GregorianCalendar change date. This is the point when the switch from
    801  * Julian dates to Gregorian dates occurred. Default is 00:00:00 local time, October
    802  * 15, 1582. Previous to this time and date will be Julian dates.
    803  *
    804  * This function works only for Gregorian calendars. If the UCalendar is not
    805  * an instance of a Gregorian calendar, then a U_UNSUPPORTED_ERROR
    806  * error code is set.
    807  *
    808  * @param cal        The calendar object.
    809  * @param date       The given Gregorian cutover date.
    810  * @param pErrorCode Pointer to a standard ICU error code. Its input value must
    811  *                   pass the U_SUCCESS() test, or else the function returns
    812  *                   immediately. Check for U_FAILURE() on output or use with
    813  *                   function chaining. (See User Guide for details.)
    814  *
    815  * @see GregorianCalendar::setGregorianChange
    816  * @see ucal_getGregorianChange
    817  * @stable ICU 3.6
    818  */
    819 U_STABLE void U_EXPORT2
    820 ucal_setGregorianChange(UCalendar *cal, UDate date, UErrorCode *pErrorCode);
    821 
    822 /**
    823  * Gets the Gregorian Calendar change date. This is the point when the switch from
    824  * Julian dates to Gregorian dates occurred. Default is 00:00:00 local time, October
    825  * 15, 1582. Previous to this time and date will be Julian dates.
    826  *
    827  * This function works only for Gregorian calendars. If the UCalendar is not
    828  * an instance of a Gregorian calendar, then a U_UNSUPPORTED_ERROR
    829  * error code is set.
    830  *
    831  * @param cal        The calendar object.
    832  * @param pErrorCode Pointer to a standard ICU error code. Its input value must
    833  *                   pass the U_SUCCESS() test, or else the function returns
    834  *                   immediately. Check for U_FAILURE() on output or use with
    835  *                   function chaining. (See User Guide for details.)
    836  * @return   The Gregorian cutover time for this calendar.
    837  *
    838  * @see GregorianCalendar::getGregorianChange
    839  * @see ucal_setGregorianChange
    840  * @stable ICU 3.6
    841  */
    842 U_STABLE UDate U_EXPORT2
    843 ucal_getGregorianChange(const UCalendar *cal, UErrorCode *pErrorCode);
    844 
    845 /**
    846  * Types of UCalendar attributes
    847  * @stable ICU 2.0
    848  */
    849 enum UCalendarAttribute {
    850     /** Lenient parsing */
    851   UCAL_LENIENT,
    852   /** First day of week */
    853   UCAL_FIRST_DAY_OF_WEEK,
    854   /** Minimum number of days in first week */
    855   UCAL_MINIMAL_DAYS_IN_FIRST_WEEK
    856 };
    857 
    858 /** @stable ICU 2.0 */
    859 typedef enum UCalendarAttribute UCalendarAttribute;
    860 
    861 /**
    862  * Get a numeric attribute associated with a UCalendar.
    863  * Numeric attributes include the first day of the week, or the minimal numbers
    864  * of days in the first week of the month.
    865  * @param cal The UCalendar to query.
    866  * @param attr The desired attribute; one of UCAL_LENIENT, UCAL_FIRST_DAY_OF_WEEK,
    867  * or UCAL_MINIMAL_DAYS_IN_FIRST_WEEK
    868  * @return The value of attr.
    869  * @see ucal_setAttribute
    870  * @stable ICU 2.0
    871  */
    872 U_STABLE int32_t U_EXPORT2
    873 ucal_getAttribute(const UCalendar*    cal,
    874                   UCalendarAttribute  attr);
    875 
    876 /**
    877  * Set a numeric attribute associated with a UCalendar.
    878  * Numeric attributes include the first day of the week, or the minimal numbers
    879  * of days in the first week of the month.
    880  * @param cal The UCalendar to set.
    881  * @param attr The desired attribute; one of UCAL_LENIENT, UCAL_FIRST_DAY_OF_WEEK,
    882  * or UCAL_MINIMAL_DAYS_IN_FIRST_WEEK
    883  * @param newValue The new value of attr.
    884  * @see ucal_getAttribute
    885  * @stable ICU 2.0
    886  */
    887 U_STABLE void U_EXPORT2
    888 ucal_setAttribute(UCalendar*          cal,
    889                   UCalendarAttribute  attr,
    890                   int32_t             newValue);
    891 
    892 /**
    893  * Get a locale for which calendars are available.
    894  * A UCalendar in a locale returned by this function will contain the correct
    895  * day and month names for the locale.
    896  * @param localeIndex The index of the desired locale.
    897  * @return A locale for which calendars are available, or 0 if none.
    898  * @see ucal_countAvailable
    899  * @stable ICU 2.0
    900  */
    901 U_STABLE const char* U_EXPORT2
    902 ucal_getAvailable(int32_t localeIndex);
    903 
    904 /**
    905  * Determine how many locales have calendars available.
    906  * This function is most useful as determining the loop ending condition for
    907  * calls to \ref ucal_getAvailable.
    908  * @return The number of locales for which calendars are available.
    909  * @see ucal_getAvailable
    910  * @stable ICU 2.0
    911  */
    912 U_STABLE int32_t U_EXPORT2
    913 ucal_countAvailable(void);
    914 
    915 /**
    916  * Get a UCalendar's current time in millis.
    917  * The time is represented as milliseconds from the epoch.
    918  * @param cal The UCalendar to query.
    919  * @param status A pointer to an UErrorCode to receive any errors
    920  * @return The calendar's current time in millis.
    921  * @see ucal_setMillis
    922  * @see ucal_setDate
    923  * @see ucal_setDateTime
    924  * @stable ICU 2.0
    925  */
    926 U_STABLE UDate U_EXPORT2
    927 ucal_getMillis(const UCalendar*  cal,
    928                UErrorCode*       status);
    929 
    930 /**
    931  * Set a UCalendar's current time in millis.
    932  * The time is represented as milliseconds from the epoch.
    933  * @param cal The UCalendar to set.
    934  * @param dateTime The desired date and time.
    935  * @param status A pointer to an UErrorCode to receive any errors
    936  * @see ucal_getMillis
    937  * @see ucal_setDate
    938  * @see ucal_setDateTime
    939  * @stable ICU 2.0
    940  */
    941 U_STABLE void U_EXPORT2
    942 ucal_setMillis(UCalendar*   cal,
    943                UDate        dateTime,
    944                UErrorCode*  status );
    945 
    946 /**
    947  * Set a UCalendar's current date.
    948  * The date is represented as a series of 32-bit integers.
    949  * @param cal The UCalendar to set.
    950  * @param year The desired year.
    951  * @param month The desired month; one of UCAL_JANUARY, UCAL_FEBRUARY, UCAL_MARCH, UCAL_APRIL, UCAL_MAY,
    952  * UCAL_JUNE, UCAL_JULY, UCAL_AUGUST, UCAL_SEPTEMBER, UCAL_OCTOBER, UCAL_NOVEMBER, UCAL_DECEMBER, UCAL_UNDECIMBER
    953  * @param date The desired day of the month.
    954  * @param status A pointer to an UErrorCode to receive any errors
    955  * @see ucal_getMillis
    956  * @see ucal_setMillis
    957  * @see ucal_setDateTime
    958  * @stable ICU 2.0
    959  */
    960 U_STABLE void U_EXPORT2
    961 ucal_setDate(UCalendar*   cal,
    962              int32_t      year,
    963              int32_t      month,
    964              int32_t      date,
    965              UErrorCode*  status);
    966 
    967 /**
    968  * Set a UCalendar's current date.
    969  * The date is represented as a series of 32-bit integers.
    970  * @param cal The UCalendar to set.
    971  * @param year The desired year.
    972  * @param month The desired month; one of UCAL_JANUARY, UCAL_FEBRUARY, UCAL_MARCH, UCAL_APRIL, UCAL_MAY,
    973  * UCAL_JUNE, UCAL_JULY, UCAL_AUGUST, UCAL_SEPTEMBER, UCAL_OCTOBER, UCAL_NOVEMBER, UCAL_DECEMBER, UCAL_UNDECIMBER
    974  * @param date The desired day of the month.
    975  * @param hour The desired hour of day.
    976  * @param minute The desired minute.
    977  * @param second The desirec second.
    978  * @param status A pointer to an UErrorCode to receive any errors
    979  * @see ucal_getMillis
    980  * @see ucal_setMillis
    981  * @see ucal_setDate
    982  * @stable ICU 2.0
    983  */
    984 U_STABLE void U_EXPORT2
    985 ucal_setDateTime(UCalendar*   cal,
    986                  int32_t      year,
    987                  int32_t      month,
    988                  int32_t      date,
    989                  int32_t      hour,
    990                  int32_t      minute,
    991                  int32_t      second,
    992                  UErrorCode*  status);
    993 
    994 /**
    995  * Returns TRUE if two UCalendars are equivalent.  Equivalent
    996  * UCalendars will behave identically, but they may be set to
    997  * different times.
    998  * @param cal1 The first of the UCalendars to compare.
    999  * @param cal2 The second of the UCalendars to compare.
   1000  * @return TRUE if cal1 and cal2 are equivalent, FALSE otherwise.
   1001  * @stable ICU 2.0
   1002  */
   1003 U_STABLE UBool U_EXPORT2
   1004 ucal_equivalentTo(const UCalendar*  cal1,
   1005                   const UCalendar*  cal2);
   1006 
   1007 /**
   1008  * Add a specified signed amount to a particular field in a UCalendar.
   1009  * This can modify more significant fields in the calendar.
   1010  * @param cal The UCalendar to which to add.
   1011  * @param field The field to which to add the signed value; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1012  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1013  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1014  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1015  * @param amount The signed amount to add to field. If the amount causes the value
   1016  * to exceed to maximum or minimum values for that field, other fields are modified
   1017  * to preserve the magnitude of the change.
   1018  * @param status A pointer to an UErrorCode to receive any errors
   1019  * @see ucal_roll
   1020  * @stable ICU 2.0
   1021  */
   1022 U_STABLE void U_EXPORT2
   1023 ucal_add(UCalendar*           cal,
   1024          UCalendarDateFields  field,
   1025          int32_t              amount,
   1026          UErrorCode*          status);
   1027 
   1028 /**
   1029  * Add a specified signed amount to a particular field in a UCalendar.
   1030  * This will not modify more significant fields in the calendar.
   1031  * @param cal The UCalendar to which to add.
   1032  * @param field The field to which to add the signed value; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1033  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1034  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1035  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1036  * @param amount The signed amount to add to field. If the amount causes the value
   1037  * to exceed to maximum or minimum values for that field, the field is pinned to a permissible
   1038  * value.
   1039  * @param status A pointer to an UErrorCode to receive any errors
   1040  * @see ucal_add
   1041  * @stable ICU 2.0
   1042  */
   1043 U_STABLE void U_EXPORT2
   1044 ucal_roll(UCalendar*           cal,
   1045           UCalendarDateFields  field,
   1046           int32_t              amount,
   1047           UErrorCode*          status);
   1048 
   1049 /**
   1050  * Get the current value of a field from a UCalendar.
   1051  * All fields are represented as 32-bit integers.
   1052  * @param cal The UCalendar to query.
   1053  * @param field The desired field; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1054  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1055  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1056  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1057  * @param status A pointer to an UErrorCode to receive any errors
   1058  * @return The value of the desired field.
   1059  * @see ucal_set
   1060  * @see ucal_isSet
   1061  * @see ucal_clearField
   1062  * @see ucal_clear
   1063  * @stable ICU 2.0
   1064  */
   1065 U_STABLE int32_t U_EXPORT2
   1066 ucal_get(const UCalendar*     cal,
   1067          UCalendarDateFields  field,
   1068          UErrorCode*          status );
   1069 
   1070 /**
   1071  * Set the value of a field in a UCalendar.
   1072  * All fields are represented as 32-bit integers.
   1073  * @param cal The UCalendar to set.
   1074  * @param field The field to set; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1075  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1076  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1077  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1078  * @param value The desired value of field.
   1079  * @see ucal_get
   1080  * @see ucal_isSet
   1081  * @see ucal_clearField
   1082  * @see ucal_clear
   1083  * @stable ICU 2.0
   1084  */
   1085 U_STABLE void U_EXPORT2
   1086 ucal_set(UCalendar*           cal,
   1087          UCalendarDateFields  field,
   1088          int32_t              value);
   1089 
   1090 /**
   1091  * Determine if a field in a UCalendar is set.
   1092  * All fields are represented as 32-bit integers.
   1093  * @param cal The UCalendar to query.
   1094  * @param field The desired field; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1095  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1096  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1097  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1098  * @return TRUE if field is set, FALSE otherwise.
   1099  * @see ucal_get
   1100  * @see ucal_set
   1101  * @see ucal_clearField
   1102  * @see ucal_clear
   1103  * @stable ICU 2.0
   1104  */
   1105 U_STABLE UBool U_EXPORT2
   1106 ucal_isSet(const UCalendar*     cal,
   1107            UCalendarDateFields  field);
   1108 
   1109 /**
   1110  * Clear a field in a UCalendar.
   1111  * All fields are represented as 32-bit integers.
   1112  * @param cal The UCalendar containing the field to clear.
   1113  * @param field The field to clear; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1114  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1115  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1116  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1117  * @see ucal_get
   1118  * @see ucal_set
   1119  * @see ucal_isSet
   1120  * @see ucal_clear
   1121  * @stable ICU 2.0
   1122  */
   1123 U_STABLE void U_EXPORT2
   1124 ucal_clearField(UCalendar*           cal,
   1125                 UCalendarDateFields  field);
   1126 
   1127 /**
   1128  * Clear all fields in a UCalendar.
   1129  * All fields are represented as 32-bit integers.
   1130  * @param calendar The UCalendar to clear.
   1131  * @see ucal_get
   1132  * @see ucal_set
   1133  * @see ucal_isSet
   1134  * @see ucal_clearField
   1135  * @stable ICU 2.0
   1136  */
   1137 U_STABLE void U_EXPORT2
   1138 ucal_clear(UCalendar* calendar);
   1139 
   1140 /**
   1141  * Possible limit values for a UCalendar
   1142  * @stable ICU 2.0
   1143  */
   1144 enum UCalendarLimitType {
   1145   /** Minimum value */
   1146   UCAL_MINIMUM,
   1147   /** Maximum value */
   1148   UCAL_MAXIMUM,
   1149   /** Greatest minimum value */
   1150   UCAL_GREATEST_MINIMUM,
   1151   /** Leaest maximum value */
   1152   UCAL_LEAST_MAXIMUM,
   1153   /** Actual minimum value */
   1154   UCAL_ACTUAL_MINIMUM,
   1155   /** Actual maximum value */
   1156   UCAL_ACTUAL_MAXIMUM
   1157 };
   1158 
   1159 /** @stable ICU 2.0 */
   1160 typedef enum UCalendarLimitType UCalendarLimitType;
   1161 
   1162 /**
   1163  * Determine a limit for a field in a UCalendar.
   1164  * A limit is a maximum or minimum value for a field.
   1165  * @param cal The UCalendar to query.
   1166  * @param field The desired field; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1167  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1168  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1169  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1170  * @param type The desired critical point; one of UCAL_MINIMUM, UCAL_MAXIMUM, UCAL_GREATEST_MINIMUM,
   1171  * UCAL_LEAST_MAXIMUM, UCAL_ACTUAL_MINIMUM, UCAL_ACTUAL_MAXIMUM
   1172  * @param status A pointer to an UErrorCode to receive any errors.
   1173  * @return The requested value.
   1174  * @stable ICU 2.0
   1175  */
   1176 U_STABLE int32_t U_EXPORT2
   1177 ucal_getLimit(const UCalendar*     cal,
   1178               UCalendarDateFields  field,
   1179               UCalendarLimitType   type,
   1180               UErrorCode*          status);
   1181 
   1182 /** Get the locale for this calendar object. You can choose between valid and actual locale.
   1183  *  @param cal The calendar object
   1184  *  @param type type of the locale we're looking for (valid or actual)
   1185  *  @param status error code for the operation
   1186  *  @return the locale name
   1187  *  @stable ICU 2.8
   1188  */
   1189 U_STABLE const char * U_EXPORT2
   1190 ucal_getLocaleByType(const UCalendar *cal, ULocDataLocaleType type, UErrorCode* status);
   1191 
   1192 /**
   1193  * Returns the timezone data version currently used by ICU.
   1194  * @param status error code for the operation
   1195  * @return the version string, such as "2007f"
   1196  * @stable ICU 3.8
   1197  */
   1198 U_STABLE const char * U_EXPORT2
   1199 ucal_getTZDataVersion(UErrorCode* status);
   1200 
   1201 /**
   1202  * Returns the canonical system timezone ID or the normalized
   1203  * custom time zone ID for the given time zone ID.
   1204  * @param id        The input timezone ID to be canonicalized.
   1205  * @param len       The length of id, or -1 if null-terminated.
   1206  * @param result    The buffer receives the canonical system timezone ID
   1207  *                  or the custom timezone ID in normalized format.
   1208  * @param resultCapacity    The capacity of the result buffer.
   1209  * @param isSystemID        Receives if the given ID is a known system
   1210      *                      timezone ID.
   1211  * @param status    Recevies the status.  When the given timezone ID
   1212  *                  is neither a known system time zone ID nor a
   1213  *                  valid custom timezone ID, U_ILLEGAL_ARGUMENT_ERROR
   1214  *                  is set.
   1215  * @return          The result string length, not including the terminating
   1216  *                  null.
   1217  * @stable ICU 4.0
   1218  */
   1219 U_STABLE int32_t U_EXPORT2
   1220 ucal_getCanonicalTimeZoneID(const UChar* id, int32_t len,
   1221                             UChar* result, int32_t resultCapacity, UBool *isSystemID, UErrorCode* status);
   1222 /**
   1223  * Get the resource keyword value string designating the calendar type for the UCalendar.
   1224  * @param cal The UCalendar to query.
   1225  * @param status The error code for the operation.
   1226  * @return The resource keyword value string.
   1227  * @stable ICU 4.2
   1228  */
   1229 U_STABLE const char * U_EXPORT2
   1230 ucal_getType(const UCalendar *cal, UErrorCode* status);
   1231 
   1232 /**
   1233  * Given a key and a locale, returns an array of string values in a preferred
   1234  * order that would make a difference. These are all and only those values where
   1235  * the open (creation) of the service with the locale formed from the input locale
   1236  * plus input keyword and that value has different behavior than creation with the
   1237  * input locale alone.
   1238  * @param key           one of the keys supported by this service.  For now, only
   1239  *                      "calendar" is supported.
   1240  * @param locale        the locale
   1241  * @param commonlyUsed  if set to true it will return only commonly used values
   1242  *                      with the given locale in preferred order.  Otherwise,
   1243  *                      it will return all the available values for the locale.
   1244  * @param status error status
   1245  * @return a string enumeration over keyword values for the given key and the locale.
   1246  * @stable ICU 4.2
   1247  */
   1248 U_STABLE UEnumeration* U_EXPORT2
   1249 ucal_getKeywordValuesForLocale(const char* key,
   1250                                const char* locale,
   1251                                UBool commonlyUsed,
   1252                                UErrorCode* status);
   1253 
   1254 
   1255 /** Weekday types, as returned by ucal_getDayOfWeekType().
   1256  * @stable ICU 4.4
   1257  */
   1258 enum UCalendarWeekdayType {
   1259   /**
   1260    * Designates a full weekday (no part of the day is included in the weekend).
   1261    * @stable ICU 4.4
   1262    */
   1263   UCAL_WEEKDAY,
   1264   /**
   1265    * Designates a full weekend day (the entire day is included in the weekend).
   1266    * @stable ICU 4.4
   1267    */
   1268   UCAL_WEEKEND,
   1269   /**
   1270    * Designates a day that starts as a weekday and transitions to the weekend.
   1271    * Call ucal_getWeekendTransition() to get the time of transition.
   1272    * @stable ICU 4.4
   1273    */
   1274   UCAL_WEEKEND_ONSET,
   1275   /**
   1276    * Designates a day that starts as the weekend and transitions to a weekday.
   1277    * Call ucal_getWeekendTransition() to get the time of transition.
   1278    * @stable ICU 4.4
   1279    */
   1280   UCAL_WEEKEND_CEASE
   1281 };
   1282 
   1283 /** @stable ICU 4.4 */
   1284 typedef enum UCalendarWeekdayType UCalendarWeekdayType;
   1285 
   1286 /**
   1287  * Returns whether the given day of the week is a weekday, a
   1288  * weekend day, or a day that transitions from one to the other,
   1289  * in this calendar system. If a transition occurs at midnight,
   1290  * then the days before and after the transition will have the
   1291  * type UCAL_WEEKDAY or UCAL_WEEKEND. If a transition occurs at a time
   1292  * other than midnight, then the day of the transition will have
   1293  * the type UCAL_WEEKEND_ONSET or UCAL_WEEKEND_CEASE. In this case, the
   1294  * method getWeekendTransition() will return the point of
   1295  * transition.
   1296  * @param cal The UCalendar to query.
   1297  * @param dayOfWeek The day of the week whose type is desired (UCAL_SUNDAY..UCAL_SATURDAY).
   1298  * @param status The error code for the operation.
   1299  * @return The UCalendarWeekdayType for the day of the week.
   1300  * @stable ICU 4.4
   1301  */
   1302 U_STABLE UCalendarWeekdayType U_EXPORT2
   1303 ucal_getDayOfWeekType(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode* status);
   1304 
   1305 /**
   1306  * Returns the time during the day at which the weekend begins or ends in
   1307  * this calendar system.  If ucal_getDayOfWeekType() rerturns UCAL_WEEKEND_ONSET
   1308  * for the specified dayOfWeek, return the time at which the weekend begins.
   1309  * If ucal_getDayOfWeekType() returns UCAL_WEEKEND_CEASE for the specified dayOfWeek,
   1310  * return the time at which the weekend ends. If ucal_getDayOfWeekType() returns
   1311  * some other UCalendarWeekdayType for the specified dayOfWeek, is it an error condition
   1312  * (U_ILLEGAL_ARGUMENT_ERROR).
   1313  * @param cal The UCalendar to query.
   1314  * @param dayOfWeek The day of the week for which the weekend transition time is
   1315  * desired (UCAL_SUNDAY..UCAL_SATURDAY).
   1316  * @param status The error code for the operation.
   1317  * @return The milliseconds after midnight at which the weekend begins or ends.
   1318  * @stable ICU 4.4
   1319  */
   1320 U_STABLE int32_t U_EXPORT2
   1321 ucal_getWeekendTransition(const UCalendar *cal, UCalendarDaysOfWeek dayOfWeek, UErrorCode *status);
   1322 
   1323 /**
   1324  * Returns TRUE if the given UDate is in the weekend in
   1325  * this calendar system.
   1326  * @param cal The UCalendar to query.
   1327  * @param date The UDate in question.
   1328  * @param status The error code for the operation.
   1329  * @return TRUE if the given UDate is in the weekend in
   1330  * this calendar system, FALSE otherwise.
   1331  * @stable ICU 4.4
   1332  */
   1333 U_STABLE UBool U_EXPORT2
   1334 ucal_isWeekend(const UCalendar *cal, UDate date, UErrorCode *status);
   1335 
   1336 /**
   1337  * Return the difference between the target time and the time this calendar object is currently set to.
   1338  * If the target time is after the current calendar setting, the the returned value will be positive.
   1339  * The field parameter specifies the units of the return value. For example, if field is UCAL_MONTH
   1340  * and ucal_getFieldDifference returns 3, then the target time is 3 to less than 4 months after the
   1341  * current calendar setting.
   1342  *
   1343  * As a side effect of this call, this calendar is advanced toward target by the given amount. That is,
   1344  * calling this function has the side effect of calling ucal_add on this calendar with the specified
   1345  * field and an amount equal to the return value from this function.
   1346  *
   1347  * A typical way of using this function is to call it first with the largest field of interest, then
   1348  * with progressively smaller fields.
   1349  *
   1350  * @param cal The UCalendar to compare and update.
   1351  * @param target The target date to compare to the current calendar setting.
   1352  * @param field The field to compare; one of UCAL_ERA, UCAL_YEAR, UCAL_MONTH,
   1353  * UCAL_WEEK_OF_YEAR, UCAL_WEEK_OF_MONTH, UCAL_DATE, UCAL_DAY_OF_YEAR, UCAL_DAY_OF_WEEK,
   1354  * UCAL_DAY_OF_WEEK_IN_MONTH, UCAL_AM_PM, UCAL_HOUR, UCAL_HOUR_OF_DAY, UCAL_MINUTE, UCAL_SECOND,
   1355  * UCAL_MILLISECOND, UCAL_ZONE_OFFSET, UCAL_DST_OFFSET.
   1356  * @param status A pointer to an UErrorCode to receive any errors
   1357  * @return The date difference for the specified field.
   1358  * @draft ICU 4.8
   1359  */
   1360 U_DRAFT int32_t U_EXPORT2
   1361 ucal_getFieldDifference(UCalendar* cal,
   1362                         UDate target,
   1363                         UCalendarDateFields field,
   1364                         UErrorCode* status);
   1365 
   1366 
   1367 #endif /* #if !UCONFIG_NO_FORMATTING */
   1368 
   1369 #endif
   1370