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 #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 ERA,
00176 YEAR,
00177 MONTH,
00178 WEEK_OF_YEAR,
00179 WEEK_OF_MONTH,
00180 DATE,
00181 DAY_OF_YEAR,
00182 DAY_OF_WEEK,
00183 DAY_OF_WEEK_IN_MONTH,
00184 AM_PM,
00185 HOUR,
00186 HOUR_OF_DAY,
00187 MINUTE,
00188 SECOND,
00189 MILLISECOND,
00190 ZONE_OFFSET,
00191 DST_OFFSET,
00192 YEAR_WOY,
00193 DOW_LOCAL,
00194
00195 FIELD_COUNT = UCAL_FIELD_COUNT
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* U_EXPORT2 createInstance(UErrorCode& success);
00269
00282 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00283
00295 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00296
00307 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00308
00322 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00323
00336 static Calendar* U_EXPORT2 createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00337
00347 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00348
00356 static UDate U_EXPORT2 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
01537 virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01538
01544 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01545
01546
01547 private:
01556 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01557
01558
01559 protected:
01564 UBool fIsTimeSet;
01565
01576 UBool fAreFieldsSet;
01577
01583 UBool fAreAllFieldsSet;
01584
01592 UBool fAreFieldsVirtuallySet;
01593
01600 UDate internalGetTime(void) const { return fTime; }
01601
01609 void internalSetTime(UDate time) { fTime = time; }
01610
01615 int32_t fFields[UCAL_FIELD_COUNT];
01616
01621 UBool fIsSet[UCAL_FIELD_COUNT];
01622
01626 enum {
01627 kUnset = 0,
01628 kInternallySet,
01629 kMinimumUserStamp
01630 };
01631
01638 int32_t fStamp[UCAL_FIELD_COUNT];
01639
01664 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01665
01672 int32_t getGregorianYear() const {
01673 return fGregorianYear;
01674 }
01675
01682 int32_t getGregorianMonth() const {
01683 return fGregorianMonth;
01684 }
01685
01692 int32_t getGregorianDayOfYear() const {
01693 return fGregorianDayOfYear;
01694 }
01695
01702 int32_t getGregorianDayOfMonth() const {
01703 return fGregorianDayOfMonth;
01704 }
01705
01712 virtual int32_t getDefaultMonthInYear() ;
01713
01714
01720 virtual int32_t getDefaultDayInMonth(int32_t );
01721
01722
01723
01724
01725
01726
01756 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
01757
01801 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
01802
01803
01834 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
01835
01840 int32_t getLocalDOW();
01841
01842 private:
01843
01847 int32_t fNextStamp;
01848
01852 UDate fTime;
01853
01857 UBool fLenient;
01858
01863 TimeZone* fZone;
01864
01873 UCalendarDaysOfWeek fFirstDayOfWeek;
01874 uint8_t fMinimalDaysInFirstWeek;
01875
01886 void setWeekCountData(const Locale& desiredLocale, const char *type, UErrorCode& success);
01887
01897 void updateTime(UErrorCode& status);
01898
01903 int32_t fGregorianYear;
01904
01909 int32_t fGregorianMonth;
01910
01915 int32_t fGregorianDayOfYear;
01916
01921 int32_t fGregorianDayOfMonth;
01922
01923
01924
01931 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
01932
01943 void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
01944
01965 void computeWeekFields(UErrorCode &ec);
01966
01967
01976 void validateFields(UErrorCode &status);
01977
01986 virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01987
01996 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
01997
01998 protected:
02008 static uint8_t julianDayToDayOfWeek(double julian);
02009
02010 private:
02011 char validLocale[ULOC_FULLNAME_CAPACITY];
02012 char actualLocale[ULOC_FULLNAME_CAPACITY];
02013
02014 public:
02015 #if !UCONFIG_NO_SERVICE
02016
02026 static StringEnumeration* getAvailableLocales(void);
02027
02036 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02037
02048 static UBool unregister(URegistryKey key, UErrorCode& status);
02049
02054 friend class CalendarFactory;
02055
02060 friend class CalendarService;
02061
02066 friend class DefaultCalendarFactory;
02067 #endif
02068
02073 virtual UBool haveDefaultCentury() const = 0;
02074
02079 virtual UDate defaultCenturyStart() const = 0;
02084 virtual int32_t defaultCenturyStartYear() const = 0;
02085
02092 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02093
02100 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02101
02102 };
02103
02104
02105
02106 inline Calendar*
02107 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02108 {
02109
02110 return createInstance(zone, Locale::getDefault(), errorCode);
02111 }
02112
02113
02114
02115 inline void
02116 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02117 {
02118 roll(field, (int32_t)(up ? +1 : -1), status);
02119 }
02120
02121 inline void
02122 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02123 {
02124 roll((UCalendarDateFields) field, up, status);
02125 }
02126
02127
02128
02129
02135 inline void
02136 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02137 {
02138 fFields[field] = value;
02139 fStamp[field] = kInternallySet;
02140 fIsSet[field] = TRUE;
02141 }
02142
02143 inline void
02144 Calendar::internalSet(EDateFields field, int32_t value)
02145 {
02146 internalSet((UCalendarDateFields) field, value);
02147 }
02148
02149 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02150 {
02151 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02152 }
02153
02154
02155 U_NAMESPACE_END
02156
02157 #endif
02158
02159 #endif // _CALENDAR