calendar.h

Go to the documentation of this file.
00001 /*
00002 ********************************************************************************
00003 *   Copyright (C) 1997-2008, 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         ERA,                  // Example: 0..1
00177         YEAR,                 // Example: 1..big number
00178         MONTH,                // Example: 0..11
00179         WEEK_OF_YEAR,         // Example: 1..53
00180         WEEK_OF_MONTH,        // Example: 1..4
00181         DATE,                 // Example: 1..31
00182         DAY_OF_YEAR,          // Example: 1..365
00183         DAY_OF_WEEK,          // Example: 1..7
00184         DAY_OF_WEEK_IN_MONTH, // Example: 1..4, may be specified as -1
00185         AM_PM,                // Example: 0..1
00186         HOUR,                 // Example: 0..11
00187         HOUR_OF_DAY,          // Example: 0..23
00188         MINUTE,               // Example: 0..59
00189         SECOND,               // Example: 0..59
00190         MILLISECOND,          // Example: 0..999
00191         ZONE_OFFSET,          // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR
00192         DST_OFFSET,           // Example: 0 or U_MILLIS_PER_HOUR
00193         YEAR_WOY,             // 'Y' Example: 1..big number - Year of Week of Year
00194         DOW_LOCAL,            // 'e' Example: 1..7 - Day of Week / Localized
00195                 
00196                 EXTENDED_YEAR,
00197                 JULIAN_DAY,
00198                 MILLISECONDS_IN_DAY,
00199                 IS_LEAP_MONTH,
00200 
00201         FIELD_COUNT = UCAL_FIELD_COUNT // See ucal.h for other fields.
00202 #endif /* U_HIDE_DEPRECATED_API */
00203     };
00204 
00211     enum EDaysOfWeek {
00212 #ifndef U_HIDE_DEPRECATED_API
00213         SUNDAY = 1,
00214         MONDAY,
00215         TUESDAY,
00216         WEDNESDAY,
00217         THURSDAY,
00218         FRIDAY,
00219         SATURDAY
00220 #endif /* U_HIDE_DEPRECATED_API */
00221     };
00222 
00227     enum EMonths {
00228 #ifndef U_HIDE_DEPRECATED_API
00229         JANUARY,
00230         FEBRUARY,
00231         MARCH,
00232         APRIL,
00233         MAY,
00234         JUNE,
00235         JULY,
00236         AUGUST,
00237         SEPTEMBER,
00238         OCTOBER,
00239         NOVEMBER,
00240         DECEMBER,
00241         UNDECIMBER
00242 #endif /* U_HIDE_DEPRECATED_API */
00243     };
00244 
00249     enum EAmpm {
00250 #ifndef U_HIDE_DEPRECATED_API
00251         AM,
00252         PM
00253 #endif /* U_HIDE_DEPRECATED_API */
00254     };
00255 
00260     virtual ~Calendar();
00261 
00268     virtual Calendar* clone(void) const = 0;
00269 
00281     static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00282 
00295     static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00296 
00308     static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00309 
00320     static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00321 
00335     static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00336 
00349     static Calendar* U_EXPORT2 createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00350 
00360     static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00361 
00369     static UDate U_EXPORT2 getNow(void);
00370 
00384     inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00385 
00396     inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00397 
00409     virtual UBool operator==(const Calendar& that) const;
00410 
00419     UBool operator!=(const Calendar& that) const {return !operator==(that);}
00420 
00431     virtual UBool isEquivalentTo(const Calendar& other) const;
00432 
00447     UBool equals(const Calendar& when, UErrorCode& status) const;
00448 
00462     UBool before(const Calendar& when, UErrorCode& status) const;
00463 
00477     UBool after(const Calendar& when, UErrorCode& status) const;
00478 
00496     virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00497 
00515     virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00516 
00540     inline void roll(EDateFields field, UBool up, UErrorCode& status);
00541 
00565     inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00566 
00589     virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00590 
00613     virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00614 
00670     virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00671 
00727     virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00728 
00737     void adoptTimeZone(TimeZone* value);
00738 
00746     void setTimeZone(const TimeZone& zone);
00747 
00756     const TimeZone& getTimeZone(void) const;
00757 
00766     TimeZone* orphanTimeZone(void);
00767 
00776     virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00777 
00790     void setLenient(UBool lenient);
00791 
00798     UBool isLenient(void) const;
00799 
00806     void setFirstDayOfWeek(EDaysOfWeek value);
00807 
00814     void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00815 
00822     EDaysOfWeek getFirstDayOfWeek(void) const;
00823 
00831     UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00832 
00842     void setMinimalDaysInFirstWeek(uint8_t value);
00843 
00853     uint8_t getMinimalDaysInFirstWeek(void) const;
00854 
00863     virtual int32_t getMinimum(EDateFields field) const;
00864 
00873     virtual int32_t getMinimum(UCalendarDateFields field) const;
00874 
00883     virtual int32_t getMaximum(EDateFields field) const;
00884 
00893     virtual int32_t getMaximum(UCalendarDateFields field) const;
00894 
00903     virtual int32_t getGreatestMinimum(EDateFields field) const;
00904 
00913     virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
00914 
00923     virtual int32_t getLeastMaximum(EDateFields field) const;
00924 
00933     virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
00934 
00949     int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00950 
00965     virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
00966 
00983     int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00984 
01001     virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
01002 
01016     int32_t get(EDateFields field, UErrorCode& status) const;
01017 
01031     int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01032 
01041     UBool isSet(EDateFields field) const;
01042 
01051     UBool isSet(UCalendarDateFields field) const;
01052 
01060     void set(EDateFields field, int32_t value);
01061 
01069     void set(UCalendarDateFields field, int32_t value);
01070 
01081     void set(int32_t year, int32_t month, int32_t date);
01082 
01095     void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01096 
01110     void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01111 
01118     void clear(void);
01119 
01128     void clear(EDateFields field);
01129 
01138     void clear(UCalendarDateFields field);
01139 
01155     virtual UClassID getDynamicClassID(void) const = 0;
01156 
01165     virtual const char * getType() const = 0;
01166 
01167 protected:
01168 
01177     Calendar(UErrorCode& success);
01178 
01185     Calendar(const Calendar& source);
01186 
01193     Calendar& operator=(const Calendar& right);
01194 
01205     Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01206 
01216     Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01217 
01226     virtual void computeTime(UErrorCode& status);
01227 
01239     virtual void computeFields(UErrorCode& status);
01240 
01250     double getTimeInMillis(UErrorCode& status) const;
01251 
01260     void setTimeInMillis( double millis, UErrorCode& status );
01261 
01271     void complete(UErrorCode& status);
01272 
01281     inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01282 
01293     inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01294 
01303     inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01304 
01314     void internalSet(EDateFields field, int32_t value);
01315 
01325     inline void internalSet(UCalendarDateFields field, int32_t value);
01326 
01333     virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01334 
01339     enum ELimitType {
01340       UCAL_LIMIT_MINIMUM = 0,
01341       UCAL_LIMIT_GREATEST_MINIMUM,
01342       UCAL_LIMIT_LEAST_MAXIMUM,
01343       UCAL_LIMIT_MAXIMUM,
01344       UCAL_LIMIT_COUNT
01345     };
01346 
01368     virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01369 
01377     virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01378 
01379 
01393     virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01394                                                    UBool useMonth) const  = 0;
01395 
01403     virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01404 
01412     virtual int32_t handleGetYearLength(int32_t eyear) const;
01413 
01414 
01423     virtual int32_t handleGetExtendedYear() = 0;
01424 
01433     virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01434 
01443     virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01444 
01451     int32_t computeJulianDay();
01452 
01460     int32_t computeMillisInDay();
01461 
01471     int32_t computeZoneOffset(double millis, int32_t millisInDay, UErrorCode &ec);
01472 
01473 
01482     int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
01483 
01489     enum {
01491       kResolveSTOP = -1,
01493       kResolveRemap = 32
01494     };
01495 
01501     static const UFieldResolutionTable kDatePrecedence[];
01502 
01508     static const UFieldResolutionTable kYearPrecedence[];
01509 
01515     static const UFieldResolutionTable kDOWPrecedence[];
01516 
01544     UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable);
01545 
01546 
01550     virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01551 
01557     UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01558 
01559 
01560 private:
01569     int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01570 
01571 
01572 protected:
01577     UBool      fIsTimeSet;
01578 
01589     UBool      fAreFieldsSet;
01590 
01596     UBool      fAreAllFieldsSet;
01597 
01605     UBool fAreFieldsVirtuallySet;
01606 
01613     UDate        internalGetTime(void) const     { return fTime; }
01614 
01622     void        internalSetTime(UDate time)     { fTime = time; }
01623 
01628     int32_t     fFields[UCAL_FIELD_COUNT];
01629 
01634     UBool      fIsSet[UCAL_FIELD_COUNT];
01635 
01639     enum {
01640         kUnset                 = 0,
01641         kInternallySet,
01642         kMinimumUserStamp
01643     };
01644 
01651     int32_t        fStamp[UCAL_FIELD_COUNT];
01652 
01677     virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01678 
01684     int32_t getGregorianYear() const {
01685         return fGregorianYear;
01686     }
01687 
01693     int32_t getGregorianMonth() const {
01694         return fGregorianMonth;
01695     }
01696 
01702     int32_t getGregorianDayOfYear() const {
01703         return fGregorianDayOfYear;
01704     }
01705 
01711     int32_t getGregorianDayOfMonth() const {
01712       return fGregorianDayOfMonth;
01713     }
01714 
01721     virtual int32_t getDefaultMonthInYear() ;
01722 
01723 
01729     virtual int32_t getDefaultDayInMonth(int32_t /*month*/);
01730 
01731     //-------------------------------------------------------------------------
01732     // Protected utility methods for use by subclasses.  These are very handy
01733     // for implementing add, roll, and computeFields.
01734     //-------------------------------------------------------------------------
01735 
01765     virtual void pinField(UCalendarDateFields field, UErrorCode& status);
01766 
01810     int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
01811 
01812 
01843     inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
01844 
01849     int32_t getLocalDOW();
01850 
01851 private:
01852 
01856     int32_t fNextStamp;// = MINIMUM_USER_STAMP;
01857 
01861     UDate        fTime;
01862 
01866     UBool      fLenient;
01867 
01872     TimeZone*   fZone;
01873 
01882     UCalendarDaysOfWeek fFirstDayOfWeek;
01883     uint8_t     fMinimalDaysInFirstWeek;
01884 
01895     void        setWeekCountData(const Locale& desiredLocale, const char *type, UErrorCode& success);
01896 
01906     void updateTime(UErrorCode& status);
01907 
01913     int32_t fGregorianYear;
01914 
01920     int32_t fGregorianMonth;
01921 
01927     int32_t fGregorianDayOfYear;
01928 
01934     int32_t fGregorianDayOfMonth;
01935 
01936     /* calculations */
01937 
01944     void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
01945 
01946         protected:
01947 
01958     void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
01959 
01960         private:
01961 
01982     void computeWeekFields(UErrorCode &ec);
01983 
01984 
01993     void validateFields(UErrorCode &status);
01994 
02003     virtual void validateField(UCalendarDateFields field, UErrorCode &status);
02004 
02013     void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02014 
02015  protected:
02025     static uint8_t julianDayToDayOfWeek(double julian);
02026 
02027  private:
02028     char validLocale[ULOC_FULLNAME_CAPACITY];
02029     char actualLocale[ULOC_FULLNAME_CAPACITY];
02030 
02031  public:
02032 #if !UCONFIG_NO_SERVICE
02033 
02043     static StringEnumeration* getAvailableLocales(void);
02044 
02053     static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02054 
02065     static UBool unregister(URegistryKey key, UErrorCode& status);
02066 
02071     friend class CalendarFactory;
02072 
02077     friend class CalendarService;
02078 
02083     friend class DefaultCalendarFactory;
02084 #endif /* !UCONFIG_NO_SERVICE */
02085 
02090     virtual UBool haveDefaultCentury() const = 0;
02091 
02096     virtual UDate defaultCenturyStart() const = 0;
02101     virtual int32_t defaultCenturyStartYear() const = 0;
02102 
02109     Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02110 
02117     const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02118 
02119 };
02120 
02121 // -------------------------------------
02122 
02123 inline Calendar*
02124 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02125 {
02126     // since the Locale isn't specified, use the default locale
02127     return createInstance(zone, Locale::getDefault(), errorCode);
02128 }
02129 
02130 // -------------------------------------
02131 
02132 inline void
02133 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02134 {
02135     roll(field, (int32_t)(up ? +1 : -1), status);
02136 }
02137 
02138 inline void
02139 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02140 {
02141     roll((UCalendarDateFields) field, up, status);
02142 }
02143 
02144 
02145 // -------------------------------------
02146 
02152 inline void
02153 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02154 {
02155     fFields[field] = value;
02156     fStamp[field] = kInternallySet;
02157     fIsSet[field]     = TRUE; // Remove later
02158 }
02159 
02160 inline int32_t  Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02161 {
02162   return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02163 }
02164 
02165 
02166 U_NAMESPACE_END
02167 
02168 #endif /* #if !UCONFIG_NO_FORMATTING */
02169 
02170 #endif // _CALENDAR

Generated on Thu Jan 15 11:25:47 2009 for ICU 4.0.1 by  doxygen 1.4.7