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;
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
00971 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00972
00973 #ifndef U_HIDE_DEPRECATED_API
00974
00980 EDaysOfWeek getFirstDayOfWeek(void) const;
00981 #endif
00982
00990 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00991
01001 void setMinimalDaysInFirstWeek(uint8_t value);
01002
01012 uint8_t getMinimalDaysInFirstWeek(void) const;
01013
01014 #ifndef U_FORCE_HIDE_DEPRECATED_API
01015
01023 virtual int32_t getMinimum(EDateFields field) const;
01024 #endif // U_FORCE_HIDE_DEPRECATED_API
01025
01034 virtual int32_t getMinimum(UCalendarDateFields field) const;
01035
01036 #ifndef U_FORCE_HIDE_DEPRECATED_API
01037
01045 virtual int32_t getMaximum(EDateFields field) const;
01046 #endif // U_FORCE_HIDE_DEPRECATED_API
01047
01056 virtual int32_t getMaximum(UCalendarDateFields field) const;
01057
01058 #ifndef U_FORCE_HIDE_DEPRECATED_API
01059
01067 virtual int32_t getGreatestMinimum(EDateFields field) const;
01068 #endif // U_FORCE_HIDE_DEPRECATED_API
01069
01078 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
01079
01080 #ifndef U_FORCE_HIDE_DEPRECATED_API
01081
01089 virtual int32_t getLeastMaximum(EDateFields field) const;
01090 #endif // U_FORCE_HIDE_DEPRECATED_API
01091
01100 virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
01101
01102 #ifndef U_HIDE_DEPRECATED_API
01103
01117 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
01118 #endif
01119
01134 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
01135
01152 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
01153
01167 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01168
01177 UBool isSet(UCalendarDateFields field) const;
01178
01186 void set(UCalendarDateFields field, int32_t value);
01187
01198 void set(int32_t year, int32_t month, int32_t date);
01199
01212 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01213
01227 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01228
01235 void clear(void);
01236
01245 void clear(UCalendarDateFields field);
01246
01262 virtual UClassID getDynamicClassID(void) const override = 0;
01263
01296 virtual const char * getType() const = 0;
01297
01314 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01315
01330 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01331
01341 virtual UBool isWeekend(UDate date, UErrorCode &status) const;
01342
01350 virtual UBool isWeekend(void) const;
01351
01352 #ifndef U_FORCE_HIDE_DRAFT_API
01353
01367 virtual bool inTemporalLeapYear(UErrorCode& status) const;
01368
01387 virtual const char* getTemporalMonthCode(UErrorCode& status) const;
01388
01408 virtual void setTemporalMonthCode(const char* temporalMonth, UErrorCode& status);
01409
01410 #endif // U_FORCE_HIDE_DRAFT_API
01411
01412 protected:
01413
01422 Calendar(UErrorCode& success);
01423
01430 Calendar(const Calendar& source);
01431
01438 Calendar& operator=(const Calendar& right);
01439
01450 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01451
01461 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01462
01471 virtual void computeTime(UErrorCode& status);
01472
01484 virtual void computeFields(UErrorCode& status);
01485
01495 double getTimeInMillis(UErrorCode& status) const;
01496
01505 void setTimeInMillis( double millis, UErrorCode& status );
01506
01516 void complete(UErrorCode& status);
01517
01518 #ifndef U_HIDE_DEPRECATED_API
01519
01527 inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01528 #endif
01529
01530 #ifndef U_HIDE_INTERNAL_API
01531
01541 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01542
01551 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01552 #endif
01553
01563 virtual int32_t internalGetMonth() const;
01564
01576 virtual int32_t internalGetMonth(int32_t defaultValue) const;
01577
01578 #ifndef U_HIDE_DEPRECATED_API
01579
01588 void internalSet(EDateFields field, int32_t value);
01589 #endif
01590
01600 inline void internalSet(UCalendarDateFields field, int32_t value);
01601
01608 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01609
01614 enum ELimitType {
01615 #ifndef U_HIDE_INTERNAL_API
01616 UCAL_LIMIT_MINIMUM = 0,
01617 UCAL_LIMIT_GREATEST_MINIMUM,
01618 UCAL_LIMIT_LEAST_MAXIMUM,
01619 UCAL_LIMIT_MAXIMUM,
01620 UCAL_LIMIT_COUNT
01621 #endif
01622 };
01623
01645 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01646
01654 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01655
01669 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01670 UBool useMonth) const = 0;
01671
01679 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01680
01688 virtual int32_t handleGetYearLength(int32_t eyear) const;
01689
01690
01699 virtual int32_t handleGetExtendedYear() = 0;
01700
01709 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01710
01719 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01720
01727 virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01728
01729 #ifndef U_HIDE_INTERNAL_API
01730
01736 int32_t computeJulianDay();
01737
01745 double computeMillisInDay();
01746
01756 int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec);
01757
01758
01767 int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
01768
01775 static constexpr int32_t kResolveSTOP = -1;
01785 static constexpr int32_t kResolveRemap = 32;
01786
01792 static const UFieldResolutionTable kDatePrecedence[];
01793
01799 static const UFieldResolutionTable kYearPrecedence[];
01800
01806 static const UFieldResolutionTable kDOWPrecedence[];
01807
01813 static const UFieldResolutionTable kMonthPrecedence[];
01814
01842 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable) const;
01843 #endif
01844
01845
01849 virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01850
01851 #ifndef U_HIDE_INTERNAL_API
01852
01857 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01858 #endif
01859
01860
01861 private:
01870 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01871
01872
01873 protected:
01878 UBool fIsTimeSet;
01879
01890 UBool fAreFieldsSet;
01891
01897 UBool fAreAllFieldsSet;
01898
01906 UBool fAreFieldsVirtuallySet;
01907
01914 UDate internalGetTime(void) const { return fTime; }
01915
01923 void internalSetTime(UDate time) { fTime = time; }
01924
01929 int32_t fFields[UCAL_FIELD_COUNT];
01930
01931 #ifndef U_FORCE_HIDE_DEPRECATED_API
01932
01936 UBool fIsSet[UCAL_FIELD_COUNT];
01937 #endif // U_FORCE_HIDE_DEPRECATED_API
01938
01942 enum {
01943 kUnset = 0,
01944 kInternallySet,
01945 kMinimumUserStamp
01946 };
01947
01954 int32_t fStamp[UCAL_FIELD_COUNT];
01955
01980 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01981
01982 #ifndef U_HIDE_INTERNAL_API
01983
01988 int32_t getGregorianYear() const {
01989 return fGregorianYear;
01990 }
01991
01997 int32_t getGregorianMonth() const {
01998 return fGregorianMonth;
01999 }
02000
02006 int32_t getGregorianDayOfYear() const {
02007 return fGregorianDayOfYear;
02008 }
02009
02015 int32_t getGregorianDayOfMonth() const {
02016 return fGregorianDayOfMonth;
02017 }
02018 #endif
02019
02026 virtual int32_t getDefaultMonthInYear(int32_t eyear) ;
02027
02028
02036 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month);
02037
02038
02039
02040
02041
02042
02072 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
02073
02117 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
02118
02119
02120 #ifndef U_HIDE_INTERNAL_API
02121
02151 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
02152
02157 int32_t getLocalDOW();
02158 #endif
02159
02160 private:
02161
02165 int32_t fNextStamp;
02166
02171 void recalculateStamp();
02172
02176 UDate fTime;
02177
02181 UBool fLenient;
02182
02187 TimeZone* fZone;
02188
02193 UCalendarWallTimeOption fRepeatedWallTime;
02194
02199 UCalendarWallTimeOption fSkippedWallTime;
02200
02209 UCalendarDaysOfWeek fFirstDayOfWeek;
02210 uint8_t fMinimalDaysInFirstWeek;
02211 UCalendarDaysOfWeek fWeekendOnset;
02212 int32_t fWeekendOnsetMillis;
02213 UCalendarDaysOfWeek fWeekendCease;
02214 int32_t fWeekendCeaseMillis;
02215
02226 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success);
02227
02237 void updateTime(UErrorCode& status);
02238
02244 int32_t fGregorianYear;
02245
02251 int32_t fGregorianMonth;
02252
02258 int32_t fGregorianDayOfYear;
02259
02265 int32_t fGregorianDayOfMonth;
02266
02267
02268
02275 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
02276
02277 protected:
02278
02286 void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
02287
02288 private:
02289
02310 void computeWeekFields(UErrorCode &ec);
02311
02312
02320 void validateFields(UErrorCode &status);
02321
02329 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02330
02331 protected:
02332 #ifndef U_HIDE_INTERNAL_API
02333
02342 static uint8_t julianDayToDayOfWeek(double julian);
02343 #endif
02344
02345 private:
02346 char validLocale[ULOC_FULLNAME_CAPACITY];
02347 char actualLocale[ULOC_FULLNAME_CAPACITY];
02348
02349 public:
02350 #if !UCONFIG_NO_SERVICE
02351
02355 #ifndef U_HIDE_INTERNAL_API
02356
02362 static StringEnumeration* getAvailableLocales(void);
02363
02377 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02378
02394 static UBool unregister(URegistryKey key, UErrorCode& status);
02395 #endif
02396
02401 friend class CalendarFactory;
02402
02407 friend class CalendarService;
02408
02413 friend class DefaultCalendarFactory;
02414 #endif
02415
02420 virtual UBool haveDefaultCentury() const = 0;
02421
02426 virtual UDate defaultCenturyStart() const = 0;
02431 virtual int32_t defaultCenturyStartYear() const = 0;
02432
02439 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02440
02446 virtual int32_t getRelatedYear(UErrorCode &status) const;
02447
02453 virtual void setRelatedYear(int32_t year);
02454
02455 #ifndef U_HIDE_INTERNAL_API
02456
02462 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02463 #endif
02464
02465 private:
02470 BasicTimeZone* getBasicTimeZone() const;
02471
02479 UBool getImmediatePreviousZoneTransition(UDate base, UDate *transitionTime, UErrorCode& status) const;
02480
02481 public:
02482 #ifndef U_HIDE_INTERNAL_API
02483
02491 static Calendar * U_EXPORT2 makeInstance(
02492 const Locale &locale, UErrorCode &status);
02493
02504 static void U_EXPORT2 getCalendarTypeFromLocale(
02505 const Locale &locale,
02506 char *typeBuffer,
02507 int32_t typeBufferSize,
02508 UErrorCode &status);
02509 #endif
02510 };
02511
02512
02513
02514 inline Calendar*
02515 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02516 {
02517
02518 return createInstance(zone, Locale::getDefault(), errorCode);
02519 }
02520
02521
02522
02523 inline void
02524 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02525 {
02526 roll(field, (int32_t)(up ? +1 : -1), status);
02527 }
02528
02529 #ifndef U_HIDE_DEPRECATED_API
02530 inline void
02531 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02532 {
02533 roll((UCalendarDateFields) field, up, status);
02534 }
02535 #endif
02536
02537
02538
02539
02545 inline void
02546 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02547 {
02548 fFields[field] = value;
02549 fStamp[field] = kInternallySet;
02550 fIsSet[field] = true;
02551 }
02552
02553
02554 #ifndef U_HIDE_INTERNAL_API
02555 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02556 {
02557 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02558 }
02559 #endif
02560
02561 U_NAMESPACE_END
02562
02563 #endif
02564
02565 #endif
02566
02567 #endif // _CALENDAR