175 * The Japanese calendar uses a combination of era name and year number. 176 * When an emperor of Japan abdicates and a new emperor ascends the throne, 177 * a new era is declared and year number is reset to 1. Even if the date of 178 * abdication is scheduled ahead of time, the new era name might not be 179 * announced until just before the date. In such case, ICU4C may include 180 * a start date of future era without actual era name, but not enabled 181 * by default. ICU4C users who want to test the behavior of the future era 182 * can enable the tentative era by: 183 *
ICU_ENABLE_TENTATIVE_ERA=true
595 * NOTE: Do not use this method -- use roll(EDateFields, int, UErrorCode&) instead. 596 * 597 * @param field The time field. 598 * @param up Indicates if the value of the specified time field is to be rolled 599 * up or rolled down. Use true if rolling up, false otherwise. 600 * @param status Output param set to success/failure code on exit. If any value 601 * previously set in the time field is invalid or restricted by 602 * leniency, this will be set to an error status. 603 * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, UBool up, UErrorCode& status) instead. 604 */ 605 inline void roll(EDateFields field, UBool up, UErrorCode& status); 606 #endif /* U_HIDE_DEPRECATED_API */ 607 608 /** 609 * Time Field Rolling function. Rolls (up/down) a single unit of time on the given 610 * time field. For example, to roll the current date up by one day, call 611 * roll(Calendar::DATE, true). When rolling on the year or Calendar::YEAR field, it 612 * will roll the year value in the range between getMinimum(Calendar::YEAR) and the 613 * value returned by getMaximum(Calendar::YEAR). When rolling on the month or 614 * Calendar::MONTH field, other fields like date might conflict and, need to be 615 * changed. For instance, rolling the month up on the date 01/31/96 will result in 616 * 02/29/96. Rolling up always means rolling forward in time (unless the limit of the 617 * field is reached, in which case it may pin or wrap), so for Gregorian calendar, 618 * starting with 100 BC and rolling the year up results in 99 BC. 619 * When eras have a definite beginning and end (as in the Chinese calendar, or as in 620 * most eras in the Japanese calendar) then rolling the year past either limit of the 621 * era will cause the year to wrap around. When eras only have a limit at one end, 622 * then attempting to roll the year past that limit will result in pinning the year 623 * at that limit. Note that for most calendars in which era 0 years move forward in 624 * time (such as Buddhist, Hebrew, or Islamic), it is possible for add or roll to 625 * result in negative years for era 0 (that is the only way to represent years before 626 * the calendar epoch). 627 * When rolling on the hour-in-day or Calendar::HOUR_OF_DAY field, it will roll the 628 * hour value in the range between 0 and 23, which is zero-based. 629 *
630 * NOTE: Do not use this method -- use roll(UCalendarDateFields, int, UErrorCode&) instead. 631 * 632 * @param field The time field. 633 * @param up Indicates if the value of the specified time field is to be rolled 634 * up or rolled down. Use true if rolling up, false otherwise. 635 * @param status Output param set to success/failure code on exit. If any value 636 * previously set in the time field is invalid or restricted by 637 * leniency, this will be set to an error status. 638 * @stable ICU 2.6. 639 */ 640 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status); 641 642 #ifndef U_FORCE_HIDE_DEPRECATED_API 643 /** 644 * Time Field Rolling function. Rolls by the given amount on the given 645 * time field. For example, to roll the current date up by one day, call 646 * roll(Calendar::DATE, +1, status). When rolling on the month or 647 * Calendar::MONTH field, other fields like date might conflict and, need to be 648 * changed. For instance, rolling the month up on the date 01/31/96 will result in 649 * 02/29/96. Rolling by a positive value always means rolling forward in time (unless 650 * the limit of the field is reached, in which case it may pin or wrap), so for 651 * Gregorian calendar, starting with 100 BC and rolling the year by + 1 results in 99 BC. 652 * When eras have a definite beginning and end (as in the Chinese calendar, or as in 653 * most eras in the Japanese calendar) then rolling the year past either limit of the 654 * era will cause the year to wrap around. When eras only have a limit at one end, 655 * then attempting to roll the year past that limit will result in pinning the year 656 * at that limit. Note that for most calendars in which era 0 years move forward in 657 * time (such as Buddhist, Hebrew, or Islamic), it is possible for add or roll to 658 * result in negative years for era 0 (that is the only way to represent years before 659 * the calendar epoch). 660 * When rolling on the hour-in-day or Calendar::HOUR_OF_DAY field, it will roll the 661 * hour value in the range between 0 and 23, which is zero-based. 662 *
663 * The only difference between roll() and add() is that roll() does not change 664 * the value of more significant fields when it reaches the minimum or maximum 665 * of its range, whereas add() does. 666 * 667 * @param field The time field. 668 * @param amount Indicates amount to roll. 669 * @param status Output param set to success/failure code on exit. If any value 670 * previously set in the time field is invalid, this will be set to 671 * an error status. 672 * @deprecated ICU 2.6. Use roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) instead. 673 */ 674 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); 675 #endif // U_FORCE_HIDE_DEPRECATED_API 676 677 /** 678 * Time Field Rolling function. Rolls by the given amount on the given 679 * time field. For example, to roll the current date up by one day, call 680 * roll(Calendar::DATE, +1, status). When rolling on the month or 681 * Calendar::MONTH field, other fields like date might conflict and, need to be 682 * changed. For instance, rolling the month up on the date 01/31/96 will result in 683 * 02/29/96. Rolling by a positive value always means rolling forward in time (unless 684 * the limit of the field is reached, in which case it may pin or wrap), so for 685 * Gregorian calendar, starting with 100 BC and rolling the year by + 1 results in 99 BC. 686 * When eras have a definite beginning and end (as in the Chinese calendar, or as in 687 * most eras in the Japanese calendar) then rolling the year past either limit of the 688 * era will cause the year to wrap around. When eras only have a limit at one end, 689 * then attempting to roll the year past that limit will result in pinning the year 690 * at that limit. Note that for most calendars in which era 0 years move forward in 691 * time (such as Buddhist, Hebrew, or Islamic), it is possible for add or roll to 692 * result in negative years for era 0 (that is the only way to represent years before 693 * the calendar epoch). 694 * When rolling on the hour-in-day or Calendar::HOUR_OF_DAY field, it will roll the 695 * hour value in the range between 0 and 23, which is zero-based. 696 *
697 * The only difference between roll() and add() is that roll() does not change 698 * the value of more significant fields when it reaches the minimum or maximum 699 * of its range, whereas add() does. 700 * 701 * @param field The time field. 702 * @param amount Indicates amount to roll. 703 * @param status Output param set to success/failure code on exit. If any value 704 * previously set in the time field is invalid, this will be set to 705 * an error status. 706 * @stable ICU 2.6. 707 */ 708 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); 709 710 #ifndef U_FORCE_HIDE_DEPRECATED_API 711 /** 712 * Return the difference between the given time and the time this 713 * calendar object is set to. If this calendar is set 714 * before the given time, the returned value will be 715 * positive. If this calendar is set after the given 716 * time, the returned value will be negative. The 717 * field parameter specifies the units of the return 718 * value. For example, if fieldDifference(when, 719 * Calendar::MONTH) returns 3, then this calendar is set to 720 * 3 months before when, and possibly some addition 721 * time less than one month. 722 * 723 *
field
fieldDifference(when, 719 * Calendar::MONTH)
when
As a side effect of this call, this calendar is advanced 724 * toward when by the given amount. That is, calling 725 * this method has the side effect of calling add(field, 726 * n), where n is the return value. 727 * 728 *
add(field, 726 * n)
n
Usage: To use this method, call it first with the largest 729 * field of interest, then with progressively smaller fields. For 730 * example: 731 * 732 *
733 * int y = cal->fieldDifference(when, Calendar::YEAR, err); 734 * int m = cal->fieldDifference(when, Calendar::MONTH, err); 735 * int d = cal->fieldDifference(when, Calendar::DATE, err);
cal
Note: fieldDifference() is 741 * asymmetrical. That is, in the following code: 742 * 743 *
fieldDifference()
744 * cal->setTime(date1, err); 745 * int m1 = cal->fieldDifference(date2, Calendar::MONTH, err); 746 * int d1 = cal->fieldDifference(date2, Calendar::DATE, err); 747 * cal->setTime(date2, err); 748 * int m2 = cal->fieldDifference(date1, Calendar::MONTH, err); 749 * int d2 = cal->fieldDifference(date1, Calendar::DATE, err);
m1 == -m2 && d1 == -d2
fieldDifference(when, 777 * Calendar::MONTH)
As a side effect of this call, this calendar is advanced 782 * toward when by the given amount. That is, calling 783 * this method has the side effect of calling add(field, 784 * n), where n is the return value. 785 * 786 *
add(field, 784 * n)
Usage: To use this method, call it first with the largest 787 * field of interest, then with progressively smaller fields. For 788 * example: 789 * 790 *
791 * int y = cal->fieldDifference(when, Calendar::YEAR, err); 792 * int m = cal->fieldDifference(when, Calendar::MONTH, err); 793 * int d = cal->fieldDifference(when, Calendar::DATE, err);
Note: fieldDifference() is 799 * asymmetrical. That is, in the following code: 800 * 801 *
802 * cal->setTime(date1, err); 803 * int m1 = cal->fieldDifference(date2, Calendar::MONTH, err); 804 * int d1 = cal->fieldDifference(date2, Calendar::DATE, err); 805 * cal->setTime(date2, err); 806 * int m2 = cal->fieldDifference(date1, Calendar::MONTH, err); 807 * int d2 = cal->fieldDifference(date1, Calendar::DATE, err);
UCAL_WALLTIME_FIRST
UCAL_WALLTIME_LAST
907 * Note:When UCAL_WALLTIME_NEXT_VALID is not a valid 908 * option for this. When the argument is neither UCAL_WALLTIME_FIRST 909 * nor UCAL_WALLTIME_LAST, this method has no effect and will keep 910 * the current setting. 911 * 912 * @param option the behavior for handling repeating wall time, either 913 * UCAL_WALLTIME_FIRST or UCAL_WALLTIME_LAST. 914 * @see #getRepeatedWallTimeOption 915 * @stable ICU 49 916 */ 917 void setRepeatedWallTimeOption(UCalendarWallTimeOption option); 918 919 /** 920 * Gets the behavior for handling wall time repeating multiple times 921 * at negative time zone offset transitions. 922 * 923 * @return the behavior for handling repeating wall time, either 924 * UCAL_WALLTIME_FIRST or UCAL_WALLTIME_LAST. 925 * @see #setRepeatedWallTimeOption 926 * @stable ICU 49 927 */ 928 UCalendarWallTimeOption getRepeatedWallTimeOption(void) const; 929 930 /** 931 * Sets the behavior for handling skipped wall time at positive time zone offset 932 * transitions. For example, 2:30 AM on March 13, 2011 in US Eastern time (America/New_York) 933 * does not exist because the wall time jump from 1:59 AM EST to 3:00 AM EDT. When 934 * UCAL_WALLTIME_FIRST is used, 2:30 AM is interpreted as 30 minutes before 3:00 AM 935 * EDT, therefore, it will be resolved as 1:30 AM EST. When UCAL_WALLTIME_LAST 936 * is used, 2:30 AM is interpreted as 31 minutes after 1:59 AM EST, therefore, it will be 937 * resolved as 3:30 AM EDT. When UCAL_WALLTIME_NEXT_VALID is used, 2:30 AM will 938 * be resolved as next valid wall time, that is 3:00 AM EDT. The default value is 939 * UCAL_WALLTIME_LAST. 940 *
UCAL_WALLTIME_NEXT_VALID
941 * Note:This option is effective only when this calendar is lenient. 942 * When the calendar is strict, such non-existing wall time will cause an error. 943 * 944 * @param option the behavior for handling skipped wall time at positive time zone 945 * offset transitions, one of UCAL_WALLTIME_FIRST, UCAL_WALLTIME_LAST and 946 * UCAL_WALLTIME_NEXT_VALID. 947 * @see #getSkippedWallTimeOption 948 * 949 * @stable ICU 49 950 */ 951 void setSkippedWallTimeOption(UCalendarWallTimeOption option); 952 953 /** 954 * Gets the behavior for handling skipped wall time at positive time zone offset 955 * transitions. 956 * 957 * @return the behavior for handling skipped wall time, one of 958 * UCAL_WALLTIME_FIRST, UCAL_WALLTIME_LAST 959 * and UCAL_WALLTIME_NEXT_VALID. 960 * @see #setSkippedWallTimeOption 961 * @stable ICU 49 962 */ 963 UCalendarWallTimeOption getSkippedWallTimeOption(void) const; 964 965 /** 966 * Sets what the first day of the week is; e.g., Sunday in US, Monday in France. 967 * 968 * @param value The given first day of the week. 969 * @stable ICU 2.6. 970 */ 971 void setFirstDayOfWeek(UCalendarDaysOfWeek value); 972 973 #ifndef U_HIDE_DEPRECATED_API 974 /** 975 * Gets what the first day of the week is; e.g., Sunday in US, Monday in France. 976 * 977 * @return The first day of the week. 978 * @deprecated ICU 2.6 use the overload with error code 979 */ 980 EDaysOfWeek getFirstDayOfWeek(void) const; 981 #endif /* U_HIDE_DEPRECATED_API */ 982 983 /** 984 * Gets what the first day of the week is; e.g., Sunday in US, Monday in France. 985 * 986 * @param status error code 987 * @return The first day of the week. 988 * @stable ICU 2.6 989 */ 990 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const; 991 992 /** 993 * Sets what the minimal days required in the first week of the year are; For 994 * example, if the first week is defined as one that contains the first day of the 995 * first month of a year, call the method with value 1. If it must be a full week, 996 * use value 7. 997 * 998 * @param value The given minimal days required in the first week of the year. 999 * @stable ICU 2.0 1000 */ 1001 void setMinimalDaysInFirstWeek(uint8_t value); 1002 1003 /** 1004 * Gets what the minimal days required in the first week of the year are; e.g., if 1005 * the first week is defined as one that contains the first day of the first month 1006 * of a year, getMinimalDaysInFirstWeek returns 1. If the minimal days required must 1007 * be a full week, getMinimalDaysInFirstWeek returns 7. 1008 * 1009 * @return The minimal days required in the first week of the year. 1010 * @stable ICU 2.0 1011 */ 1012 uint8_t getMinimalDaysInFirstWeek(void) const; 1013 1014 #ifndef U_FORCE_HIDE_DEPRECATED_API 1015 /** 1016 * Gets the minimum value for the given time field. e.g., for Gregorian 1017 * DAY_OF_MONTH, 1. 1018 * 1019 * @param field The given time field. 1020 * @return The minimum value for the given time field. 1021 * @deprecated ICU 2.6. Use getMinimum(UCalendarDateFields field) instead. 1022 */ 1023 virtual int32_t getMinimum(EDateFields field) const; 1024 #endif // U_FORCE_HIDE_DEPRECATED_API 1025 1026 /** 1027 * Gets the minimum value for the given time field. e.g., for Gregorian 1028 * DAY_OF_MONTH, 1. 1029 * 1030 * @param field The given time field. 1031 * @return The minimum value for the given time field. 1032 * @stable ICU 2.6. 1033 */ 1034 virtual int32_t getMinimum(UCalendarDateFields field) const; 1035 1036 #ifndef U_FORCE_HIDE_DEPRECATED_API 1037 /** 1038 * Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH, 1039 * 31. 1040 * 1041 * @param field The given time field. 1042 * @return The maximum value for the given time field. 1043 * @deprecated ICU 2.6. Use getMaximum(UCalendarDateFields field) instead. 1044 */ 1045 virtual int32_t getMaximum(EDateFields field) const; 1046 #endif // U_FORCE_HIDE_DEPRECATED_API 1047 1048 /** 1049 * Gets the maximum value for the given time field. e.g. for Gregorian DAY_OF_MONTH, 1050 * 31. 1051 * 1052 * @param field The given time field. 1053 * @return The maximum value for the given time field. 1054 * @stable ICU 2.6. 1055 */ 1056 virtual int32_t getMaximum(UCalendarDateFields field) const; 1057 1058 #ifndef U_FORCE_HIDE_DEPRECATED_API 1059 /** 1060 * Gets the highest minimum value for the given field if varies. Otherwise same as 1061 * getMinimum(). For Gregorian, no difference. 1062 * 1063 * @param field The given time field. 1064 * @return The highest minimum value for the given time field. 1065 * @deprecated ICU 2.6. Use getGreatestMinimum(UCalendarDateFields field) instead. 1066 */ 1067 virtual int32_t getGreatestMinimum(EDateFields field) const; 1068 #endif // U_FORCE_HIDE_DEPRECATED_API 1069 1070 /** 1071 * Gets the highest minimum value for the given field if varies. Otherwise same as 1072 * getMinimum(). For Gregorian, no difference. 1073 * 1074 * @param field The given time field. 1075 * @return The highest minimum value for the given time field. 1076 * @stable ICU 2.6. 1077 */ 1078 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; 1079 1080 #ifndef U_FORCE_HIDE_DEPRECATED_API 1081 /** 1082 * Gets the lowest maximum value for the given field if varies. Otherwise same as 1083 * getMaximum(). e.g., for Gregorian DAY_OF_MONTH, 28. 1084 * 1085 * @param field The given time field. 1086 * @return The lowest maximum value for the given time field. 1087 * @deprecated ICU 2.6. Use getLeastMaximum(UCalendarDateFields field) instead. 1088 */ 1089 virtual int32_t getLeastMaximum(EDateFields field) const; 1090 #endif // U_FORCE_HIDE_DEPRECATED_API 1091 1092 /** 1093 * Gets the lowest maximum value for the given field if varies. Otherwise same as 1094 * getMaximum(). e.g., for Gregorian DAY_OF_MONTH, 28. 1095 * 1096 * @param field The given time field. 1097 * @return The lowest maximum value for the given time field. 1098 * @stable ICU 2.6. 1099 */ 1100 virtual int32_t getLeastMaximum(UCalendarDateFields field) const; 1101 1102 #ifndef U_HIDE_DEPRECATED_API 1103 /** 1104 * Return the minimum value that this field could have, given the current date. 1105 * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). 1106 * 1107 * The version of this function on Calendar uses an iterative algorithm to determine the 1108 * actual minimum value for the field. There is almost always a more efficient way to 1109 * accomplish this (in most cases, you can simply return getMinimum()). GregorianCalendar 1110 * overrides this function with a more efficient implementation. 1111 * 1112 * @param field the field to determine the minimum of 1113 * @param status Fill-in parameter which receives the status of this operation. 1114 * @return the minimum of the given field for the current date of this Calendar 1115 * @deprecated ICU 2.6. Use getActualMinimum(UCalendarDateFields field, UErrorCode& status) instead. 1116 */ 1117 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; 1118 #endif /* U_HIDE_DEPRECATED_API */ 1119 1120 /** 1121 * Return the minimum value that this field could have, given the current date. 1122 * For the Gregorian calendar, this is the same as getMinimum() and getGreatestMinimum(). 1123 * 1124 * The version of this function on Calendar uses an iterative algorithm to determine the 1125 * actual minimum value for the field. There is almost always a more efficient way to 1126 * accomplish this (in most cases, you can simply return getMinimum()). GregorianCalendar 1127 * overrides this function with a more efficient implementation. 1128 * 1129 * @param field the field to determine the minimum of 1130 * @param status Fill-in parameter which receives the status of this operation. 1131 * @return the minimum of the given field for the current date of this Calendar 1132 * @stable ICU 2.6. 1133 */ 1134 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const; 1135 1136 /** 1137 * Return the maximum value that this field could have, given the current date. 1138 * For example, with the date "Feb 3, 1997" and the DAY_OF_MONTH field, the actual 1139 * maximum would be 28; for "Feb 3, 1996" it s 29. Similarly for a Hebrew calendar, 1140 * for some years the actual maximum for MONTH is 12, and for others 13. 1141 * 1142 * The version of this function on Calendar uses an iterative algorithm to determine the 1143 * actual maximum value for the field. There is almost always a more efficient way to 1144 * accomplish this (in most cases, you can simply return getMaximum()). GregorianCalendar 1145 * overrides this function with a more efficient implementation. 1146 * 1147 * @param field the field to determine the maximum of 1148 * @param status Fill-in parameter which receives the status of this operation. 1149 * @return the maximum of the given field for the current date of this Calendar 1150 * @stable ICU 2.6. 1151 */ 1152 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; 1153 1154 /** 1155 * Gets the value for a given time field. Recalculate the current time field values 1156 * if the time value has been changed by a call to setTime(). Return zero for unset 1157 * fields if any fields have been explicitly set by a call to set(). To force a 1158 * recomputation of all fields regardless of the previous state, call complete(). 1159 * This method is semantically const, but may alter the object in memory. 1160 * 1161 * @param field The given time field. 1162 * @param status Fill-in parameter which receives the status of the operation. 1163 * @return The value for the given time field, or zero if the field is unset, 1164 * and set() has been called for any other field. 1165 * @stable ICU 2.6. 1166 */ 1167 int32_t get(UCalendarDateFields field, UErrorCode& status) const; 1168 1169 /** 1170 * Determines if the given time field has a value set. This can affect in the 1171 * resolving of time in Calendar. Unset fields have a value of zero, by definition. 1172 * 1173 * @param field The given time field. 1174 * @return True if the given time field has a value set; false otherwise. 1175 * @stable ICU 2.6. 1176 */ 1177 UBool isSet(UCalendarDateFields field) const; 1178 1179 /** 1180 * Sets the given time field with the given value. 1181 * 1182 * @param field The given time field. 1183 * @param value The value to be set for the given time field. 1184 * @stable ICU 2.6. 1185 */ 1186 void set(UCalendarDateFields field, int32_t value); 1187 1188 /** 1189 * Sets the values for the fields YEAR, MONTH, and DATE. Other field values are 1190 * retained; call clear() first if this is not desired. 1191 * 1192 * @param year The value used to set the YEAR time field. 1193 * @param month The value used to set the MONTH time field. Month value is 0-based. 1194 * e.g., 0 for January. 1195 * @param date The value used to set the DATE time field. 1196 * @stable ICU 2.0 1197 */ 1198 void set(int32_t year, int32_t month, int32_t date); 1199 1200 /** 1201 * Sets the values for the fields YEAR, MONTH, DATE, HOUR_OF_DAY, and MINUTE. Other 1202 * field values are retained; call clear() first if this is not desired. 1203 * 1204 * @param year The value used to set the YEAR time field. 1205 * @param month The value used to set the MONTH time field. Month value is 1206 * 0-based. E.g., 0 for January. 1207 * @param date The value used to set the DATE time field. 1208 * @param hour The value used to set the HOUR_OF_DAY time field. 1209 * @param minute The value used to set the MINUTE time field. 1210 * @stable ICU 2.0 1211 */ 1212 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute); 1213 1214 /** 1215 * Sets the values for the fields YEAR, MONTH, DATE, HOUR_OF_DAY, MINUTE, and SECOND. 1216 * Other field values are retained; call clear() first if this is not desired. 1217 * 1218 * @param year The value used to set the YEAR time field. 1219 * @param month The value used to set the MONTH time field. Month value is 1220 * 0-based. E.g., 0 for January. 1221 * @param date The value used to set the DATE time field. 1222 * @param hour The value used to set the HOUR_OF_DAY time field. 1223 * @param minute The value used to set the MINUTE time field. 1224 * @param second The value used to set the SECOND time field. 1225 * @stable ICU 2.0 1226 */ 1227 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second); 1228 1229 /** 1230 * Clears the values of all the time fields, making them both unset and assigning 1231 * them a value of zero. The field values will be determined during the next 1232 * resolving of time into time fields. 1233 * @stable ICU 2.0 1234 */ 1235 void clear(void); 1236 1237 /** 1238 * Clears the value in the given time field, both making it unset and assigning it a 1239 * value of zero. This field value will be determined during the next resolving of 1240 * time into time fields. Clearing UCAL_ORDINAL_MONTH or UCAL_MONTH will 1241 * clear both fields. 1242 * 1243 * @param field The time field to be cleared. 1244 * @stable ICU 2.6. 1245 */ 1246 void clear(UCalendarDateFields field); 1247 1248 /** 1249 * Returns a unique class ID POLYMORPHICALLY. Pure virtual method. This method is to 1250 * implement a simple version of RTTI, since not all C++ compilers support genuine 1251 * RTTI. Polymorphic operator==() and clone() methods call this method. 1252 *
1253 * Concrete subclasses of Calendar must implement getDynamicClassID() and also a 1254 * static method and data member: 1255 * 1256 * static UClassID getStaticClassID() { return (UClassID)&fgClassID; } 1257 * static char fgClassID; 1258 * 1259 * @return The class ID for this object. All objects of a given class have the 1260 * same class ID. Objects of other classes have different class IDs. 1261 * @stable ICU 2.0 1262 */ 1263 virtual UClassID getDynamicClassID(void) const override = 0; 1264 1265 /** 1266 * Returns the calendar type name string for this Calendar object. 1267 * The returned string is the legacy ICU calendar attribute value, 1268 * for example, "gregorian" or "japanese". 1269 * 1270 * See type="old type name" for the calendar attribute of locale IDs 1271 * at http://www.unicode.org/reports/tr35/#Key_Type_Definitions 1272 * 1273 * Sample code for getting the LDML/BCP 47 calendar key value: 1274 * \code 1275 * const char *calType = cal->getType(); 1276 * if (0 == strcmp(calType, "unknown")) { 1277 * // deal with unknown calendar type 1278 * } else { 1279 * string localeID("root@calendar="); 1280 * localeID.append(calType); 1281 * char langTag[100]; 1282 * UErrorCode errorCode = U_ZERO_ERROR; 1283 * int32_t length = uloc_toLanguageTag(localeID.c_str(), langTag, (int32_t)sizeof(langTag), true, &errorCode); 1284 * if (U_FAILURE(errorCode)) { 1285 * // deal with errors & overflow 1286 * } 1287 * string lang(langTag, length); 1288 * size_t caPos = lang.find("-ca-"); 1289 * lang.erase(0, caPos + 4); 1290 * // lang now contains the LDML calendar type 1291 * } 1292 * \endcode 1293 * 1294 * @return legacy calendar type name string 1295 * @stable ICU 49 1296 */ 1297 virtual const char * getType() const = 0; 1298 1299 /** 1300 * Returns whether the given day of the week is a weekday, a weekend day, 1301 * or a day that transitions from one to the other, for the locale and 1302 * calendar system associated with this Calendar (the locale's region is 1303 * often the most determinant factor). If a transition occurs at midnight, 1304 * then the days before and after the transition will have the 1305 * type UCAL_WEEKDAY or UCAL_WEEKEND. If a transition occurs at a time 1306 * other than midnight, then the day of the transition will have 1307 * the type UCAL_WEEKEND_ONSET or UCAL_WEEKEND_CEASE. In this case, the 1308 * method getWeekendTransition() will return the point of 1309 * transition. 1310 * @param dayOfWeek The day of the week whose type is desired (UCAL_SUNDAY..UCAL_SATURDAY). 1311 * @param status The error code for the operation. 1312 * @return The UCalendarWeekdayType for the day of the week. 1313 * @stable ICU 4.4 1314 */ 1315 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const; 1316 1317 /** 1318 * Returns the time during the day at which the weekend begins or ends in 1319 * this calendar system. If getDayOfWeekType() returns UCAL_WEEKEND_ONSET 1320 * for the specified dayOfWeek, return the time at which the weekend begins. 1321 * If getDayOfWeekType() returns UCAL_WEEKEND_CEASE for the specified dayOfWeek, 1322 * return the time at which the weekend ends. If getDayOfWeekType() returns 1323 * some other UCalendarWeekdayType for the specified dayOfWeek, is it an error condition 1324 * (U_ILLEGAL_ARGUMENT_ERROR). 1325 * @param dayOfWeek The day of the week for which the weekend transition time is 1326 * desired (UCAL_SUNDAY..UCAL_SATURDAY). 1327 * @param status The error code for the operation. 1328 * @return The milliseconds after midnight at which the weekend begins or ends. 1329 * @stable ICU 4.4 1330 */ 1331 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const; 1332 1333 /** 1334 * Returns true if the given UDate is in the weekend in 1335 * this calendar system. 1336 * @param date The UDate in question. 1337 * @param status The error code for the operation. 1338 * @return true if the given UDate is in the weekend in 1339 * this calendar system, false otherwise. 1340 * @stable ICU 4.4 1341 */ 1342 virtual UBool isWeekend(UDate date, UErrorCode &status) const; 1343 1344 /** 1345 * Returns true if this Calendar's current date-time is in the weekend in 1346 * this calendar system. 1347 * @return true if this Calendar's current date-time is in the weekend in 1348 * this calendar system, false otherwise. 1349 * @stable ICU 4.4 1350 */ 1351 virtual UBool isWeekend(void) const; 1352 1353 #ifndef U_FORCE_HIDE_DRAFT_API 1354 /** 1355 * Returns true if the date is in a leap year. Recalculate the current time 1356 * field values if the time value has been changed by a call to * setTime(). 1357 * This method is semantically const, but may alter the object in memory. 1358 * A "leap year" is a year that contains more days than other years (for 1359 * solar or lunar calendars) or more months than other years (for lunisolar 1360 * calendars like Hebrew or Chinese), as defined in the ECMAScript Temporal 1361 * proposal. 1362 * 1363 * @param status ICU Error Code 1364 * @return True if the date in the fields is in a Temporal proposal 1365 * defined leap year. False otherwise. 1366 * @draft ICU 73 1367 */ 1368 virtual bool inTemporalLeapYear(UErrorCode& status) const; 1369 1370 /** 1371 * Gets The Temporal monthCode value corresponding to the month for the date. 1372 * The value is a string identifier that starts with the literal grapheme 1373 * "M" followed by two graphemes representing the zero-padded month number 1374 * of the current month in a normal (non-leap) year and suffixed by an 1375 * optional literal grapheme "L" if this is a leap month in a lunisolar 1376 * calendar. The 25 possible values are "M01" .. "M13" and "M01L" .. "M12L". 1377 * For the Hebrew calendar, the values are "M01" .. "M12" for non-leap year, and 1378 * "M01" .. "M05", "M05L", "M06" .. "M12" for leap year. 1379 * For the Chinese calendar, the values are "M01" .. "M12" for non-leap year and 1380 * in leap year with another monthCode in "M01L" .. "M12L". 1381 * For Coptic and Ethiopian calendar, the Temporal monthCode values for any 1382 * years are "M01" to "M13". 1383 * 1384 * @param status ICU Error Code 1385 * @return One of 25 possible strings in {"M01".."M13", "M01L".."M12L"}. 1386 * @draft ICU 73 1387 */ 1388 virtual const char* getTemporalMonthCode(UErrorCode& status) const; 1389 1390 /** 1391 * Sets The Temporal monthCode which is a string identifier that starts 1392 * with the literal grapheme "M" followed by two graphemes representing 1393 * the zero-padded month number of the current month in a normal 1394 * (non-leap) year and suffixed by an optional literal grapheme "L" if this 1395 * is a leap month in a lunisolar calendar. The 25 possible values are 1396 * "M01" .. "M13" and "M01L" .. "M12L". For Hebrew calendar, the values are 1397 * "M01" .. "M12" for non-leap years, and "M01" .. "M05", "M05L", "M06" 1398 * .. "M12" for leap year. 1399 * For the Chinese calendar, the values are "M01" .. "M12" for non-leap year and 1400 * in leap year with another monthCode in "M01L" .. "M12L". 1401 * For Coptic and Ethiopian calendar, the Temporal monthCode values for any 1402 * years are "M01" to "M13". 1403 * 1404 * @param temporalMonth The value to be set for temporal monthCode. 1405 * @param status ICU Error Code 1406 * 1407 * @draft ICU 73 1408 */ 1409 virtual void setTemporalMonthCode(const char* temporalMonth, UErrorCode& status); 1410 1411 #endif // U_FORCE_HIDE_DRAFT_API 1412 1413 protected: 1414 1415 /** 1416 * Constructs a Calendar with the default time zone as returned by 1417 * TimeZone::createInstance(), and the default locale. 1418 * 1419 * @param success Indicates the status of Calendar object construction. Returns 1420 * U_ZERO_ERROR if constructed successfully. 1421 * @stable ICU 2.0 1422 */ 1423 Calendar(UErrorCode& success); 1424 1425 /** 1426 * Copy constructor 1427 * 1428 * @param source Calendar object to be copied from 1429 * @stable ICU 2.0 1430 */ 1431 Calendar(const Calendar& source); 1432 1433 /** 1434 * Default assignment operator 1435 * 1436 * @param right Calendar object to be copied 1437 * @stable ICU 2.0 1438 */ 1439 Calendar& operator=(const Calendar& right); 1440 1441 /** 1442 * Constructs a Calendar with the given time zone and locale. Clients are no longer 1443 * responsible for deleting the given time zone object after it's adopted. 1444 * 1445 * @param zone The given time zone. 1446 * @param aLocale The given locale. 1447 * @param success Indicates the status of Calendar object construction. Returns 1448 * U_ZERO_ERROR if constructed successfully. 1449 * @stable ICU 2.0 1450 */ 1451 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success); 1452 1453 /** 1454 * Constructs a Calendar with the given time zone and locale. 1455 * 1456 * @param zone The given time zone. 1457 * @param aLocale The given locale. 1458 * @param success Indicates the status of Calendar object construction. Returns 1459 * U_ZERO_ERROR if constructed successfully. 1460 * @stable ICU 2.0 1461 */ 1462 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); 1463 1464 /** 1465 * Converts Calendar's time field values to GMT as milliseconds. 1466 * 1467 * @param status Output param set to success/failure code on exit. If any value 1468 * previously set in the time field is invalid or restricted by 1469 * leniency, this will be set to an error status. 1470 * @stable ICU 2.0 1471 */ 1472 virtual void computeTime(UErrorCode& status); 1473 1474 /** 1475 * Converts GMT as milliseconds to time field values. This allows you to sync up the 1476 * time field values with a new time that is set for the calendar. This method 1477 * does NOT recompute the time first; to recompute the time, then the fields, use 1478 * the method complete(). 1479 * 1480 * @param status Output param set to success/failure code on exit. If any value 1481 * previously set in the time field is invalid or restricted by 1482 * leniency, this will be set to an error status. 1483 * @stable ICU 2.0 1484 */ 1485 virtual void computeFields(UErrorCode& status); 1486 1487 /** 1488 * Gets this Calendar's current time as a long. 1489 * 1490 * @param status Output param set to success/failure code on exit. If any value 1491 * previously set in the time field is invalid or restricted by 1492 * leniency, this will be set to an error status. 1493 * @return the current time as UTC milliseconds from the epoch. 1494 * @stable ICU 2.0 1495 */ 1496 double getTimeInMillis(UErrorCode& status) const; 1497 1498 /** 1499 * Sets this Calendar's current time from the given long value. 1500 * @param millis the new time in UTC milliseconds from the epoch. 1501 * @param status Output param set to success/failure code on exit. If any value 1502 * previously set in the time field is invalid or restricted by 1503 * leniency, this will be set to an error status. 1504 * @stable ICU 2.0 1505 */ 1506 void setTimeInMillis( double millis, UErrorCode& status ); 1507 1508 /** 1509 * Recomputes the current time from currently set fields, and then fills in any 1510 * unset fields in the time field list. 1511 * 1512 * @param status Output param set to success/failure code on exit. If any value 1513 * previously set in the time field is invalid or restricted by 1514 * leniency, this will be set to an error status. 1515 * @stable ICU 2.0 1516 */ 1517 void complete(UErrorCode& status); 1518 1519 #ifndef U_HIDE_DEPRECATED_API 1520 /** 1521 * Gets the value for a given time field. Subclasses can use this function to get 1522 * field values without forcing recomputation of time. 1523 * 1524 * @param field The given time field. 1525 * @return The value for the given time field. 1526 * @deprecated ICU 2.6. Use internalGet(UCalendarDateFields field) instead. 1527 */ 1528 inline int32_t internalGet(EDateFields field) const {return fFields[field];} 1529 #endif /* U_HIDE_DEPRECATED_API */ 1530 1531 #ifndef U_HIDE_INTERNAL_API 1532 /** 1533 * Gets the value for a given time field. Subclasses can use this function to get 1534 * field values without forcing recomputation of time. If the field's stamp is UNSET, 1535 * the defaultValue is used. 1536 * 1537 * @param field The given time field. 1538 * @param defaultValue a default value used if the field is unset. 1539 * @return The value for the given time field. 1540 * @internal 1541 */ 1542 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;} 1543 1544 /** 1545 * Gets the value for a given time field. Subclasses can use this function to get 1546 * field values without forcing recomputation of time. 1547 * 1548 * @param field The given time field. 1549 * @return The value for the given time field. 1550 * @internal 1551 */ 1552 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];} 1553 #endif /* U_HIDE_INTERNAL_API */ 1554 1555 /** 1556 * Use this function instead of internalGet(UCAL_MONTH). The implementation 1557 * check the timestamp of UCAL_MONTH and UCAL_ORDINAL_MONTH and use the 1558 * one set later. The subclass should override it to conver the value of UCAL_ORDINAL_MONTH 1559 * to UCAL_MONTH correctly if UCAL_ORDINAL_MONTH has higher priority. 1560 * 1561 * @return The value for the UCAL_MONTH. 1562 * @internal 1563 */ 1564 virtual int32_t internalGetMonth() const; 1565 1566 /** 1567 * Use this function instead of internalGet(UCAL_MONTH, defaultValue). The implementation 1568 * check the timestamp of UCAL_MONTH and UCAL_ORDINAL_MONTH and use the 1569 * one set later. The subclass should override it to conver the value of UCAL_ORDINAL_MONTH 1570 * to UCAL_MONTH correctly if UCAL_ORDINAL_MONTH has higher priority. 1571 * 1572 * @param defaultValue a default value used if the UCAL_MONTH and 1573 * UCAL_ORDINAL are both unset. 1574 * @return The value for the UCAL_MONTH. 1575 * @internal 1576 */ 1577 virtual int32_t internalGetMonth(int32_t defaultValue) const; 1578 1579 #ifndef U_HIDE_DEPRECATED_API 1580 /** 1581 * Sets the value for a given time field. This is a fast internal method for 1582 * subclasses. It does not affect the areFieldsInSync, isTimeSet, or areAllFieldsSet 1583 * flags. 1584 * 1585 * @param field The given time field. 1586 * @param value The value for the given time field. 1587 * @deprecated ICU 2.6. Use internalSet(UCalendarDateFields field, int32_t value) instead. 1588 */ 1589 void internalSet(EDateFields field, int32_t value); 1590 #endif /* U_HIDE_DEPRECATED_API */ 1591 1592 /** 1593 * Sets the value for a given time field. This is a fast internal method for 1594 * subclasses. It does not affect the areFieldsInSync, isTimeSet, or areAllFieldsSet 1595 * flags. 1596 * 1597 * @param field The given time field. 1598 * @param value The value for the given time field. 1599 * @stable ICU 2.6. 1600 */ 1601 inline void internalSet(UCalendarDateFields field, int32_t value); 1602 1603 /** 1604 * Prepare this calendar for computing the actual minimum or maximum. 1605 * This method modifies this calendar's fields; it is called on a 1606 * temporary calendar. 1607 * @internal 1608 */ 1609 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status); 1610 1611 /** 1612 * Limit enums. Not in sync with UCalendarLimitType (refers to internal fields). 1613 * @internal 1614 */ 1615 enum ELimitType { 1616 #ifndef U_HIDE_INTERNAL_API 1617 UCAL_LIMIT_MINIMUM = 0, 1618 UCAL_LIMIT_GREATEST_MINIMUM, 1619 UCAL_LIMIT_LEAST_MAXIMUM, 1620 UCAL_LIMIT_MAXIMUM, 1621 UCAL_LIMIT_COUNT 1622 #endif /* U_HIDE_INTERNAL_API */ 1623 }; 1624 1625 /** 1626 * Subclass API for defining limits of different types. 1627 * Subclasses must implement this method to return limits for the 1628 * following fields: 1629 * 1630 *
UCAL_ERA 1631 * UCAL_YEAR 1632 * UCAL_MONTH 1633 * UCAL_WEEK_OF_YEAR 1634 * UCAL_WEEK_OF_MONTH 1635 * UCAL_DATE (DAY_OF_MONTH on Java) 1636 * UCAL_DAY_OF_YEAR 1637 * UCAL_DAY_OF_WEEK_IN_MONTH 1638 * UCAL_YEAR_WOY 1639 * UCAL_EXTENDED_YEAR
MINIMUM
GREATEST_MINIMUM
LEAST_MAXIMUM
MAXIMUM
0..UCAL_MAX_FIELD
The precedence table is a 3-dimensional array of integers. It 1821 * may be thought of as an array of groups. Each group is an array of 1822 * lines. Each line is an array of field numbers. Within a line, if 1823 * all fields are set, then the time stamp of the line is taken to be 1824 * the stamp of the most recently set field. If any field of a line is 1825 * unset, then the line fails to match. Within a group, the line with 1826 * the newest time stamp is selected. The first field of the line is 1827 * returned to indicate which line matched. 1828 * 1829 *
In some cases, it may be desirable to map a line to field that 1830 * whose stamp is NOT examined. For example, if the best field is 1831 * DAY_OF_WEEK then the DAY_OF_WEEK_IN_MONTH algorithm may be used. In 1832 * order to do this, insert the value kResolveRemap | F at 1833 * the start of the line, where F is the desired return 1834 * field value. This field will NOT be examined; it only determines 1835 * the return value if the other fields in the line are the newest. 1836 * 1837 *
kResolveRemap | F
F
If all lines of a group contain at least one unset field, then no 1838 * line will match, and the group as a whole will fail to match. In 1839 * that case, the next group will be processed. If all groups fail to 1840 * match, then UCAL_FIELD_COUNT is returned. 1841 * @internal 1842 */ 1843 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable) const; 1844 #endif /* U_HIDE_INTERNAL_API */ 1845 1846 1847 /** 1848 * @internal 1849 */ 1850 virtual const UFieldResolutionTable* getFieldResolutionTable() const; 1851 1852 #ifndef U_HIDE_INTERNAL_API 1853 /** 1854 * Return the field that is newer, either defaultField, or 1855 * alternateField. If neither is newer or neither is set, return defaultField. 1856 * @internal 1857 */ 1858 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const; 1859 #endif /* U_HIDE_INTERNAL_API */ 1860 1861 1862 private: 1863 /** 1864 * Helper function for calculating limits by trial and error 1865 * @param field The field being investigated 1866 * @param startValue starting (least max) value of field 1867 * @param endValue ending (greatest max) value of field 1868 * @param status return type 1869 * @internal (private) 1870 */ 1871 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const; 1872 1873 1874 protected: 1875 /** 1876 * The flag which indicates if the current time is set in the calendar. 1877 * @stable ICU 2.0 1878 */ 1879 UBool fIsTimeSet; 1880 1881 /** 1882 * True if the fields are in sync with the currently set time of this Calendar. 1883 * If false, then the next attempt to get the value of a field will 1884 * force a recomputation of all fields from the current value of the time 1885 * field. 1886 *
1887 * This should really be named areFieldsInSync, but the old name is retained 1888 * for backward compatibility. 1889 * @stable ICU 2.0 1890 */ 1891 UBool fAreFieldsSet; 1892 1893 /** 1894 * True if all of the fields have been set. This is initially false, and set to 1895 * true by computeFields(). 1896 * @stable ICU 2.0 1897 */ 1898 UBool fAreAllFieldsSet; 1899 1900 /** 1901 * True if all fields have been virtually set, but have not yet been 1902 * computed. This occurs only in setTimeInMillis(). A calendar set 1903 * to this state will compute all fields from the time if it becomes 1904 * necessary, but otherwise will delay such computation. 1905 * @stable ICU 3.0 1906 */ 1907 UBool fAreFieldsVirtuallySet; 1908 1909 /** 1910 * Get the current time without recomputing. 1911 * 1912 * @return the current time without recomputing. 1913 * @stable ICU 2.0 1914 */ 1915 UDate internalGetTime(void) const { return fTime; } 1916 1917 /** 1918 * Set the current time without affecting flags or fields. 1919 * 1920 * @param time The time to be set 1921 * @return the current time without recomputing. 1922 * @stable ICU 2.0 1923 */ 1924 void internalSetTime(UDate time) { fTime = time; } 1925 1926 /** 1927 * The time fields containing values into which the millis is computed. 1928 * @stable ICU 2.0 1929 */ 1930 int32_t fFields[UCAL_FIELD_COUNT]; 1931 1932 #ifndef U_FORCE_HIDE_DEPRECATED_API 1933 /** 1934 * The flags which tell if a specified time field for the calendar is set. 1935 * @deprecated ICU 2.8 use (fStamp[n]!=kUnset) 1936 */ 1937 UBool fIsSet[UCAL_FIELD_COUNT]; 1938 #endif // U_FORCE_HIDE_DEPRECATED_API 1939 1940 /** Special values of stamp[] 1941 * @stable ICU 2.0 1942 */ 1943 enum { 1944 kUnset = 0, 1945 kInternallySet, 1946 kMinimumUserStamp 1947 }; 1948 1949 /** 1950 * Pseudo-time-stamps which specify when each field was set. There 1951 * are two special values, UNSET and INTERNALLY_SET. Values from 1952 * MINIMUM_USER_SET to Integer.MAX_VALUE are legal user set values. 1953 * @stable ICU 2.0 1954 */ 1955 int32_t fStamp[UCAL_FIELD_COUNT]; 1956 1957 /** 1958 * Subclasses may override this method to compute several fields 1959 * specific to each calendar system. These are: 1960 * 1961 *
In addition, subclasses should compute any subclass-specific 1974 * fields, that is, fields from BASE_FIELD_COUNT to 1975 * getFieldCount() - 1. 1976 * 1977 *
The default implementation in Calendar implements 1978 * a pure proleptic Gregorian calendar. 1979 * @internal 1980 */ 1981 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); 1982 1983 #ifndef U_HIDE_INTERNAL_API 1984 /** 1985 * Return the extended year on the Gregorian calendar as computed by 1986 * computeGregorianFields(). 1987 * @internal 1988 */ 1989 int32_t getGregorianYear() const { 1990 return fGregorianYear; 1991 } 1992 1993 /** 1994 * Return the month (0-based) on the Gregorian calendar as computed by 1995 * computeGregorianFields(). 1996 * @internal 1997 */ 1998 int32_t getGregorianMonth() const { 1999 return fGregorianMonth; 2000 } 2001 2002 /** 2003 * Return the day of year (1-based) on the Gregorian calendar as 2004 * computed by computeGregorianFields(). 2005 * @internal 2006 */ 2007 int32_t getGregorianDayOfYear() const { 2008 return fGregorianDayOfYear; 2009 } 2010 2011 /** 2012 * Return the day of month (1-based) on the Gregorian calendar as 2013 * computed by computeGregorianFields(). 2014 * @internal 2015 */ 2016 int32_t getGregorianDayOfMonth() const { 2017 return fGregorianDayOfMonth; 2018 } 2019 #endif /* U_HIDE_INTERNAL_API */ 2020 2021 /** 2022 * Called by computeJulianDay. Returns the default month (0-based) for the year, 2023 * taking year and era into account. Defaults to 0 for Gregorian, which doesn't care. 2024 * @param eyear The extended year 2025 * @internal 2026 */ 2027 virtual int32_t getDefaultMonthInYear(int32_t eyear) ; 2028 2029 2030 /** 2031 * Called by computeJulianDay. Returns the default day (1-based) for the month, 2032 * taking currently-set year and era into account. Defaults to 1 for Gregorian. 2033 * @param eyear the extended year 2034 * @param month the month in the year 2035 * @internal 2036 */ 2037 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month); 2038 2039 //------------------------------------------------------------------------- 2040 // Protected utility methods for use by subclasses. These are very handy 2041 // for implementing add, roll, and computeFields. 2042 //------------------------------------------------------------------------- 2043 2044 /** 2045 * Adjust the specified field so that it is within 2046 * the allowable range for the date to which this calendar is set. 2047 * For example, in a Gregorian calendar pinning the {@link #UCalendarDateFields DAY_OF_MONTH} 2048 * field for a calendar set to April 31 would cause it to be set 2049 * to April 30. 2050 *
Calendar
computeGregorianFields()
2051 * Subclassing: 2052 * 2053 * This utility method is intended for use by subclasses that need to implement 2054 * their own overrides of {@link #roll roll} and {@link #add add}. 2055 *
2056 * Note: 2057 * pinField is implemented in terms of 2058 * {@link #getActualMinimum getActualMinimum} 2059 * and {@link #getActualMaximum getActualMaximum}. If either of those methods uses 2060 * a slow, iterative algorithm for a particular field, it would be 2061 * unwise to attempt to call pinField for that field. If you 2062 * really do need to do so, you should override this method to do 2063 * something more efficient for that field. 2064 *
pinField
2065 * @param field The calendar field whose value should be pinned. 2066 * @param status Output param set to failure code on function return 2067 * when this function fails. 2068 * 2069 * @see #getActualMinimum 2070 * @see #getActualMaximum 2071 * @stable ICU 2.0 2072 */ 2073 virtual void pinField(UCalendarDateFields field, UErrorCode& status); 2074 2075 /** 2076 * Return the week number of a day, within a period. This may be the week number in 2077 * a year or the week number in a month. Usually this will be a value >= 1, but if 2078 * some initial days of the period are excluded from week 1, because 2079 * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} is > 1, then 2080 * the week number will be zero for those 2081 * initial days. This method requires the day number and day of week for some 2082 * known date in the period in order to determine the day of week 2083 * on the desired day. 2084 *
2085 * Subclassing: 2086 * 2087 * This method is intended for use by subclasses in implementing their 2088 * {@link #computeTime computeTime} and/or {@link #computeFields computeFields} methods. 2089 * It is often useful in {@link #getActualMinimum getActualMinimum} and 2090 * {@link #getActualMaximum getActualMaximum} as well. 2091 *
2092 * This variant is handy for computing the week number of some other 2093 * day of a period (often the first or last day of the period) when its day 2094 * of the week is not known but the day number and day of week for some other 2095 * day in the period (e.g. the current date) is known. 2096 *
2097 * @param desiredDay The {@link #UCalendarDateFields DAY_OF_YEAR} or 2098 * {@link #UCalendarDateFields DAY_OF_MONTH} whose week number is desired. 2099 * Should be 1 for the first day of the period. 2100 * 2101 * @param dayOfPeriod The {@link #UCalendarDateFields DAY_OF_YEAR} 2102 * or {@link #UCalendarDateFields DAY_OF_MONTH} for a day in the period whose 2103 * {@link #UCalendarDateFields DAY_OF_WEEK} is specified by the 2104 * knownDayOfWeek parameter. 2105 * Should be 1 for first day of period. 2106 * 2107 * @param dayOfWeek The {@link #UCalendarDateFields DAY_OF_WEEK} for the day 2108 * corresponding to the knownDayOfPeriod parameter. 2109 * 1-based with 1=Sunday. 2110 * 2111 * @return The week number (one-based), or zero if the day falls before 2112 * the first week because 2113 * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} 2114 * is more than one. 2115 * 2116 * @stable ICU 2.8 2117 */ 2118 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek); 2119 2120 2121 #ifndef U_HIDE_INTERNAL_API 2122 /** 2123 * Return the week number of a day, within a period. This may be the week number in 2124 * a year, or the week number in a month. Usually this will be a value >= 1, but if 2125 * some initial days of the period are excluded from week 1, because 2126 * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} is > 1, 2127 * then the week number will be zero for those 2128 * initial days. This method requires the day of week for the given date in order to 2129 * determine the result. 2130 *
knownDayOfWeek
knownDayOfPeriod
2131 * Subclassing: 2132 * 2133 * This method is intended for use by subclasses in implementing their 2134 * {@link #computeTime computeTime} and/or {@link #computeFields computeFields} methods. 2135 * It is often useful in {@link #getActualMinimum getActualMinimum} and 2136 * {@link #getActualMaximum getActualMaximum} as well. 2137 *
2138 * @param dayOfPeriod The {@link #UCalendarDateFields DAY_OF_YEAR} or 2139 * {@link #UCalendarDateFields DAY_OF_MONTH} whose week number is desired. 2140 * Should be 1 for the first day of the period. 2141 * 2142 * @param dayOfWeek The {@link #UCalendarDateFields DAY_OF_WEEK} for the day 2143 * corresponding to the dayOfPeriod parameter. 2144 * 1-based with 1=Sunday. 2145 * 2146 * @return The week number (one-based), or zero if the day falls before 2147 * the first week because 2148 * {@link #getMinimalDaysInFirstWeek getMinimalDaysInFirstWeek} 2149 * is more than one. 2150 * @internal 2151 */ 2152 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek); 2153 2154 /** 2155 * returns the local DOW, valid range 0..6 2156 * @internal 2157 */ 2158 int32_t getLocalDOW(); 2159 #endif /* U_HIDE_INTERNAL_API */ 2160 2161 private: 2162 2163 /** 2164 * The next available value for fStamp[] 2165 */ 2166 int32_t fNextStamp;// = MINIMUM_USER_STAMP; 2167 2168 /** 2169 * Recalculates the time stamp array (fStamp). 2170 * Resets fNextStamp to lowest next stamp value. 2171 */ 2172 void recalculateStamp(); 2173 2174 /** 2175 * The current time set for the calendar. 2176 */ 2177 UDate fTime; 2178 2179 /** 2180 * @see #setLenient 2181 */ 2182 UBool fLenient; 2183 2184 /** 2185 * Time zone affects the time calculation done by Calendar. Calendar subclasses use 2186 * the time zone data to produce the local time. Always set; never nullptr. 2187 */ 2188 TimeZone* fZone; 2189 2190 /** 2191 * Option for repeated wall time 2192 * @see #setRepeatedWallTimeOption 2193 */ 2194 UCalendarWallTimeOption fRepeatedWallTime; 2195 2196 /** 2197 * Option for skipped wall time 2198 * @see #setSkippedWallTimeOption 2199 */ 2200 UCalendarWallTimeOption fSkippedWallTime; 2201 2202 /** 2203 * Both firstDayOfWeek and minimalDaysInFirstWeek are locale-dependent. They are 2204 * used to figure out the week count for a specific date for a given locale. These 2205 * must be set when a Calendar is constructed. For example, in US locale, 2206 * firstDayOfWeek is SUNDAY; minimalDaysInFirstWeek is 1. They are used to figure 2207 * out the week count for a specific date for a given locale. These must be set when 2208 * a Calendar is constructed. 2209 */ 2210 UCalendarDaysOfWeek fFirstDayOfWeek; 2211 uint8_t fMinimalDaysInFirstWeek; 2212 UCalendarDaysOfWeek fWeekendOnset; 2213 int32_t fWeekendOnsetMillis; 2214 UCalendarDaysOfWeek fWeekendCease; 2215 int32_t fWeekendCeaseMillis; 2216 2217 /** 2218 * Sets firstDayOfWeek and minimalDaysInFirstWeek. Called at Calendar construction 2219 * time. 2220 * 2221 * @param desiredLocale The given locale. 2222 * @param type The calendar type identifier, e.g: gregorian, buddhist, etc. 2223 * @param success Indicates the status of setting the week count data from 2224 * the resource for the given locale. Returns U_ZERO_ERROR if 2225 * constructed successfully. 2226 */ 2227 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success); 2228 2229 /** 2230 * Recompute the time and update the status fields isTimeSet 2231 * and areFieldsSet. Callers should check isTimeSet and only 2232 * call this method if isTimeSet is false. 2233 * 2234 * @param status Output param set to success/failure code on exit. If any value 2235 * previously set in the time field is invalid or restricted by 2236 * leniency, this will be set to an error status. 2237 */ 2238 void updateTime(UErrorCode& status); 2239 2240 /** 2241 * The Gregorian year, as computed by computeGregorianFields() and 2242 * returned by getGregorianYear(). 2243 * @see #computeGregorianFields 2244 */ 2245 int32_t fGregorianYear; 2246 2247 /** 2248 * The Gregorian month, as computed by computeGregorianFields() and 2249 * returned by getGregorianMonth(). 2250 * @see #computeGregorianFields 2251 */ 2252 int32_t fGregorianMonth; 2253 2254 /** 2255 * The Gregorian day of the year, as computed by 2256 * computeGregorianFields() and returned by getGregorianDayOfYear(). 2257 * @see #computeGregorianFields 2258 */ 2259 int32_t fGregorianDayOfYear; 2260 2261 /** 2262 * The Gregorian day of the month, as computed by 2263 * computeGregorianFields() and returned by getGregorianDayOfMonth(). 2264 * @see #computeGregorianFields 2265 */ 2266 int32_t fGregorianDayOfMonth; 2267 2268 /* calculations */ 2269 2270 /** 2271 * Compute the Gregorian calendar year, month, and day of month from 2272 * the given Julian day. These values are not stored in fields, but in 2273 * member variables gregorianXxx. Also compute the DAY_OF_WEEK and 2274 * DOW_LOCAL fields. 2275 */ 2276 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec); 2277 2278 protected: 2279 2280 /** 2281 * Compute the Gregorian calendar year, month, and day of month from the 2282 * Julian day. These values are not stored in fields, but in member 2283 * variables gregorianXxx. They are used for time zone computations and by 2284 * subclasses that are Gregorian derivatives. Subclasses may call this 2285 * method to perform a Gregorian calendar millis->fields computation. 2286 */ 2287 void computeGregorianFields(int32_t julianDay, UErrorCode &ec); 2288 2289 private: 2290 2291 /** 2292 * Compute the fields WEEK_OF_YEAR, YEAR_WOY, WEEK_OF_MONTH, 2293 * DAY_OF_WEEK_IN_MONTH, and DOW_LOCAL from EXTENDED_YEAR, YEAR, 2294 * DAY_OF_WEEK, and DAY_OF_YEAR. The latter fields are computed by the 2295 * subclass based on the calendar system. 2296 * 2297 *
dayOfPeriod
The YEAR_WOY field is computed simplistically. It is equal to YEAR 2298 * most of the time, but at the year boundary it may be adjusted to YEAR-1 2299 * or YEAR+1 to reflect the overlap of a week into an adjacent year. In 2300 * this case, a simple increment or decrement is performed on YEAR, even 2301 * though this may yield an invalid YEAR value. For instance, if the YEAR 2302 * is part of a calendar system with an N-year cycle field CYCLE, then 2303 * incrementing the YEAR may involve incrementing CYCLE and setting YEAR 2304 * back to 0 or 1. This is not handled by this code, and in fact cannot be 2305 * simply handled without having subclasses define an entire parallel set of 2306 * fields for fields larger than or equal to a year. This additional 2307 * complexity is not warranted, since the intention of the YEAR_WOY field is 2308 * to support ISO 8601 notation, so it will typically be used with a 2309 * proleptic Gregorian calendar, which has no field larger than a year. 2310 */ 2311 void computeWeekFields(UErrorCode &ec); 2312 2313 2314 /** 2315 * Ensure that each field is within its valid range by calling {@link 2316 * #validateField(int, int&)} on each field that has been set. This method 2317 * should only be called if this calendar is not lenient. 2318 * @see #isLenient 2319 * @see #validateField(int, int&) 2320 */ 2321 void validateFields(UErrorCode &status); 2322 2323 /** 2324 * Validate a single field of this calendar given its minimum and 2325 * maximum allowed value. If the field is out of range, 2326 * U_ILLEGAL_ARGUMENT_ERROR will be set. Subclasses may 2327 * use this method in their implementation of {@link 2328 * #validateField(int, int&)}. 2329 */ 2330 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status); 2331 2332 protected: 2333 #ifndef U_HIDE_INTERNAL_API 2334 /** 2335 * Convert a quasi Julian date to the day of the week. The Julian date used here is 2336 * not a true Julian date, since it is measured from midnight, not noon. Return 2337 * value is one-based. 2338 * 2339 * @param julian The given Julian date number. 2340 * @return Day number from 1..7 (SUN..SAT). 2341 * @internal 2342 */ 2343 static uint8_t julianDayToDayOfWeek(double julian); 2344 #endif /* U_HIDE_INTERNAL_API */ 2345 2346 private: 2347 char validLocale[ULOC_FULLNAME_CAPACITY]; 2348 char actualLocale[ULOC_FULLNAME_CAPACITY]; 2349 2350 public: 2351 #if !UCONFIG_NO_SERVICE 2352 /** 2353 * INTERNAL FOR 2.6 -- Registration. 2354 */ 2355 2356 #ifndef U_HIDE_INTERNAL_API 2357 /** 2358 * Return a StringEnumeration over the locales available at the time of the call, 2359 * including registered locales. 2360 * @return a StringEnumeration over the locales available at the time of the call 2361 * @internal 2362 */ 2363 static StringEnumeration* getAvailableLocales(void); 2364 2365 /** 2366 * Register a new Calendar factory. The factory will be adopted. 2367 * INTERNAL in 2.6 2368 * 2369 * Because ICU may choose to cache Calendars internally, this must 2370 * be called at application startup, prior to any calls to 2371 * Calendar::createInstance to avoid undefined behavior. 2372 * 2373 * @param toAdopt the factory instance to be adopted 2374 * @param status the in/out status code, no special meanings are assigned 2375 * @return a registry key that can be used to unregister this factory 2376 * @internal 2377 */ 2378 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status); 2379 2380 /** 2381 * Unregister a previously-registered CalendarFactory using the key returned from the 2382 * register call. Key becomes invalid after a successful call and should not be used again. 2383 * The CalendarFactory corresponding to the key will be deleted. 2384 * INTERNAL in 2.6 2385 * 2386 * Because ICU may choose to cache Calendars internally, this should 2387 * be called during application shutdown, after all calls to 2388 * Calendar::createInstance to avoid undefined behavior. 2389 * 2390 * @param key the registry key returned by a previous call to registerFactory 2391 * @param status the in/out status code, no special meanings are assigned 2392 * @return true if the factory for the key was successfully unregistered 2393 * @internal 2394 */ 2395 static UBool unregister(URegistryKey key, UErrorCode& status); 2396 #endif /* U_HIDE_INTERNAL_API */ 2397 2398 /** 2399 * Multiple Calendar Implementation 2400 * @internal 2401 */ 2402 friend class CalendarFactory; 2403 2404 /** 2405 * Multiple Calendar Implementation 2406 * @internal 2407 */ 2408 friend class CalendarService; 2409 2410 /** 2411 * Multiple Calendar Implementation 2412 * @internal 2413 */ 2414 friend class DefaultCalendarFactory; 2415 #endif /* !UCONFIG_NO_SERVICE */ 2416 2417 /** 2418 * @return true if this calendar has a default century (i.e. 03 -> 2003) 2419 * @internal 2420 */ 2421 virtual UBool haveDefaultCentury() const = 0; 2422 2423 /** 2424 * @return the start of the default century, as a UDate 2425 * @internal 2426 */ 2427 virtual UDate defaultCenturyStart() const = 0; 2428 /** 2429 * @return the beginning year of the default century, as a year 2430 * @internal 2431 */ 2432 virtual int32_t defaultCenturyStartYear() const = 0; 2433 2434 /** Get the locale for this calendar object. You can choose between valid and actual locale. 2435 * @param type type of the locale we're looking for (valid or actual) 2436 * @param status error code for the operation 2437 * @return the locale 2438 * @stable ICU 2.8 2439 */ 2440 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const; 2441 2442 /** 2443 * @return The related Gregorian year; will be obtained by modifying the value 2444 * obtained by get from UCAL_EXTENDED_YEAR field 2445 * @internal 2446 */ 2447 virtual int32_t getRelatedYear(UErrorCode &status) const; 2448 2449 /** 2450 * @param year The related Gregorian year to set; will be modified as necessary then 2451 * set in UCAL_EXTENDED_YEAR field 2452 * @internal 2453 */ 2454 virtual void setRelatedYear(int32_t year); 2455 2456 #ifndef U_HIDE_INTERNAL_API 2457 /** Get the locale for this calendar object. You can choose between valid and actual locale. 2458 * @param type type of the locale we're looking for (valid or actual) 2459 * @param status error code for the operation 2460 * @return the locale 2461 * @internal 2462 */ 2463 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; 2464 #endif /* U_HIDE_INTERNAL_API */ 2465 2466 private: 2467 /** 2468 * Cast TimeZone used by this object to BasicTimeZone, or nullptr if the TimeZone 2469 * is not an instance of BasicTimeZone. 2470 */ 2471 BasicTimeZone* getBasicTimeZone() const; 2472 2473 /** 2474 * Find the previous zone transition near the given time. 2475 * @param base The base time, inclusive 2476 * @param transitionTime Receives the result time 2477 * @param status The error status 2478 * @return true if a transition is found. 2479 */ 2480 UBool getImmediatePreviousZoneTransition(UDate base, UDate *transitionTime, UErrorCode& status) const; 2481 2482 public: 2483 #ifndef U_HIDE_INTERNAL_API 2484 /** 2485 * Creates a new Calendar from a Locale for the cache. 2486 * This method does not set the time or timezone in returned calendar. 2487 * @param locale the locale. 2488 * @param status any error returned here. 2489 * @return the new Calendar object with no time or timezone set. 2490 * @internal For ICU use only. 2491 */ 2492 static Calendar * U_EXPORT2 makeInstance( 2493 const Locale &locale, UErrorCode &status); 2494 2495 /** 2496 * Get the calendar type for given locale. 2497 * @param locale the locale 2498 * @param typeBuffer calendar type returned here 2499 * @param typeBufferSize The size of typeBuffer in bytes. If the type 2500 * can't fit in the buffer, this method sets status to 2501 * U_BUFFER_OVERFLOW_ERROR 2502 * @param status error, if any, returned here. 2503 * @internal For ICU use only. 2504 */ 2505 static void U_EXPORT2 getCalendarTypeFromLocale( 2506 const Locale &locale, 2507 char *typeBuffer, 2508 int32_t typeBufferSize, 2509 UErrorCode &status); 2510 #endif /* U_HIDE_INTERNAL_API */ 2511 }; 2512 2513 // ------------------------------------- 2514 2515 inline Calendar* 2516 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode) 2517 { 2518 // since the Locale isn't specified, use the default locale 2519 return createInstance(zone, Locale::getDefault(), errorCode); 2520 } 2521 2522 // ------------------------------------- 2523 2524 inline void 2525 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status) 2526 { 2527 roll(field, (int32_t)(up ? +1 : -1), status); 2528 } 2529 2530 #ifndef U_HIDE_DEPRECATED_API 2531 inline void 2532 Calendar::roll(EDateFields field, UBool up, UErrorCode& status) 2533 { 2534 roll((UCalendarDateFields) field, up, status); 2535 } 2536 #endif /* U_HIDE_DEPRECATED_API */ 2537 2538 2539 // ------------------------------------- 2540 2541 /** 2542 * Fast method for subclasses. The caller must maintain fUserSetDSTOffset and 2543 * fUserSetZoneOffset, as well as the isSet[] array. 2544 */ 2545 2546 inline void 2547 Calendar::internalSet(UCalendarDateFields field, int32_t value) 2548 { 2549 fFields[field] = value; 2550 fStamp[field] = kInternallySet; 2551 fIsSet[field] = true; // Remove later 2552 } 2553 2554 2555 #ifndef U_HIDE_INTERNAL_API 2556 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek) 2557 { 2558 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek); 2559 } 2560 #endif /* U_HIDE_INTERNAL_API */ 2561 2562 U_NAMESPACE_END 2563 2564 #endif /* #if !UCONFIG_NO_FORMATTING */ 2565 2566 #endif /* U_SHOW_CPLUSPLUS_API */ 2567 2568 #endif // _CALENDAR
U_ILLEGAL_ARGUMENT_ERROR