calendar.h

Go to the documentation of this file.
00001 /*
00002 ********************************************************************************
00003 *   Copyright (C) 1997-2005, 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 
00041 U_NAMESPACE_BEGIN
00042 
00043 class ICUServiceFactory;
00044 
00048 typedef const void* URegistryKey;
00049 
00053 typedef int32_t UFieldResolutionTable[12][8];
00054 
00169 class U_I18N_API Calendar : public UObject {
00170 public:
00171 
00178     enum EDateFields {
00179         ERA,                  // Example: 0..1
00180         YEAR,                 // Example: 1..big number
00181         MONTH,                // Example: 0..11
00182         WEEK_OF_YEAR,         // Example: 1..53
00183         WEEK_OF_MONTH,        // Example: 1..4
00184         DATE,                 // Example: 1..31
00185         DAY_OF_YEAR,          // Example: 1..365
00186         DAY_OF_WEEK,          // Example: 1..7
00187         DAY_OF_WEEK_IN_MONTH, // Example: 1..4, may be specified as -1
00188         AM_PM,                // Example: 0..1
00189         HOUR,                 // Example: 0..11
00190         HOUR_OF_DAY,          // Example: 0..23
00191         MINUTE,               // Example: 0..59
00192         SECOND,               // Example: 0..59
00193         MILLISECOND,          // Example: 0..999
00194         ZONE_OFFSET,          // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR
00195         DST_OFFSET,           // Example: 0 or U_MILLIS_PER_HOUR
00196         YEAR_WOY,             // 'Y' Example: 1..big number - Year of Week of Year
00197         DOW_LOCAL,            // 'e' Example: 1..7 - Day of Week / Localized
00198 
00199         FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields.
00200     };
00201 
00208     enum EDaysOfWeek {
00209         SUNDAY = 1,
00210         MONDAY,
00211         TUESDAY,
00212         WEDNESDAY,
00213         THURSDAY,
00214         FRIDAY,
00215         SATURDAY
00216     };
00217 
00222     enum EMonths {
00223         JANUARY,
00224         FEBRUARY,
00225         MARCH,
00226         APRIL,
00227         MAY,
00228         JUNE,
00229         JULY,
00230         AUGUST,
00231         SEPTEMBER,
00232         OCTOBER,
00233         NOVEMBER,
00234         DECEMBER,
00235         UNDECIMBER
00236     };
00237 
00242     enum EAmpm {
00243         AM,
00244         PM
00245     };
00246 
00251     virtual ~Calendar();
00252 
00259     virtual Calendar* clone(void) const = 0;
00260 
00272     static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00273 
00286     static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00287 
00299     static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00300 
00311     static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00312 
00326     static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00327 
00340     static Calendar* U_EXPORT2 createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00341 
00351     static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00352 
00360     static UDate U_EXPORT2 getNow(void);
00361 
00375     inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00376 
00387     inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00388 
00400     virtual UBool operator==(const Calendar& that) const;
00401 
00410     UBool operator!=(const Calendar& that) const {return !operator==(that);}
00411 
00422     virtual UBool isEquivalentTo(const Calendar& other) const;
00423 
00438     UBool equals(const Calendar& when, UErrorCode& status) const;
00439 
00453     UBool before(const Calendar& when, UErrorCode& status) const;
00454 
00468     UBool after(const Calendar& when, UErrorCode& status) const;
00469 
00487     virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00488 
00506     virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00507 
00531     inline void roll(EDateFields field, UBool up, UErrorCode& status);
00532 
00556     inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00557 
00580     virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00581 
00604     virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00605 
00661     virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00662 
00718     virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00719 
00728     void adoptTimeZone(TimeZone* value);
00729 
00737     void setTimeZone(const TimeZone& zone);
00738 
00747     const TimeZone& getTimeZone(void) const;
00748 
00757     TimeZone* orphanTimeZone(void);
00758 
00767     virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00768 
00781     void setLenient(UBool lenient);
00782 
00789     UBool isLenient(void) const;
00790 
00797     void setFirstDayOfWeek(EDaysOfWeek value);
00798 
00805     void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00806 
00813     EDaysOfWeek getFirstDayOfWeek(void) const;
00814 
00822     UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00823 
00833     void setMinimalDaysInFirstWeek(uint8_t value);
00834 
00844     uint8_t getMinimalDaysInFirstWeek(void) const;
00845 
00854     virtual int32_t getMinimum(EDateFields field) const;
00855 
00864     virtual int32_t getMinimum(UCalendarDateFields field) const;
00865 
00874     virtual int32_t getMaximum(EDateFields field) const;
00875 
00884     virtual int32_t getMaximum(UCalendarDateFields field) const;
00885 
00894     virtual int32_t getGreatestMinimum(EDateFields field) const;
00895 
00904     virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
00905 
00914     virtual int32_t getLeastMaximum(EDateFields field) const;
00915 
00924     virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
00925 
00940     int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00941 
00956     int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
00957 
00974     int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00975 
00992     int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
00993 
01007     int32_t get(EDateFields field, UErrorCode& status) const;
01008 
01022     int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01023 
01032     UBool isSet(EDateFields field) const;
01033 
01042     UBool isSet(UCalendarDateFields field) const;
01043 
01051     void set(EDateFields field, int32_t value);
01052 
01060     void set(UCalendarDateFields field, int32_t value);
01061 
01072     void set(int32_t year, int32_t month, int32_t date);
01073 
01086     void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01087 
01101     void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01102 
01109     void clear(void);
01110 
01119     void clear(EDateFields field);
01120 
01129     void clear(UCalendarDateFields field);
01130 
01146     virtual UClassID getDynamicClassID(void) const = 0;
01147 
01156     virtual const char * getType() const = 0;
01157 
01158 protected:
01159 
01168     Calendar(UErrorCode& success);
01169 
01176     Calendar(const Calendar& source);
01177 
01184     Calendar& operator=(const Calendar& right);
01185 
01196     Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01197 
01207     Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01208 
01217     virtual void computeTime(UErrorCode& status);
01218 
01230     virtual void computeFields(UErrorCode& status);
01231 
01241     double getTimeInMillis(UErrorCode& status) const;
01242 
01251     void setTimeInMillis( double millis, UErrorCode& status );
01252 
01262     void complete(UErrorCode& status);
01263 
01272     inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01273 
01284     inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01285 
01294     inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01295 
01305     void internalSet(EDateFields field, int32_t value);
01306 
01316     inline void internalSet(UCalendarDateFields field, int32_t value);
01317 
01324     virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01325 
01330     enum ELimitType {
01331       UCAL_LIMIT_MINIMUM = 0,
01332       UCAL_LIMIT_GREATEST_MINIMUM,
01333       UCAL_LIMIT_LEAST_MAXIMUM,
01334       UCAL_LIMIT_MAXIMUM,
01335       UCAL_LIMIT_COUNT
01336     };
01337 
01359     virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01360 
01368     virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01369 
01370 
01384     virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01385                                                    UBool useMonth) const  = 0;
01386 
01394     virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01395 
01403     virtual int32_t handleGetYearLength(int32_t eyear) const;
01404 
01405 
01414     virtual int32_t handleGetExtendedYear() = 0;
01415 
01424     virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01425 
01434     virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01435 
01442     int32_t computeJulianDay();
01443 
01451     int32_t computeMillisInDay();
01452 
01462     int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec);
01463 
01464 
01473     int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
01474 
01480     enum {
01482       kResolveSTOP = -1,
01484       kResolveRemap = 32
01485     };
01486 
01492     static const UFieldResolutionTable kDatePrecedence[];
01493 
01499     static const UFieldResolutionTable kYearPrecedence[];
01500 
01506     static const UFieldResolutionTable kDOWPrecedence[];
01507 
01535     UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable);
01536 
01537 
01541     virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01542 
01548     UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01549 
01550 
01551 private:
01560     int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01561 
01562 
01563 protected:
01568     UBool      fIsTimeSet;
01569 
01580     UBool      fAreFieldsSet;
01581 
01587     UBool      fAreAllFieldsSet;
01588 
01596     UBool fAreFieldsVirtuallySet;
01597 
01604     UDate        internalGetTime(void) const     { return fTime; }
01605 
01613     void        internalSetTime(UDate time)     { fTime = time; }
01614 
01619     int32_t     fFields[UCAL_FIELD_COUNT];
01620 
01625     UBool      fIsSet[UCAL_FIELD_COUNT];
01626 
01630     enum {
01631         kUnset                 = 0,
01632         kInternallySet,
01633         kMinimumUserStamp
01634     };
01635 
01642     int32_t        fStamp[UCAL_FIELD_COUNT];
01643 
01668     virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01669 
01676     int32_t getGregorianYear() const {
01677         return fGregorianYear;
01678     }
01679 
01686     int32_t getGregorianMonth() const {
01687         return fGregorianMonth;
01688     }
01689 
01696     int32_t getGregorianDayOfYear() const {
01697         return fGregorianDayOfYear;
01698     }
01699 
01706     int32_t getGregorianDayOfMonth() const {
01707       return fGregorianDayOfMonth;
01708     }
01709 
01716     virtual int32_t getDefaultMonthInYear() ;
01717 
01718 
01724     virtual int32_t getDefaultDayInMonth(int32_t /*month*/);
01725 
01726     //-------------------------------------------------------------------------
01727     // Protected utility methods for use by subclasses.  These are very handy
01728     // for implementing add, roll, and computeFields.
01729     //-------------------------------------------------------------------------
01730 
01760     virtual void pinField(UCalendarDateFields field, UErrorCode& status);
01761 
01805     int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
01806 
01807 
01838     inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
01839 
01844     int32_t getLocalDOW();
01845 
01846 private:
01847 
01851     int32_t fNextStamp;// = MINIMUM_USER_STAMP;
01852 
01856     UDate        fTime;
01857 
01861     UBool      fLenient;
01862 
01867     TimeZone*   fZone;
01868 
01877     UCalendarDaysOfWeek fFirstDayOfWeek;
01878     uint8_t     fMinimalDaysInFirstWeek;
01879 
01890     void        setWeekCountData(const Locale& desiredLocale, const char *type, UErrorCode& success);
01891 
01901     void updateTime(UErrorCode& status);
01902 
01907     int32_t fGregorianYear;
01908 
01913     int32_t fGregorianMonth;
01914 
01919     int32_t fGregorianDayOfYear;
01920 
01925     int32_t fGregorianDayOfMonth;
01926 
01927     /* calculations */
01928 
01935     void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
01936 
01947     void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
01948 
01969     void computeWeekFields(UErrorCode &ec);
01970 
01971 
01980     void validateFields(UErrorCode &status);
01981 
01990     virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01991 
02000     void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02001 
02002  protected:
02012     static uint8_t julianDayToDayOfWeek(double julian);
02013 
02014  private:
02015     char validLocale[ULOC_FULLNAME_CAPACITY];
02016     char actualLocale[ULOC_FULLNAME_CAPACITY];
02017 
02018  public:
02019 #if !UCONFIG_NO_SERVICE
02020 
02030     static StringEnumeration* getAvailableLocales(void);
02031 
02040     static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02041 
02052     static UBool unregister(URegistryKey key, UErrorCode& status);
02053 
02058     friend class CalendarFactory;
02059 
02064     friend class CalendarService;
02065 
02070     friend class DefaultCalendarFactory;
02071 #endif /* !UCONFIG_NO_SERVICE */
02072 
02077     virtual UBool haveDefaultCentury() const = 0;
02078 
02083     virtual UDate defaultCenturyStart() const = 0;
02088     virtual int32_t defaultCenturyStartYear() const = 0;
02089 
02096     Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02097 
02104     const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02105 
02106 };
02107 
02108 // -------------------------------------
02109 
02110 inline Calendar*
02111 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02112 {
02113     // since the Locale isn't specified, use the default locale
02114     return createInstance(zone, Locale::getDefault(), errorCode);
02115 }
02116 
02117 // -------------------------------------
02118 
02119 inline void
02120 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02121 {
02122     roll(field, (int32_t)(up ? +1 : -1), status);
02123 }
02124 
02125 inline void
02126 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02127 {
02128     roll((UCalendarDateFields) field, up, status);
02129 }
02130 
02131 
02132 // -------------------------------------
02133 
02139 inline void
02140 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02141 {
02142     fFields[field] = value;
02143     fStamp[field] = kInternallySet;
02144     fIsSet[field]     = TRUE; // Remove later
02145 }
02146 
02147 inline void
02148 Calendar::internalSet(EDateFields field, int32_t value)
02149 {
02150     internalSet((UCalendarDateFields) field, value);
02151 }
02152 
02153 inline int32_t  Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02154 {
02155   return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02156 }
02157 
02158 
02159 U_NAMESPACE_END
02160 
02161 #endif /* #if !UCONFIG_NO_FORMATTING */
02162 
02163 #endif // _CALENDAR

Generated on Tue Sep 13 11:08:15 2005 for ICU 3.4 by  doxygen 1.4.4