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 < 24:00 on Jan 1, 1970 < 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) < 12:01 am, and 12:00 pm (noon) < 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