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 #ifndef U_HIDE_DEPRECATED_API
00176 ERA,
00177 YEAR,
00178 MONTH,
00179 WEEK_OF_YEAR,
00180 WEEK_OF_MONTH,
00181 DATE,
00182 DAY_OF_YEAR,
00183 DAY_OF_WEEK,
00184 DAY_OF_WEEK_IN_MONTH,
00185 AM_PM,
00186 HOUR,
00187 HOUR_OF_DAY,
00188 MINUTE,
00189 SECOND,
00190 MILLISECOND,
00191 ZONE_OFFSET,
00192 DST_OFFSET,
00193 YEAR_WOY,
00194 DOW_LOCAL,
00195
00196 EXTENDED_YEAR,
00197 JULIAN_DAY,
00198 MILLISECONDS_IN_DAY,
00199 IS_LEAP_MONTH,
00200
00201 FIELD_COUNT = UCAL_FIELD_COUNT
00202 #endif
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
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
00243 };
00244
00249 enum EAmpm {
00250 #ifndef U_HIDE_DEPRECATED_API
00251 AM,
00252 PM
00253 #endif
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 );
01730
01731
01732
01733
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;
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
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
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
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;
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
02169
02170 #endif // _CALENDAR