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
00036 #if !UCONFIG_NO_FORMATTING
00037
00038 #include "unicode/uobject.h"
00039 #include "unicode/locid.h"
00040 #include "unicode/timezone.h"
00041 #include "unicode/ucal.h"
00042 #include "unicode/umisc.h"
00043
00044 U_NAMESPACE_BEGIN
00045
00046 class ICUServiceFactory;
00047
00051 typedef int32_t UFieldResolutionTable[12][8];
00052
00053 class BasicTimeZone;
00202 class U_I18N_API Calendar : public UObject {
00203 public:
00204
00211 enum EDateFields {
00212 #ifndef U_HIDE_DEPRECATED_API
00213
00214
00215
00216 #ifdef ERA
00217 #undef ERA
00218 #endif
00219 ERA,
00220 YEAR,
00221 MONTH,
00222 WEEK_OF_YEAR,
00223 WEEK_OF_MONTH,
00224 DATE,
00225 DAY_OF_YEAR,
00226 DAY_OF_WEEK,
00227 DAY_OF_WEEK_IN_MONTH,
00228 AM_PM,
00229 HOUR,
00230 HOUR_OF_DAY,
00231 MINUTE,
00232 SECOND,
00233 MILLISECOND,
00234 ZONE_OFFSET,
00235 DST_OFFSET,
00236 YEAR_WOY,
00237 DOW_LOCAL,
00238
00239 EXTENDED_YEAR,
00240 JULIAN_DAY,
00241 MILLISECONDS_IN_DAY,
00242 IS_LEAP_MONTH,
00243
00244 FIELD_COUNT = UCAL_FIELD_COUNT
00245 #endif
00246 };
00247
00248 #ifndef U_HIDE_DEPRECATED_API
00249
00255 enum EDaysOfWeek {
00256 SUNDAY = 1,
00257 MONDAY,
00258 TUESDAY,
00259 WEDNESDAY,
00260 THURSDAY,
00261 FRIDAY,
00262 SATURDAY
00263 };
00264
00269 enum EMonths {
00270 JANUARY,
00271 FEBRUARY,
00272 MARCH,
00273 APRIL,
00274 MAY,
00275 JUNE,
00276 JULY,
00277 AUGUST,
00278 SEPTEMBER,
00279 OCTOBER,
00280 NOVEMBER,
00281 DECEMBER,
00282 UNDECIMBER
00283 };
00284
00289 enum EAmpm {
00290 AM,
00291 PM
00292 };
00293 #endif
00294
00299 virtual ~Calendar();
00300
00307 virtual Calendar* clone(void) const = 0;
00308
00320 static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00321
00334 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00335
00347 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00348
00359 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00360
00374 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00375
00388 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00389
00399 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00400
00401
00418 static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key,
00419 const Locale& locale, UBool commonlyUsed, UErrorCode& status);
00420
00428 static UDate U_EXPORT2 getNow(void);
00429
00443 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00444
00455 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00456
00468 virtual UBool operator==(const Calendar& that) const;
00469
00478 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00479
00490 virtual UBool isEquivalentTo(const Calendar& other) const;
00491
00506 UBool equals(const Calendar& when, UErrorCode& status) const;
00507
00521 UBool before(const Calendar& when, UErrorCode& status) const;
00522
00536 UBool after(const Calendar& when, UErrorCode& status) const;
00537
00558 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00559
00580 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00581
00582 #ifndef U_HIDE_DEPRECATED_API
00583
00615 inline void roll(EDateFields field, UBool up, UErrorCode& status);
00616 #endif
00617
00650 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00651
00683 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00684
00716 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00717
00773 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00774
00830 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00831
00840 void adoptTimeZone(TimeZone* value);
00841
00849 void setTimeZone(const TimeZone& zone);
00850
00859 const TimeZone& getTimeZone(void) const;
00860
00869 TimeZone* orphanTimeZone(void);
00870
00879 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00880
00893 void setLenient(UBool lenient);
00894
00901 UBool isLenient(void) const;
00902
00923 void setRepeatedWallTimeOption(UCalendarWallTimeOption option);
00924
00934 UCalendarWallTimeOption getRepeatedWallTimeOption(void) const;
00935
00957 void setSkippedWallTimeOption(UCalendarWallTimeOption option);
00958
00969 UCalendarWallTimeOption getSkippedWallTimeOption(void) const;
00970
00971 #ifndef U_HIDE_DEPRECATED_API
00972
00978 void setFirstDayOfWeek(EDaysOfWeek value);
00979 #endif
00980
00987 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00988
00989 #ifndef U_HIDE_DEPRECATED_API
00990
00996 EDaysOfWeek getFirstDayOfWeek(void) const;
00997 #endif
00998
01006 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
01007
01017 void setMinimalDaysInFirstWeek(uint8_t value);
01018
01028 uint8_t getMinimalDaysInFirstWeek(void) const;
01029
01038 virtual int32_t getMinimum(EDateFields field) const;
01039
01048 virtual int32_t getMinimum(UCalendarDateFields field) const;
01049
01058 virtual int32_t getMaximum(EDateFields field) const;
01059
01068 virtual int32_t getMaximum(UCalendarDateFields field) const;
01069
01078 virtual int32_t getGreatestMinimum(EDateFields field) const;
01079
01088 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
01089
01098 virtual int32_t getLeastMaximum(EDateFields field) const;
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
01726 virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01727
01728 #ifndef U_HIDE_INTERNAL_API
01729
01735 int32_t computeJulianDay();
01736
01744 double computeMillisInDay();
01745
01755 int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec);
01756
01757
01766 int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
01767
01773 enum {
01775 kResolveSTOP = -1,
01777 kResolveRemap = 32
01778 };
01779
01785 static const UFieldResolutionTable kDatePrecedence[];
01786
01792 static const UFieldResolutionTable kYearPrecedence[];
01793
01799 static const UFieldResolutionTable kDOWPrecedence[];
01800
01828 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable);
01829 #endif
01830
01831
01835 virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01836
01837 #ifndef U_HIDE_INTERNAL_API
01838
01843 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01844 #endif
01845
01846
01847 private:
01856 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01857
01858
01859 protected:
01864 UBool fIsTimeSet;
01865
01876 UBool fAreFieldsSet;
01877
01883 UBool fAreAllFieldsSet;
01884
01892 UBool fAreFieldsVirtuallySet;
01893
01900 UDate internalGetTime(void) const { return fTime; }
01901
01909 void internalSetTime(UDate time) { fTime = time; }
01910
01915 int32_t fFields[UCAL_FIELD_COUNT];
01916
01921 UBool fIsSet[UCAL_FIELD_COUNT];
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
02305 void validateFields(UErrorCode &status);
02306
02315 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02316
02317 protected:
02318 #ifndef U_HIDE_INTERNAL_API
02319
02328 static uint8_t julianDayToDayOfWeek(double julian);
02329 #endif
02330
02331 private:
02332 char validLocale[ULOC_FULLNAME_CAPACITY];
02333 char actualLocale[ULOC_FULLNAME_CAPACITY];
02334
02335 public:
02336 #if !UCONFIG_NO_SERVICE
02337
02341 #ifndef U_HIDE_INTERNAL_API
02342
02348 static StringEnumeration* getAvailableLocales(void);
02349
02363 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02364
02380 static UBool unregister(URegistryKey key, UErrorCode& status);
02381 #endif
02382
02387 friend class CalendarFactory;
02388
02393 friend class CalendarService;
02394
02399 friend class DefaultCalendarFactory;
02400 #endif
02401
02406 virtual UBool haveDefaultCentury() const = 0;
02407
02412 virtual UDate defaultCenturyStart() const = 0;
02417 virtual int32_t defaultCenturyStartYear() const = 0;
02418
02425 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02426
02432 virtual int32_t getRelatedYear(UErrorCode &status) const;
02433
02439 virtual void setRelatedYear(int32_t year);
02440
02441 #ifndef U_HIDE_INTERNAL_API
02442
02448 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02449 #endif
02450
02451 private:
02456 BasicTimeZone* getBasicTimeZone() const;
02457
02465 UBool getImmediatePreviousZoneTransition(UDate base, UDate *transitionTime, UErrorCode& status) const;
02466
02467 public:
02468 #ifndef U_HIDE_INTERNAL_API
02469
02477 static Calendar * U_EXPORT2 makeInstance(
02478 const Locale &locale, UErrorCode &status);
02479
02490 static void U_EXPORT2 getCalendarTypeFromLocale(
02491 const Locale &locale,
02492 char *typeBuffer,
02493 int32_t typeBufferSize,
02494 UErrorCode &status);
02495 #endif
02496 };
02497
02498
02499
02500 inline Calendar*
02501 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02502 {
02503
02504 return createInstance(zone, Locale::getDefault(), errorCode);
02505 }
02506
02507
02508
02509 inline void
02510 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02511 {
02512 roll(field, (int32_t)(up ? +1 : -1), status);
02513 }
02514
02515 #ifndef U_HIDE_DEPRECATED_API
02516 inline void
02517 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02518 {
02519 roll((UCalendarDateFields) field, up, status);
02520 }
02521 #endif
02522
02523
02524
02525
02531 inline void
02532 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02533 {
02534 fFields[field] = value;
02535 fStamp[field] = kInternallySet;
02536 fIsSet[field] = TRUE;
02537 }
02538
02539
02540 #ifndef U_HIDE_INTERNAL_API
02541 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02542 {
02543 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02544 }
02545 #endif
02546
02547 U_NAMESPACE_END
02548
02549 #endif
02550
02551 #endif // _CALENDAR