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
00026
00027 #ifndef CALENDAR_H
00028 #define CALENDAR_H
00029
00030 #include "unicode/utypes.h"
00031
00032 #if U_SHOW_CPLUSPLUS_API
00033
00038 #if !UCONFIG_NO_FORMATTING
00039
00040 #include "unicode/uobject.h"
00041 #include "unicode/locid.h"
00042 #include "unicode/timezone.h"
00043 #include "unicode/ucal.h"
00044 #include "unicode/umisc.h"
00045
00046 U_NAMESPACE_BEGIN
00047
00048 class ICUServiceFactory;
00049
00053 typedef int32_t UFieldResolutionTable[12][8];
00054
00055 class BasicTimeZone;
00187 class U_I18N_API Calendar : public UObject {
00188 public:
00189 #ifndef U_FORCE_HIDE_DEPRECATED_API
00190
00196 enum EDateFields {
00197 #ifndef U_HIDE_DEPRECATED_API
00198
00199
00200
00201 #ifdef ERA
00202 #undef ERA
00203 #endif
00204 ERA,
00205 YEAR,
00206 MONTH,
00207 WEEK_OF_YEAR,
00208 WEEK_OF_MONTH,
00209 DATE,
00210 DAY_OF_YEAR,
00211 DAY_OF_WEEK,
00212 DAY_OF_WEEK_IN_MONTH,
00213 AM_PM,
00214 HOUR,
00215 HOUR_OF_DAY,
00216 MINUTE,
00217 SECOND,
00218 MILLISECOND,
00219 ZONE_OFFSET,
00220 DST_OFFSET,
00221 YEAR_WOY,
00222 DOW_LOCAL,
00223
00224 EXTENDED_YEAR,
00225 JULIAN_DAY,
00226 MILLISECONDS_IN_DAY,
00227 IS_LEAP_MONTH,
00228
00229 FIELD_COUNT = UCAL_FIELD_COUNT
00230 #endif
00231 };
00232 #endif // U_FORCE_HIDE_DEPRECATED_API
00233
00234 #ifndef U_HIDE_DEPRECATED_API
00235
00241 enum EDaysOfWeek {
00242 SUNDAY = 1,
00243 MONDAY,
00244 TUESDAY,
00245 WEDNESDAY,
00246 THURSDAY,
00247 FRIDAY,
00248 SATURDAY
00249 };
00250
00255 enum EMonths {
00256 JANUARY,
00257 FEBRUARY,
00258 MARCH,
00259 APRIL,
00260 MAY,
00261 JUNE,
00262 JULY,
00263 AUGUST,
00264 SEPTEMBER,
00265 OCTOBER,
00266 NOVEMBER,
00267 DECEMBER,
00268 UNDECIMBER
00269 };
00270
00275 enum EAmpm {
00276 AM,
00277 PM
00278 };
00279 #endif
00280
00285 virtual ~Calendar();
00286
00293 virtual Calendar* clone() const = 0;
00294
00306 static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00307
00320 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00321
00333 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00334
00345 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00346
00360 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00361
00374 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00375
00385 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00386
00387
00404 static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key,
00405 const Locale& locale, UBool commonlyUsed, UErrorCode& status);
00406
00414 static UDate U_EXPORT2 getNow(void);
00415
00429 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00430
00441 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00442
00454 virtual UBool operator==(const Calendar& that) const;
00455
00464 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00465
00476 virtual UBool isEquivalentTo(const Calendar& other) const;
00477
00492 UBool equals(const Calendar& when, UErrorCode& status) const;
00493
00507 UBool before(const Calendar& when, UErrorCode& status) const;
00508
00522 UBool after(const Calendar& when, UErrorCode& status) const;
00523
00524 #ifndef U_FORCE_HIDE_DEPRECATED_API
00525
00545 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00546 #endif // U_FORCE_HIDE_DEPRECATED_API
00547
00568 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00569
00570 #ifndef U_HIDE_DEPRECATED_API
00571
00603 inline void roll(EDateFields field, UBool up, UErrorCode& status);
00604 #endif
00605
00638 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00639
00640 #ifndef U_FORCE_HIDE_DEPRECATED_API
00641
00672 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00673 #endif // U_FORCE_HIDE_DEPRECATED_API
00674
00706 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00707
00708 #ifndef U_FORCE_HIDE_DEPRECATED_API
00709
00764 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00765 #endif // U_FORCE_HIDE_DEPRECATED_API
00766
00822 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00823
00832 void adoptTimeZone(TimeZone* value);
00833
00841 void setTimeZone(const TimeZone& zone);
00842
00851 const TimeZone& getTimeZone(void) const;
00852
00861 TimeZone* orphanTimeZone(void);
00862
00871 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00872
00885 void setLenient(UBool lenient);
00886
00893 UBool isLenient(void) const;
00894
00915 void setRepeatedWallTimeOption(UCalendarWallTimeOption option);
00916
00926 UCalendarWallTimeOption getRepeatedWallTimeOption(void) const;
00927
00949 void setSkippedWallTimeOption(UCalendarWallTimeOption option);
00950
00961 UCalendarWallTimeOption getSkippedWallTimeOption(void) const;
00962
00963 #ifndef U_HIDE_DEPRECATED_API
00964
00970 void setFirstDayOfWeek(EDaysOfWeek value);
00971 #endif
00972
00979 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00980
00981 #ifndef U_HIDE_DEPRECATED_API
00982
00988 EDaysOfWeek getFirstDayOfWeek(void) const;
00989 #endif
00990
00998 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00999
01009 void setMinimalDaysInFirstWeek(uint8_t value);
01010
01020 uint8_t getMinimalDaysInFirstWeek(void) const;
01021
01022 #ifndef U_FORCE_HIDE_DEPRECATED_API
01023
01031 virtual int32_t getMinimum(EDateFields field) const;
01032 #endif // U_FORCE_HIDE_DEPRECATED_API
01033
01042 virtual int32_t getMinimum(UCalendarDateFields field) const;
01043
01044 #ifndef U_FORCE_HIDE_DEPRECATED_API
01045
01053 virtual int32_t getMaximum(EDateFields field) const;
01054 #endif // U_FORCE_HIDE_DEPRECATED_API
01055
01064 virtual int32_t getMaximum(UCalendarDateFields field) const;
01065
01066 #ifndef U_FORCE_HIDE_DEPRECATED_API
01067
01075 virtual int32_t getGreatestMinimum(EDateFields field) const;
01076 #endif // U_FORCE_HIDE_DEPRECATED_API
01077
01086 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
01087
01088 #ifndef U_FORCE_HIDE_DEPRECATED_API
01089
01097 virtual int32_t getLeastMaximum(EDateFields field) const;
01098 #endif // U_FORCE_HIDE_DEPRECATED_API
01099
01108 virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
01109
01110 #ifndef U_HIDE_DEPRECATED_API
01111
01125 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
01126 #endif
01127
01142 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
01143
01144 #ifndef U_HIDE_DEPRECATED_API
01145
01161 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
01162 #endif
01163
01180 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
01181
01182 #ifndef U_HIDE_DEPRECATED_API
01183
01196 int32_t get(EDateFields field, UErrorCode& status) const;
01197 #endif
01198
01212 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01213
01214 #ifndef U_HIDE_DEPRECATED_API
01215
01223 UBool isSet(EDateFields field) const;
01224 #endif
01225
01234 UBool isSet(UCalendarDateFields field) const;
01235
01236 #ifndef U_HIDE_DEPRECATED_API
01237
01244 void set(EDateFields field, int32_t value);
01245 #endif
01246
01254 void set(UCalendarDateFields field, int32_t value);
01255
01266 void set(int32_t year, int32_t month, int32_t date);
01267
01280 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01281
01295 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01296
01303 void clear(void);
01304
01305 #ifndef U_HIDE_DEPRECATED_API
01306
01314 void clear(EDateFields field);
01315 #endif
01316
01325 void clear(UCalendarDateFields field);
01326
01342 virtual UClassID getDynamicClassID(void) const = 0;
01343
01376 virtual const char * getType() const = 0;
01377
01394 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01395
01410 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01411
01421 virtual UBool isWeekend(UDate date, UErrorCode &status) const;
01422
01430 virtual UBool isWeekend(void) const;
01431
01432 protected:
01433
01442 Calendar(UErrorCode& success);
01443
01450 Calendar(const Calendar& source);
01451
01458 Calendar& operator=(const Calendar& right);
01459
01470 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01471
01481 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01482
01491 virtual void computeTime(UErrorCode& status);
01492
01504 virtual void computeFields(UErrorCode& status);
01505
01515 double getTimeInMillis(UErrorCode& status) const;
01516
01525 void setTimeInMillis( double millis, UErrorCode& status );
01526
01536 void complete(UErrorCode& status);
01537
01538 #ifndef U_HIDE_DEPRECATED_API
01539
01547 inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01548 #endif
01549
01550 #ifndef U_HIDE_INTERNAL_API
01551
01561 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01562
01571 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01572 #endif
01573
01574 #ifndef U_HIDE_DEPRECATED_API
01575
01584 void internalSet(EDateFields field, int32_t value);
01585 #endif
01586
01596 inline void internalSet(UCalendarDateFields field, int32_t value);
01597
01604 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01605
01610 enum ELimitType {
01611 #ifndef U_HIDE_INTERNAL_API
01612 UCAL_LIMIT_MINIMUM = 0,
01613 UCAL_LIMIT_GREATEST_MINIMUM,
01614 UCAL_LIMIT_LEAST_MAXIMUM,
01615 UCAL_LIMIT_MAXIMUM,
01616 UCAL_LIMIT_COUNT
01617 #endif
01618 };
01619
01641 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01642
01650 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01651
01652
01666 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01667 UBool useMonth) const = 0;
01668
01676 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01677
01685 virtual int32_t handleGetYearLength(int32_t eyear) const;
01686
01687
01696 virtual int32_t handleGetExtendedYear() = 0;
01697
01706 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01707
01716 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01717
01724 virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01725
01726 #ifndef U_HIDE_INTERNAL_API
01727
01733 int32_t computeJulianDay();
01734
01742 double computeMillisInDay();
01743
01753 int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec);
01754
01755
01764 int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
01765
01771 enum {
01773 kResolveSTOP = -1,
01775 kResolveRemap = 32
01776 };
01777
01783 static const UFieldResolutionTable kDatePrecedence[];
01784
01790 static const UFieldResolutionTable kYearPrecedence[];
01791
01797 static const UFieldResolutionTable kDOWPrecedence[];
01798
01826 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable);
01827 #endif
01828
01829
01833 virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01834
01835 #ifndef U_HIDE_INTERNAL_API
01836
01841 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01842 #endif
01843
01844
01845 private:
01854 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01855
01856
01857 protected:
01862 UBool fIsTimeSet;
01863
01874 UBool fAreFieldsSet;
01875
01881 UBool fAreAllFieldsSet;
01882
01890 UBool fAreFieldsVirtuallySet;
01891
01898 UDate internalGetTime(void) const { return fTime; }
01899
01907 void internalSetTime(UDate time) { fTime = time; }
01908
01913 int32_t fFields[UCAL_FIELD_COUNT];
01914
01915 #ifndef U_FORCE_HIDE_DEPRECATED_API
01916
01920 UBool fIsSet[UCAL_FIELD_COUNT];
01921 #endif // U_FORCE_HIDE_DEPRECATED_API
01922
01926 enum {
01927 kUnset = 0,
01928 kInternallySet,
01929 kMinimumUserStamp
01930 };
01931
01938 int32_t fStamp[UCAL_FIELD_COUNT];
01939
01964 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01965
01966 #ifndef U_HIDE_INTERNAL_API
01967
01972 int32_t getGregorianYear() const {
01973 return fGregorianYear;
01974 }
01975
01981 int32_t getGregorianMonth() const {
01982 return fGregorianMonth;
01983 }
01984
01990 int32_t getGregorianDayOfYear() const {
01991 return fGregorianDayOfYear;
01992 }
01993
01999 int32_t getGregorianDayOfMonth() const {
02000 return fGregorianDayOfMonth;
02001 }
02002 #endif
02003
02010 virtual int32_t getDefaultMonthInYear(int32_t eyear) ;
02011
02012
02020 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month);
02021
02022
02023
02024
02025
02026
02056 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
02057
02101 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
02102
02103
02104 #ifndef U_HIDE_INTERNAL_API
02105
02135 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
02136
02141 int32_t getLocalDOW();
02142 #endif
02143
02144 private:
02145
02149 int32_t fNextStamp;
02150
02155 void recalculateStamp();
02156
02160 UDate fTime;
02161
02165 UBool fLenient;
02166
02171 TimeZone* fZone;
02172
02177 UCalendarWallTimeOption fRepeatedWallTime;
02178
02183 UCalendarWallTimeOption fSkippedWallTime;
02184
02193 UCalendarDaysOfWeek fFirstDayOfWeek;
02194 uint8_t fMinimalDaysInFirstWeek;
02195 UCalendarDaysOfWeek fWeekendOnset;
02196 int32_t fWeekendOnsetMillis;
02197 UCalendarDaysOfWeek fWeekendCease;
02198 int32_t fWeekendCeaseMillis;
02199
02210 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success);
02211
02221 void updateTime(UErrorCode& status);
02222
02228 int32_t fGregorianYear;
02229
02235 int32_t fGregorianMonth;
02236
02242 int32_t fGregorianDayOfYear;
02243
02249 int32_t fGregorianDayOfMonth;
02250
02251
02252
02259 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
02260
02261 protected:
02262
02270 void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
02271
02272 private:
02273
02294 void computeWeekFields(UErrorCode &ec);
02295
02296
02304 void validateFields(UErrorCode &status);
02305
02313 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02314
02315 protected:
02316 #ifndef U_HIDE_INTERNAL_API
02317
02326 static uint8_t julianDayToDayOfWeek(double julian);
02327 #endif
02328
02329 private:
02330 char validLocale[ULOC_FULLNAME_CAPACITY];
02331 char actualLocale[ULOC_FULLNAME_CAPACITY];
02332
02333 public:
02334 #if !UCONFIG_NO_SERVICE
02335
02339 #ifndef U_HIDE_INTERNAL_API
02340
02346 static StringEnumeration* getAvailableLocales(void);
02347
02361 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02362
02378 static UBool unregister(URegistryKey key, UErrorCode& status);
02379 #endif
02380
02385 friend class CalendarFactory;
02386
02391 friend class CalendarService;
02392
02397 friend class DefaultCalendarFactory;
02398 #endif
02399
02404 virtual UBool haveDefaultCentury() const = 0;
02405
02410 virtual UDate defaultCenturyStart() const = 0;
02415 virtual int32_t defaultCenturyStartYear() const = 0;
02416
02423 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02424
02430 virtual int32_t getRelatedYear(UErrorCode &status) const;
02431
02437 virtual void setRelatedYear(int32_t year);
02438
02439 #ifndef U_HIDE_INTERNAL_API
02440
02446 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02447 #endif
02448
02449 private:
02454 BasicTimeZone* getBasicTimeZone() const;
02455
02463 UBool getImmediatePreviousZoneTransition(UDate base, UDate *transitionTime, UErrorCode& status) const;
02464
02465 public:
02466 #ifndef U_HIDE_INTERNAL_API
02467
02475 static Calendar * U_EXPORT2 makeInstance(
02476 const Locale &locale, UErrorCode &status);
02477
02488 static void U_EXPORT2 getCalendarTypeFromLocale(
02489 const Locale &locale,
02490 char *typeBuffer,
02491 int32_t typeBufferSize,
02492 UErrorCode &status);
02493 #endif
02494 };
02495
02496
02497
02498 inline Calendar*
02499 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02500 {
02501
02502 return createInstance(zone, Locale::getDefault(), errorCode);
02503 }
02504
02505
02506
02507 inline void
02508 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02509 {
02510 roll(field, (int32_t)(up ? +1 : -1), status);
02511 }
02512
02513 #ifndef U_HIDE_DEPRECATED_API
02514 inline void
02515 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02516 {
02517 roll((UCalendarDateFields) field, up, status);
02518 }
02519 #endif
02520
02521
02522
02523
02529 inline void
02530 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02531 {
02532 fFields[field] = value;
02533 fStamp[field] = kInternallySet;
02534 fIsSet[field] = TRUE;
02535 }
02536
02537
02538 #ifndef U_HIDE_INTERNAL_API
02539 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02540 {
02541 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02542 }
02543 #endif
02544
02545 U_NAMESPACE_END
02546
02547 #endif
02548
02549 #endif
02550
02551 #endif // _CALENDAR