00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
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,
00180 YEAR,
00181 MONTH,
00182 WEEK_OF_YEAR,
00183 WEEK_OF_MONTH,
00184 DATE,
00185 DAY_OF_YEAR,
00186 DAY_OF_WEEK,
00187 DAY_OF_WEEK_IN_MONTH,
00188 AM_PM,
00189 HOUR,
00190 HOUR_OF_DAY,
00191 MINUTE,
00192 SECOND,
00193 MILLISECOND,
00194 ZONE_OFFSET,
00195 DST_OFFSET,
00196 YEAR_WOY,
00197 DOW_LOCAL,
00198
00199 FIELD_COUNT = UCAL_FIELD_COUNT
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 );
01725
01726
01727
01728
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;
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
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
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
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;
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
02162
02163 #endif // _CALENDAR