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
00050
00051
00055 typedef int32_t UFieldResolutionTable[12][8];
00056
00057 class BasicTimeZone;
00189 class U_I18N_API Calendar : public UObject {
00190 public:
00191 #ifndef U_FORCE_HIDE_DEPRECATED_API
00192
00198 enum EDateFields {
00199 #ifndef U_HIDE_DEPRECATED_API
00200
00201
00202
00203 #ifdef ERA
00204 #undef ERA
00205 #endif
00206 ERA,
00207 YEAR,
00208 MONTH,
00209 WEEK_OF_YEAR,
00210 WEEK_OF_MONTH,
00211 DATE,
00212 DAY_OF_YEAR,
00213 DAY_OF_WEEK,
00214 DAY_OF_WEEK_IN_MONTH,
00215 AM_PM,
00216 HOUR,
00217 HOUR_OF_DAY,
00218 MINUTE,
00219 SECOND,
00220 MILLISECOND,
00221 ZONE_OFFSET,
00222 DST_OFFSET,
00223 YEAR_WOY,
00224 DOW_LOCAL,
00225
00226 EXTENDED_YEAR,
00227 JULIAN_DAY,
00228 MILLISECONDS_IN_DAY,
00229 IS_LEAP_MONTH,
00230
00231 FIELD_COUNT = UCAL_FIELD_COUNT
00232 #endif
00233 };
00234 #endif // U_FORCE_HIDE_DEPRECATED_API
00235
00236 #ifndef U_HIDE_DEPRECATED_API
00237
00243 enum EDaysOfWeek {
00244 SUNDAY = 1,
00245 MONDAY,
00246 TUESDAY,
00247 WEDNESDAY,
00248 THURSDAY,
00249 FRIDAY,
00250 SATURDAY
00251 };
00252
00257 enum EMonths {
00258 JANUARY,
00259 FEBRUARY,
00260 MARCH,
00261 APRIL,
00262 MAY,
00263 JUNE,
00264 JULY,
00265 AUGUST,
00266 SEPTEMBER,
00267 OCTOBER,
00268 NOVEMBER,
00269 DECEMBER,
00270 UNDECIMBER
00271 };
00272
00277 enum EAmpm {
00278 AM,
00279 PM
00280 };
00281 #endif
00282
00287 virtual ~Calendar();
00288
00295 virtual Calendar* clone() const = 0;
00296
00308 static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00309
00322 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00323
00335 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00336
00347 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00348
00362 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00363
00376 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00377
00387 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00388
00389
00406 static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key,
00407 const Locale& locale, UBool commonlyUsed, UErrorCode& status);
00408
00416 static UDate U_EXPORT2 getNow(void);
00417
00431 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00432
00443 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00444
00456 virtual bool operator==(const Calendar& that) const;
00457
00466 bool operator!=(const Calendar& that) const {return !operator==(that);}
00467
00478 virtual UBool isEquivalentTo(const Calendar& other) const;
00479
00494 UBool equals(const Calendar& when, UErrorCode& status) const;
00495
00509 UBool before(const Calendar& when, UErrorCode& status) const;
00510
00524 UBool after(const Calendar& when, UErrorCode& status) const;
00525
00526 #ifndef U_FORCE_HIDE_DEPRECATED_API
00527
00547 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00548 #endif // U_FORCE_HIDE_DEPRECATED_API
00549
00570 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00571
00572 #ifndef U_HIDE_DEPRECATED_API
00573
00605 inline void roll(EDateFields field, UBool up, UErrorCode& status);
00606 #endif
00607
00640 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00641
00642 #ifndef U_FORCE_HIDE_DEPRECATED_API
00643
00674 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00675 #endif // U_FORCE_HIDE_DEPRECATED_API
00676
00708 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00709
00710 #ifndef U_FORCE_HIDE_DEPRECATED_API
00711
00766 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00767 #endif // U_FORCE_HIDE_DEPRECATED_API
00768
00824 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00825
00834 void adoptTimeZone(TimeZone* value);
00835
00843 void setTimeZone(const TimeZone& zone);
00844
00853 const TimeZone& getTimeZone(void) const;
00854
00863 TimeZone* orphanTimeZone(void);
00864
00873 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00874
00887 void setLenient(UBool lenient);
00888
00895 UBool isLenient(void) const;
00896
00917 void setRepeatedWallTimeOption(UCalendarWallTimeOption option);
00918
00928 UCalendarWallTimeOption getRepeatedWallTimeOption(void) const;
00929
00951 void setSkippedWallTimeOption(UCalendarWallTimeOption option);
00952
00963 UCalendarWallTimeOption getSkippedWallTimeOption(void) const;
00964
00965 #ifndef U_HIDE_DEPRECATED_API
00966
00972 void setFirstDayOfWeek(EDaysOfWeek value);
00973 #endif
00974
00981 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00982
00983 #ifndef U_HIDE_DEPRECATED_API
00984
00990 EDaysOfWeek getFirstDayOfWeek(void) const;
00991 #endif
00992
01000 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
01001
01011 void setMinimalDaysInFirstWeek(uint8_t value);
01012
01022 uint8_t getMinimalDaysInFirstWeek(void) const;
01023
01024 #ifndef U_FORCE_HIDE_DEPRECATED_API
01025
01033 virtual int32_t getMinimum(EDateFields field) const;
01034 #endif // U_FORCE_HIDE_DEPRECATED_API
01035
01044 virtual int32_t getMinimum(UCalendarDateFields field) const;
01045
01046 #ifndef U_FORCE_HIDE_DEPRECATED_API
01047
01055 virtual int32_t getMaximum(EDateFields field) const;
01056 #endif // U_FORCE_HIDE_DEPRECATED_API
01057
01066 virtual int32_t getMaximum(UCalendarDateFields field) const;
01067
01068 #ifndef U_FORCE_HIDE_DEPRECATED_API
01069
01077 virtual int32_t getGreatestMinimum(EDateFields field) const;
01078 #endif // U_FORCE_HIDE_DEPRECATED_API
01079
01088 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
01089
01090 #ifndef U_FORCE_HIDE_DEPRECATED_API
01091
01099 virtual int32_t getLeastMaximum(EDateFields field) const;
01100 #endif // U_FORCE_HIDE_DEPRECATED_API
01101
01110 virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
01111
01112 #ifndef U_HIDE_DEPRECATED_API
01113
01127 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
01128 #endif
01129
01144 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
01145
01146 #ifndef U_HIDE_DEPRECATED_API
01147
01163 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
01164 #endif
01165
01182 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
01183
01184 #ifndef U_HIDE_DEPRECATED_API
01185
01198 int32_t get(EDateFields field, UErrorCode& status) const;
01199 #endif
01200
01214 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01215
01216 #ifndef U_HIDE_DEPRECATED_API
01217
01225 UBool isSet(EDateFields field) const;
01226 #endif
01227
01236 UBool isSet(UCalendarDateFields field) const;
01237
01238 #ifndef U_HIDE_DEPRECATED_API
01239
01246 void set(EDateFields field, int32_t value);
01247 #endif
01248
01256 void set(UCalendarDateFields field, int32_t value);
01257
01268 void set(int32_t year, int32_t month, int32_t date);
01269
01282 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01283
01297 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01298
01305 void clear(void);
01306
01307 #ifndef U_HIDE_DEPRECATED_API
01308
01316 void clear(EDateFields field);
01317 #endif
01318
01327 void clear(UCalendarDateFields field);
01328
01344 virtual UClassID getDynamicClassID(void) const override = 0;
01345
01378 virtual const char * getType() const = 0;
01379
01396 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01397
01412 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01413
01423 virtual UBool isWeekend(UDate date, UErrorCode &status) const;
01424
01432 virtual UBool isWeekend(void) const;
01433
01434 protected:
01435
01444 Calendar(UErrorCode& success);
01445
01452 Calendar(const Calendar& source);
01453
01460 Calendar& operator=(const Calendar& right);
01461
01472 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01473
01483 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01484
01493 virtual void computeTime(UErrorCode& status);
01494
01506 virtual void computeFields(UErrorCode& status);
01507
01517 double getTimeInMillis(UErrorCode& status) const;
01518
01527 void setTimeInMillis( double millis, UErrorCode& status );
01528
01538 void complete(UErrorCode& status);
01539
01540 #ifndef U_HIDE_DEPRECATED_API
01541
01549 inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01550 #endif
01551
01552 #ifndef U_HIDE_INTERNAL_API
01553
01563 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01564
01573 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01574 #endif
01575
01576 #ifndef U_HIDE_DEPRECATED_API
01577
01586 void internalSet(EDateFields field, int32_t value);
01587 #endif
01588
01598 inline void internalSet(UCalendarDateFields field, int32_t value);
01599
01606 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01607
01612 enum ELimitType {
01613 #ifndef U_HIDE_INTERNAL_API
01614 UCAL_LIMIT_MINIMUM = 0,
01615 UCAL_LIMIT_GREATEST_MINIMUM,
01616 UCAL_LIMIT_LEAST_MAXIMUM,
01617 UCAL_LIMIT_MAXIMUM,
01618 UCAL_LIMIT_COUNT
01619 #endif
01620 };
01621
01643 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01644
01652 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01653
01654
01668 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01669 UBool useMonth) const = 0;
01670
01678 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01679
01687 virtual int32_t handleGetYearLength(int32_t eyear) const;
01688
01689
01698 virtual int32_t handleGetExtendedYear() = 0;
01699
01708 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01709
01718 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01719
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
01917 #ifndef U_FORCE_HIDE_DEPRECATED_API
01918
01922 UBool fIsSet[UCAL_FIELD_COUNT];
01923 #endif // U_FORCE_HIDE_DEPRECATED_API
01924
01928 enum {
01929 kUnset = 0,
01930 kInternallySet,
01931 kMinimumUserStamp
01932 };
01933
01940 int32_t fStamp[UCAL_FIELD_COUNT];
01941
01966 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01967
01968 #ifndef U_HIDE_INTERNAL_API
01969
01974 int32_t getGregorianYear() const {
01975 return fGregorianYear;
01976 }
01977
01983 int32_t getGregorianMonth() const {
01984 return fGregorianMonth;
01985 }
01986
01992 int32_t getGregorianDayOfYear() const {
01993 return fGregorianDayOfYear;
01994 }
01995
02001 int32_t getGregorianDayOfMonth() const {
02002 return fGregorianDayOfMonth;
02003 }
02004 #endif
02005
02012 virtual int32_t getDefaultMonthInYear(int32_t eyear) ;
02013
02014
02022 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month);
02023
02024
02025
02026
02027
02028
02058 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
02059
02103 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
02104
02105
02106 #ifndef U_HIDE_INTERNAL_API
02107
02137 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
02138
02143 int32_t getLocalDOW();
02144 #endif
02145
02146 private:
02147
02151 int32_t fNextStamp;
02152
02157 void recalculateStamp();
02158
02162 UDate fTime;
02163
02167 UBool fLenient;
02168
02173 TimeZone* fZone;
02174
02179 UCalendarWallTimeOption fRepeatedWallTime;
02180
02185 UCalendarWallTimeOption fSkippedWallTime;
02186
02195 UCalendarDaysOfWeek fFirstDayOfWeek;
02196 uint8_t fMinimalDaysInFirstWeek;
02197 UCalendarDaysOfWeek fWeekendOnset;
02198 int32_t fWeekendOnsetMillis;
02199 UCalendarDaysOfWeek fWeekendCease;
02200 int32_t fWeekendCeaseMillis;
02201
02212 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success);
02213
02223 void updateTime(UErrorCode& status);
02224
02230 int32_t fGregorianYear;
02231
02237 int32_t fGregorianMonth;
02238
02244 int32_t fGregorianDayOfYear;
02245
02251 int32_t fGregorianDayOfMonth;
02252
02253
02254
02261 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
02262
02263 protected:
02264
02272 void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
02273
02274 private:
02275
02296 void computeWeekFields(UErrorCode &ec);
02297
02298
02306 void validateFields(UErrorCode &status);
02307
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
02552
02553 #endif // _CALENDAR