ICU 4.8.1.1
4.8.1.1
|
00001 /* 00002 ******************************************************************************** 00003 * Copyright (C) 1997-2011, International Business Machines 00004 * Corporation and others. All Rights Reserved. 00005 ******************************************************************************** 00006 * 00007 * File CALENDAR.H 00008 * 00009 * Modification History: 00010 * 00011 * Date Name Description 00012 * 04/22/97 aliu Expanded and corrected comments and other header 00013 * contents. 00014 * 05/01/97 aliu Made equals(), before(), after() arguments const. 00015 * 05/20/97 aliu Replaced fAreFieldsSet with fAreFieldsInSync and 00016 * fAreAllFieldsSet. 00017 * 07/27/98 stephen Sync up with JDK 1.2 00018 * 11/15/99 weiv added YEAR_WOY and DOW_LOCAL 00019 * to EDateFields 00020 * 8/19/2002 srl Removed Javaisms 00021 * 11/07/2003 srl Update, clean up documentation. 00022 ******************************************************************************** 00023 */ 00024 00025 #ifndef CALENDAR_H 00026 #define CALENDAR_H 00027 00028 #include "unicode/utypes.h" 00029 00034 #if !UCONFIG_NO_FORMATTING 00035 00036 #include "unicode/uobject.h" 00037 #include "unicode/locid.h" 00038 #include "unicode/timezone.h" 00039 #include "unicode/ucal.h" 00040 #include "unicode/umisc.h" 00041 00042 U_NAMESPACE_BEGIN 00043 00044 class ICUServiceFactory; 00045 00049 typedef int32_t UFieldResolutionTable[12][8]; 00050 00165 class U_I18N_API Calendar : public UObject { 00166 public: 00167 00174 enum EDateFields { 00175 #ifndef U_HIDE_DEPRECATED_API 00176 /* 00177 * ERA may be defined on other platforms. To avoid any potential problems undefined it here. 00178 */ 00179 #ifdef ERA 00180 #undef ERA 00181 #endif 00182 ERA, // Example: 0..1 00183 YEAR, // Example: 1..big number 00184 MONTH, // Example: 0..11 00185 WEEK_OF_YEAR, // Example: 1..53 00186 WEEK_OF_MONTH, // Example: 1..4 00187 DATE, // Example: 1..31 00188 DAY_OF_YEAR, // Example: 1..365 00189 DAY_OF_WEEK, // Example: 1..7 00190 DAY_OF_WEEK_IN_MONTH, // Example: 1..4, may be specified as -1 00191 AM_PM, // Example: 0..1 00192 HOUR, // Example: 0..11 00193 HOUR_OF_DAY, // Example: 0..23 00194 MINUTE, // Example: 0..59 00195 SECOND, // Example: 0..59 00196 MILLISECOND, // Example: 0..999 00197 ZONE_OFFSET, // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR 00198 DST_OFFSET, // Example: 0 or U_MILLIS_PER_HOUR 00199 YEAR_WOY, // 'Y' Example: 1..big number - Year of Week of Year 00200 DOW_LOCAL, // 'e' Example: 1..7 - Day of Week / Localized 00201 00202 EXTENDED_YEAR, 00203 JULIAN_DAY, 00204 MILLISECONDS_IN_DAY, 00205 IS_LEAP_MONTH, 00206 00207 FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields. 00208 #endif /* U_HIDE_DEPRECATED_API */ 00209 }; 00210 00217 enum EDaysOfWeek { 00218 #ifndef U_HIDE_DEPRECATED_API 00219 SUNDAY = 1, 00220 MONDAY, 00221 TUESDAY, 00222 WEDNESDAY, 00223 THURSDAY, 00224 FRIDAY, 00225 SATURDAY 00226 #endif /* U_HIDE_DEPRECATED_API */ 00227 }; 00228 00233 enum EMonths { 00234 #ifndef U_HIDE_DEPRECATED_API 00235 JANUARY, 00236 FEBRUARY, 00237 MARCH, 00238 APRIL, 00239 MAY, 00240 JUNE, 00241 JULY, 00242 AUGUST, 00243 SEPTEMBER, 00244 OCTOBER, 00245 NOVEMBER, 00246 DECEMBER, 00247 UNDECIMBER 00248 #endif /* U_HIDE_DEPRECATED_API */ 00249 }; 00250 00255 enum EAmpm { 00256 #ifndef U_HIDE_DEPRECATED_API 00257 AM, 00258 PM 00259 #endif /* U_HIDE_DEPRECATED_API */ 00260 }; 00261 00266 virtual ~Calendar(); 00267 00274 virtual Calendar* clone(void) const = 0; 00275 00287 static Calendar* U_EXPORT2 createInstance(UErrorCode& success); 00288 00301 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success); 00302 00314 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success); 00315 00326 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success); 00327 00341 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success); 00342 00355 static Calendar* U_EXPORT2 createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success); 00356 00366 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count); 00367 00368 00385 static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key, 00386 const Locale& locale, UBool commonlyUsed, UErrorCode& status); 00387 00395 static UDate U_EXPORT2 getNow(void); 00396 00410 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); } 00411 00422 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); } 00423 00435 virtual UBool operator==(const Calendar& that) const; 00436 00445 UBool operator!=(const Calendar& that) const {return !operator==(that);} 00446 00457 virtual UBool isEquivalentTo(const Calendar& other) const; 00458 00473 UBool equals(const Calendar& when, UErrorCode& status) const; 00474 00488 UBool before(const Calendar& when, UErrorCode& status) const; 00489 00503 UBool after(const Calendar& when, UErrorCode& status) const; 00504 00522 virtual void add(EDateFields field, int32_t amount, UErrorCode& status); 00523 00541 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); 00542 00566 inline void roll(EDateFields field, UBool up, UErrorCode& status); 00567 00591 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status); 00592 00615 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); 00616 00639 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); 00640 00696 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status); 00697 00753 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status); 00754 00763 void adoptTimeZone(TimeZone* value); 00764 00772 void setTimeZone(const TimeZone& zone); 00773 00782 const TimeZone& getTimeZone(void) const; 00783 00792 TimeZone* orphanTimeZone(void); 00793 00802 virtual UBool inDaylightTime(UErrorCode& status) const = 0; 00803 00816 void setLenient(UBool lenient); 00817 00824 UBool isLenient(void) const; 00825 00832 void setFirstDayOfWeek(EDaysOfWeek value); 00833 00840 void setFirstDayOfWeek(UCalendarDaysOfWeek value); 00841 00848 EDaysOfWeek getFirstDayOfWeek(void) const; 00849 00857 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const; 00858 00868 void setMinimalDaysInFirstWeek(uint8_t value); 00869 00879 uint8_t getMinimalDaysInFirstWeek(void) const; 00880 00889 virtual int32_t getMinimum(EDateFields field) const; 00890 00899 virtual int32_t getMinimum(UCalendarDateFields field) const; 00900 00909 virtual int32_t getMaximum(EDateFields field) const; 00910 00919 virtual int32_t getMaximum(UCalendarDateFields field) const; 00920 00929 virtual int32_t getGreatestMinimum(EDateFields field) const; 00930 00939 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; 00940 00949 virtual int32_t getLeastMaximum(EDateFields field) const; 00950 00959 virtual int32_t getLeastMaximum(UCalendarDateFields field) const; 00960 00975 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; 00976 00991 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const; 00992 01009 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const; 01010 01027 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; 01028 01042 int32_t get(EDateFields field, UErrorCode& status) const; 01043 01057 int32_t get(UCalendarDateFields field, UErrorCode& status) const; 01058 01067 UBool isSet(EDateFields field) const; 01068 01077 UBool isSet(UCalendarDateFields field) const; 01078 01086 void set(EDateFields field, int32_t value); 01087 01095 void set(UCalendarDateFields field, int32_t value); 01096 01107 void set(int32_t year, int32_t month, int32_t date); 01108 01121 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute); 01122 01136 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second); 01137 01144 void clear(void); 01145 01154 void clear(EDateFields field); 01155 01164 void clear(UCalendarDateFields field); 01165 01181 virtual UClassID getDynamicClassID(void) const = 0; 01182 01191 virtual const char * getType() const = 0; 01192 01208 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const; 01209 01224 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const; 01225 01235 virtual UBool isWeekend(UDate date, UErrorCode &status) const; 01236 01244 virtual UBool isWeekend(void) const; 01245 01246 protected: 01247 01256 Calendar(UErrorCode& success); 01257 01264 Calendar(const Calendar& source); 01265 01272 Calendar& operator=(const Calendar& right); 01273 01284 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success); 01285 01295 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); 01296 01305 virtual void computeTime(UErrorCode& status); 01306 01318 virtual void computeFields(UErrorCode& status); 01319 01329 double getTimeInMillis(UErrorCode& status) const; 01330 01339 void setTimeInMillis( double millis, UErrorCode& status ); 01340 01350 void complete(UErrorCode& status); 01351 01360 inline int32_t internalGet(EDateFields field) const {return fFields[field];} 01361 01372 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;} 01373 01382 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];} 01383 01393 void internalSet(EDateFields field, int32_t value); 01394 01404 inline void internalSet(UCalendarDateFields field, int32_t value); 01405 01412 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status); 01413 01418 enum ELimitType { 01419 UCAL_LIMIT_MINIMUM = 0, 01420 UCAL_LIMIT_GREATEST_MINIMUM, 01421 UCAL_LIMIT_LEAST_MAXIMUM, 01422 UCAL_LIMIT_MAXIMUM, 01423 UCAL_LIMIT_COUNT 01424 }; 01425 01447 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0; 01448 01456 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const; 01457 01458 01472 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, 01473 UBool useMonth) const = 0; 01474 01482 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ; 01483 01491 virtual int32_t handleGetYearLength(int32_t eyear) const; 01492 01493 01502 virtual int32_t handleGetExtendedYear() = 0; 01503 01512 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField); 01513 01522 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy); 01523 01530 int32_t computeJulianDay(); 01531 01539 int32_t computeMillisInDay(); 01540 01550 int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec); 01551 01552 01561 int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const; 01562 01568 enum { 01570 kResolveSTOP = -1, 01572 kResolveRemap = 32 01573 }; 01574 01580 static const UFieldResolutionTable kDatePrecedence[]; 01581 01587 static const UFieldResolutionTable kYearPrecedence[]; 01588 01594 static const UFieldResolutionTable kDOWPrecedence[]; 01595 01623 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable); 01624 01625 01629 virtual const UFieldResolutionTable* getFieldResolutionTable() const; 01630 01636 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const; 01637 01638 01639 private: 01648 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const; 01649 01650 01651 protected: 01656 UBool fIsTimeSet; 01657 01668 UBool fAreFieldsSet; 01669 01675 UBool fAreAllFieldsSet; 01676 01684 UBool fAreFieldsVirtuallySet; 01685 01692 UDate internalGetTime(void) const { return fTime; } 01693 01701 void internalSetTime(UDate time) { fTime = time; } 01702 01707 int32_t fFields[UCAL_FIELD_COUNT]; 01708 01713 UBool fIsSet[UCAL_FIELD_COUNT]; 01714 01718 enum { 01719 kUnset = 0, 01720 kInternallySet, 01721 kMinimumUserStamp 01722 }; 01723 01730 int32_t fStamp[UCAL_FIELD_COUNT]; 01731 01756 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); 01757 01763 int32_t getGregorianYear() const { 01764 return fGregorianYear; 01765 } 01766 01772 int32_t getGregorianMonth() const { 01773 return fGregorianMonth; 01774 } 01775 01781 int32_t getGregorianDayOfYear() const { 01782 return fGregorianDayOfYear; 01783 } 01784 01790 int32_t getGregorianDayOfMonth() const { 01791 return fGregorianDayOfMonth; 01792 } 01793 01800 virtual int32_t getDefaultMonthInYear(int32_t eyear) ; 01801 01802 01810 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month); 01811 01812 //------------------------------------------------------------------------- 01813 // Protected utility methods for use by subclasses. These are very handy 01814 // for implementing add, roll, and computeFields. 01815 //------------------------------------------------------------------------- 01816 01846 virtual void pinField(UCalendarDateFields field, UErrorCode& status); 01847 01891 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek); 01892 01893 01924 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek); 01925 01930 int32_t getLocalDOW(); 01931 01932 private: 01933 01937 int32_t fNextStamp;// = MINIMUM_USER_STAMP; 01938 01943 void recalculateStamp(); 01944 01948 UDate fTime; 01949 01953 UBool fLenient; 01954 01959 TimeZone* fZone; 01960 01969 UCalendarDaysOfWeek fFirstDayOfWeek; 01970 uint8_t fMinimalDaysInFirstWeek; 01971 UCalendarDaysOfWeek fWeekendOnset; 01972 int32_t fWeekendOnsetMillis; 01973 UCalendarDaysOfWeek fWeekendCease; 01974 int32_t fWeekendCeaseMillis; 01975 01986 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success); 01987 01997 void updateTime(UErrorCode& status); 01998 02004 int32_t fGregorianYear; 02005 02011 int32_t fGregorianMonth; 02012 02018 int32_t fGregorianDayOfYear; 02019 02025 int32_t fGregorianDayOfMonth; 02026 02027 /* calculations */ 02028 02035 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec); 02036 02037 protected: 02038 02046 void computeGregorianFields(int32_t julianDay, UErrorCode &ec); 02047 02048 private: 02049 02070 void computeWeekFields(UErrorCode &ec); 02071 02072 02081 void validateFields(UErrorCode &status); 02082 02091 virtual void validateField(UCalendarDateFields field, UErrorCode &status); 02092 02101 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status); 02102 02103 protected: 02113 static uint8_t julianDayToDayOfWeek(double julian); 02114 02115 private: 02116 char validLocale[ULOC_FULLNAME_CAPACITY]; 02117 char actualLocale[ULOC_FULLNAME_CAPACITY]; 02118 02119 public: 02120 #if !UCONFIG_NO_SERVICE 02121 02131 static StringEnumeration* getAvailableLocales(void); 02132 02141 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status); 02142 02153 static UBool unregister(URegistryKey key, UErrorCode& status); 02154 02159 friend class CalendarFactory; 02160 02165 friend class CalendarService; 02166 02171 friend class DefaultCalendarFactory; 02172 #endif /* !UCONFIG_NO_SERVICE */ 02173 02178 virtual UBool haveDefaultCentury() const = 0; 02179 02184 virtual UDate defaultCenturyStart() const = 0; 02189 virtual int32_t defaultCenturyStartYear() const = 0; 02190 02197 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const; 02198 02205 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; 02206 02207 }; 02208 02209 // ------------------------------------- 02210 02211 inline Calendar* 02212 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode) 02213 { 02214 // since the Locale isn't specified, use the default locale 02215 return createInstance(zone, Locale::getDefault(), errorCode); 02216 } 02217 02218 // ------------------------------------- 02219 02220 inline void 02221 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status) 02222 { 02223 roll(field, (int32_t)(up ? +1 : -1), status); 02224 } 02225 02226 inline void 02227 Calendar::roll(EDateFields field, UBool up, UErrorCode& status) 02228 { 02229 roll((UCalendarDateFields) field, up, status); 02230 } 02231 02232 02233 // ------------------------------------- 02234 02240 inline void 02241 Calendar::internalSet(UCalendarDateFields field, int32_t value) 02242 { 02243 fFields[field] = value; 02244 fStamp[field] = kInternallySet; 02245 fIsSet[field] = TRUE; // Remove later 02246 } 02247 02248 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek) 02249 { 02250 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek); 02251 } 02252 02253 02254 U_NAMESPACE_END 02255 02256 #endif /* #if !UCONFIG_NO_FORMATTING */ 02257 02258 #endif // _CALENDAR