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