calendar.h

Go to the documentation of this file.
00001 /* 00002 ******************************************************************************** 00003 * Copyright (C) 1997-2004, 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 00030 #if !UCONFIG_NO_FORMATTING 00031 00032 #include "unicode/uobject.h" 00033 #include "unicode/locid.h" 00034 #include "unicode/timezone.h" 00035 #include "unicode/ucal.h" 00036 00037 U_NAMESPACE_BEGIN 00038 00039 class ICUServiceFactory; 00040 00044 typedef const void* URegistryKey; 00045 00049 typedef int32_t UFieldResolutionTable[12][8]; 00050 00165 class U_I18N_API Calendar : public UObject { 00166 public: 00167 00174 enum EDateFields { 00175 ERA, // Example: 0..1 00176 YEAR, // Example: 1..big number 00177 MONTH, // Example: 0..11 00178 WEEK_OF_YEAR, // Example: 1..53 00179 WEEK_OF_MONTH, // Example: 1..4 00180 DATE, // Example: 1..31 00181 DAY_OF_YEAR, // Example: 1..365 00182 DAY_OF_WEEK, // Example: 1..7 00183 DAY_OF_WEEK_IN_MONTH, // Example: 1..4, may be specified as -1 00184 AM_PM, // Example: 0..1 00185 HOUR, // Example: 0..11 00186 HOUR_OF_DAY, // Example: 0..23 00187 MINUTE, // Example: 0..59 00188 SECOND, // Example: 0..59 00189 MILLISECOND, // Example: 0..999 00190 ZONE_OFFSET, // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR 00191 DST_OFFSET, // Example: 0 or U_MILLIS_PER_HOUR 00192 YEAR_WOY, // 'Y' Example: 1..big number - Year of Week of Year 00193 DOW_LOCAL, // 'e' Example: 1..7 - Day of Week / Localized 00194 00195 FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields. 00196 }; 00197 00204 enum EDaysOfWeek { 00205 SUNDAY = 1, 00206 MONDAY, 00207 TUESDAY, 00208 WEDNESDAY, 00209 THURSDAY, 00210 FRIDAY, 00211 SATURDAY 00212 }; 00213 00218 enum EMonths { 00219 JANUARY, 00220 FEBRUARY, 00221 MARCH, 00222 APRIL, 00223 MAY, 00224 JUNE, 00225 JULY, 00226 AUGUST, 00227 SEPTEMBER, 00228 OCTOBER, 00229 NOVEMBER, 00230 DECEMBER, 00231 UNDECIMBER 00232 }; 00233 00238 enum EAmpm { 00239 AM, 00240 PM 00241 }; 00242 00247 virtual ~Calendar(); 00248 00255 virtual Calendar* clone(void) const = 0; 00256 00268 static Calendar* createInstance(UErrorCode& success); 00269 00282 static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success); 00283 00295 static Calendar* createInstance(const TimeZone& zone, UErrorCode& success); 00296 00307 static Calendar* createInstance(const Locale& aLocale, UErrorCode& success); 00308 00322 static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success); 00323 00336 static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success); 00337 00347 static const Locale* getAvailableLocales(int32_t& count); 00348 00356 static UDate getNow(void); 00357 00371 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); } 00372 00383 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); } 00384 00396 virtual UBool operator==(const Calendar& that) const; 00397 00406 UBool operator!=(const Calendar& that) const {return !operator==(that);} 00407 00418 virtual UBool isEquivalentTo(const Calendar& other) const; 00419 00434 UBool equals(const Calendar& when, UErrorCode& status) const; 00435 00449 UBool before(const Calendar& when, UErrorCode& status) const; 00450 00464 UBool after(const Calendar& when, UErrorCode& status) const; 00465 00483 virtual void add(EDateFields field, int32_t amount, UErrorCode& status); 00484 00502 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status); 00503 00527 inline void roll(EDateFields field, UBool up, UErrorCode& status); 00528 00552 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status); 00553 00576 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status); 00577 00600 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status); 00601 00657 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status); 00658 00714 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status); 00715 00724 void adoptTimeZone(TimeZone* value); 00725 00733 void setTimeZone(const TimeZone& zone); 00734 00743 const TimeZone& getTimeZone(void) const; 00744 00753 TimeZone* orphanTimeZone(void); 00754 00763 virtual UBool inDaylightTime(UErrorCode& status) const = 0; 00764 00777 void setLenient(UBool lenient); 00778 00785 UBool isLenient(void) const; 00786 00793 void setFirstDayOfWeek(EDaysOfWeek value); 00794 00801 void setFirstDayOfWeek(UCalendarDaysOfWeek value); 00802 00809 EDaysOfWeek getFirstDayOfWeek(void) const; 00810 00818 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const; 00819 00829 void setMinimalDaysInFirstWeek(uint8_t value); 00830 00840 uint8_t getMinimalDaysInFirstWeek(void) const; 00841 00850 virtual int32_t getMinimum(EDateFields field) const; 00851 00860 virtual int32_t getMinimum(UCalendarDateFields field) const; 00861 00870 virtual int32_t getMaximum(EDateFields field) const; 00871 00880 virtual int32_t getMaximum(UCalendarDateFields field) const; 00881 00890 virtual int32_t getGreatestMinimum(EDateFields field) const; 00891 00900 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const; 00901 00910 virtual int32_t getLeastMaximum(EDateFields field) const; 00911 00920 virtual int32_t getLeastMaximum(UCalendarDateFields field) const; 00921 00936 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; 00937 00952 int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const; 00953 00970 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const; 00971 00988 int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const; 00989 01003 int32_t get(EDateFields field, UErrorCode& status) const; 01004 01018 int32_t get(UCalendarDateFields field, UErrorCode& status) const; 01019 01028 UBool isSet(EDateFields field) const; 01029 01038 UBool isSet(UCalendarDateFields field) const; 01039 01047 void set(EDateFields field, int32_t value); 01048 01056 void set(UCalendarDateFields field, int32_t value); 01057 01068 void set(int32_t year, int32_t month, int32_t date); 01069 01082 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute); 01083 01097 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second); 01098 01105 void clear(void); 01106 01115 void clear(EDateFields field); 01116 01125 void clear(UCalendarDateFields field); 01126 01142 virtual UClassID getDynamicClassID(void) const = 0; 01143 01152 virtual const char * getType() const = 0; 01153 01154 protected: 01155 01164 Calendar(UErrorCode& success); 01165 01172 Calendar(const Calendar& source); 01173 01180 Calendar& operator=(const Calendar& right); 01181 01192 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success); 01193 01203 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); 01204 01213 virtual void computeTime(UErrorCode& status); 01214 01226 virtual void computeFields(UErrorCode& status); 01227 01237 double getTimeInMillis(UErrorCode& status) const; 01238 01247 void setTimeInMillis( double millis, UErrorCode& status ); 01248 01258 void complete(UErrorCode& status); 01259 01268 inline int32_t internalGet(EDateFields field) const {return fFields[field];} 01269 01280 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;} 01281 01290 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];} 01291 01301 void internalSet(EDateFields field, int32_t value); 01302 01312 inline void internalSet(UCalendarDateFields field, int32_t value); 01313 01320 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status); 01321 01326 enum ELimitType { 01327 UCAL_LIMIT_MINIMUM = 0, 01328 UCAL_LIMIT_GREATEST_MINIMUM, 01329 UCAL_LIMIT_LEAST_MAXIMUM, 01330 UCAL_LIMIT_MAXIMUM, 01331 UCAL_LIMIT_COUNT 01332 }; 01333 01355 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0; 01356 01364 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const; 01365 01366 01380 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month, 01381 UBool useMonth) const = 0; 01382 01390 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ; 01391 01399 virtual int32_t handleGetYearLength(int32_t eyear) const; 01400 01401 01410 virtual int32_t handleGetExtendedYear() = 0; 01411 01420 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField); 01421 01430 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy); 01431 01438 int32_t computeJulianDay(); 01439 01447 int32_t computeMillisInDay(); 01448 01458 int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec); 01459 01460 01469 int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const; 01470 01476 enum { 01478 kResolveSTOP = -1, 01480 kResolveRemap = 32 01481 }; 01482 01488 static const UFieldResolutionTable kDatePrecedence[]; 01489 01495 static const UFieldResolutionTable kYearPrecedence[]; 01496 01502 static const UFieldResolutionTable kDOWPrecedence[]; 01503 01531 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable); 01532 01533 virtual const UFieldResolutionTable* getFieldResolutionTable() const; 01534 01540 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const; 01541 01542 01543 private: 01552 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const; 01553 01554 01555 protected: 01560 UBool fIsTimeSet; 01561 01572 UBool fAreFieldsSet; 01573 01579 UBool fAreAllFieldsSet; 01580 01588 UBool fAreFieldsVirtuallySet; 01589 01596 UDate internalGetTime(void) const { return fTime; } 01597 01605 void internalSetTime(UDate time) { fTime = time; } 01606 01611 int32_t fFields[UCAL_FIELD_COUNT]; 01612 01617 UBool fIsSet[UCAL_FIELD_COUNT]; 01618 01622 enum { 01623 kUnset = 0, 01624 kInternallySet, 01625 kMinimumUserStamp 01626 }; 01627 01634 int32_t fStamp[UCAL_FIELD_COUNT]; 01635 01660 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status); 01661 01668 int32_t getGregorianYear() const { 01669 return fGregorianYear; 01670 } 01671 01678 int32_t getGregorianMonth() const { 01679 return fGregorianMonth; 01680 } 01681 01688 int32_t getGregorianDayOfYear() const { 01689 return fGregorianDayOfYear; 01690 } 01691 01698 int32_t getGregorianDayOfMonth() const { 01699 return fGregorianDayOfMonth; 01700 } 01701 01708 virtual int32_t getDefaultMonthInYear() ; 01709 01710 01716 virtual int32_t getDefaultDayInMonth(int32_t /*month*/); 01717 01718 //------------------------------------------------------------------------- 01719 // Protected utility methods for use by subclasses. These are very handy 01720 // for implementing add, roll, and computeFields. 01721 //------------------------------------------------------------------------- 01722 01752 virtual void pinField(UCalendarDateFields field, UErrorCode& status); 01753 01797 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek); 01798 01799 01830 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek); 01831 01836 int32_t getLocalDOW(); 01837 01838 private: 01839 01843 int32_t fNextStamp;// = MINIMUM_USER_STAMP; 01844 01848 UDate fTime; 01849 01853 UBool fLenient; 01854 01859 TimeZone* fZone; 01860 01869 UCalendarDaysOfWeek fFirstDayOfWeek; 01870 uint8_t fMinimalDaysInFirstWeek; 01871 01882 void setWeekCountData(const Locale& desiredLocale, const char *type, UErrorCode& success); 01883 01893 void updateTime(UErrorCode& status); 01894 01898 static const char kDateTimeElements[]; 01899 01903 static const char kDefaultCalendar[]; 01904 01905 01910 int32_t fGregorianYear; 01911 01916 int32_t fGregorianMonth; 01917 01922 int32_t fGregorianDayOfYear; 01923 01928 int32_t fGregorianDayOfMonth; 01929 01930 /* calculations */ 01931 01938 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec); 01939 01950 void computeGregorianFields(int32_t julianDay, UErrorCode &ec); 01951 01972 void computeWeekFields(UErrorCode &ec); 01973 01974 01983 void validateFields(UErrorCode &status); 01984 01993 virtual void validateField(UCalendarDateFields field, UErrorCode &status); 01994 02003 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status); 02004 02005 protected: 02015 static uint8_t julianDayToDayOfWeek(double julian); 02016 02017 private: 02018 char validLocale[ULOC_FULLNAME_CAPACITY]; 02019 char actualLocale[ULOC_FULLNAME_CAPACITY]; 02020 02021 public: 02032 static StringEnumeration* getAvailableLocales(void); 02033 02042 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status); 02043 02054 static UBool unregister(URegistryKey key, UErrorCode& status); 02055 02060 friend class CalendarFactory; 02061 02066 friend class CalendarService; 02067 02072 friend class DefaultCalendarFactory; 02073 02078 virtual UBool haveDefaultCentury() const = 0; 02079 02084 virtual UDate defaultCenturyStart() const = 0; 02089 virtual int32_t defaultCenturyStartYear() const = 0; 02090 02097 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const; 02098 02105 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const; 02106 02107 }; 02108 02109 // ------------------------------------- 02110 02111 inline Calendar* 02112 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode) 02113 { 02114 // since the Locale isn't specified, use the default locale 02115 return createInstance(zone, Locale::getDefault(), errorCode); 02116 } 02117 02118 // ------------------------------------- 02119 02120 inline void 02121 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status) 02122 { 02123 roll(field, (int32_t)(up ? +1 : -1), status); 02124 } 02125 02126 inline void 02127 Calendar::roll(EDateFields field, UBool up, UErrorCode& status) 02128 { 02129 roll((UCalendarDateFields) field, up, status); 02130 } 02131 02132 02133 // ------------------------------------- 02134 02140 inline void 02141 Calendar::internalSet(UCalendarDateFields field, int32_t value) 02142 { 02143 fFields[field] = value; 02144 fStamp[field] = kInternallySet; 02145 fIsSet[field] = TRUE; // Remove later 02146 } 02147 02148 inline void 02149 Calendar::internalSet(EDateFields field, int32_t value) 02150 { 02151 internalSet((UCalendarDateFields) field, value); 02152 } 02153 02154 inline uint8_t Calendar::julianDayToDayOfWeek(double julian) 02155 { 02156 // If julian is negative, then julian%7 will be negative, so we adjust 02157 // accordingly. We add 1 because Julian day 0 is Monday. 02158 int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7); 02159 02160 uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7+UCAL_SUNDAY ) : UCAL_SUNDAY)); 02161 return result; 02162 } 02163 02164 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek) 02165 { 02166 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek); 02167 } 02168 02169 02170 U_NAMESPACE_END 02171 02172 #endif /* #if !UCONFIG_NO_FORMATTING */ 02173 02174 #endif // _CALENDAR

Generated on Fri Jun 18 12:35:56 2004 for ICU by doxygen 1.3.7