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;
00185 class U_I18N_API Calendar : public UObject {
00186 public:
00187
00194 enum EDateFields {
00195 #ifndef U_HIDE_DEPRECATED_API
00196
00197
00198
00199 #ifdef ERA
00200 #undef ERA
00201 #endif
00202 ERA,
00203 YEAR,
00204 MONTH,
00205 WEEK_OF_YEAR,
00206 WEEK_OF_MONTH,
00207 DATE,
00208 DAY_OF_YEAR,
00209 DAY_OF_WEEK,
00210 DAY_OF_WEEK_IN_MONTH,
00211 AM_PM,
00212 HOUR,
00213 HOUR_OF_DAY,
00214 MINUTE,
00215 SECOND,
00216 MILLISECOND,
00217 ZONE_OFFSET,
00218 DST_OFFSET,
00219 YEAR_WOY,
00220 DOW_LOCAL,
00221
00222 EXTENDED_YEAR,
00223 JULIAN_DAY,
00224 MILLISECONDS_IN_DAY,
00225 IS_LEAP_MONTH,
00226
00227 FIELD_COUNT = UCAL_FIELD_COUNT
00228 #endif
00229 };
00230
00231 #ifndef U_HIDE_DEPRECATED_API
00232
00238 enum EDaysOfWeek {
00239 SUNDAY = 1,
00240 MONDAY,
00241 TUESDAY,
00242 WEDNESDAY,
00243 THURSDAY,
00244 FRIDAY,
00245 SATURDAY
00246 };
00247
00252 enum EMonths {
00253 JANUARY,
00254 FEBRUARY,
00255 MARCH,
00256 APRIL,
00257 MAY,
00258 JUNE,
00259 JULY,
00260 AUGUST,
00261 SEPTEMBER,
00262 OCTOBER,
00263 NOVEMBER,
00264 DECEMBER,
00265 UNDECIMBER
00266 };
00267
00272 enum EAmpm {
00273 AM,
00274 PM
00275 };
00276 #endif
00277
00282 virtual ~Calendar();
00283
00290 virtual Calendar* clone(void) const = 0;
00291
00303 static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00304
00317 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00318
00330 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00331
00342 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00343
00357 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00358
00371 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00372
00382 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00383
00384
00401 static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key,
00402 const Locale& locale, UBool commonlyUsed, UErrorCode& status);
00403
00411 static UDate U_EXPORT2 getNow(void);
00412
00426 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00427
00438 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00439
00451 virtual UBool operator==(const Calendar& that) const;
00452
00461 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00462
00473 virtual UBool isEquivalentTo(const Calendar& other) const;
00474
00489 UBool equals(const Calendar& when, UErrorCode& status) const;
00490
00504 UBool before(const Calendar& when, UErrorCode& status) const;
00505
00519 UBool after(const Calendar& when, UErrorCode& status) const;
00520
00541 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00542
00563 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00564
00565 #ifndef U_HIDE_DEPRECATED_API
00566
00598 inline void roll(EDateFields field, UBool up, UErrorCode& status);
00599 #endif
00600
00633 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00634
00666 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00667
00699 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00700
00756 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00757
00813 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00814
00823 void adoptTimeZone(TimeZone* value);
00824
00832 void setTimeZone(const TimeZone& zone);
00833
00842 const TimeZone& getTimeZone(void) const;
00843
00852 TimeZone* orphanTimeZone(void);
00853
00862 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00863
00876 void setLenient(UBool lenient);
00877
00884 UBool isLenient(void) const;
00885
00906 void setRepeatedWallTimeOption(UCalendarWallTimeOption option);
00907
00917 UCalendarWallTimeOption getRepeatedWallTimeOption(void) const;
00918
00940 void setSkippedWallTimeOption(UCalendarWallTimeOption option);
00941
00952 UCalendarWallTimeOption getSkippedWallTimeOption(void) const;
00953
00954 #ifndef U_HIDE_DEPRECATED_API
00955
00961 void setFirstDayOfWeek(EDaysOfWeek value);
00962 #endif
00963
00970 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00971
00972 #ifndef U_HIDE_DEPRECATED_API
00973
00979 EDaysOfWeek getFirstDayOfWeek(void) const;
00980 #endif
00981
00989 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00990
01000 void setMinimalDaysInFirstWeek(uint8_t value);
01001
01011 uint8_t getMinimalDaysInFirstWeek(void) const;
01012
01021 virtual int32_t getMinimum(EDateFields field) const;
01022
01031 virtual int32_t getMinimum(UCalendarDateFields field) const;
01032
01041 virtual int32_t getMaximum(EDateFields field) const;
01042
01051 virtual int32_t getMaximum(UCalendarDateFields field) const;
01052
01061 virtual int32_t getGreatestMinimum(EDateFields field) const;
01062
01071 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
01072
01081 virtual int32_t getLeastMaximum(EDateFields field) const;
01082
01091 virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
01092
01093 #ifndef U_HIDE_DEPRECATED_API
01094
01108 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
01109 #endif
01110
01125 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
01126
01127 #ifndef U_HIDE_DEPRECATED_API
01128
01144 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
01145 #endif
01146
01163 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
01164
01165 #ifndef U_HIDE_DEPRECATED_API
01166
01179 int32_t get(EDateFields field, UErrorCode& status) const;
01180 #endif
01181
01195 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01196
01197 #ifndef U_HIDE_DEPRECATED_API
01198
01206 UBool isSet(EDateFields field) const;
01207 #endif
01208
01217 UBool isSet(UCalendarDateFields field) const;
01218
01219 #ifndef U_HIDE_DEPRECATED_API
01220
01227 void set(EDateFields field, int32_t value);
01228 #endif
01229
01237 void set(UCalendarDateFields field, int32_t value);
01238
01249 void set(int32_t year, int32_t month, int32_t date);
01250
01263 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01264
01278 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01279
01286 void clear(void);
01287
01288 #ifndef U_HIDE_DEPRECATED_API
01289
01297 void clear(EDateFields field);
01298 #endif
01299
01308 void clear(UCalendarDateFields field);
01309
01325 virtual UClassID getDynamicClassID(void) const = 0;
01326
01359 virtual const char * getType() const = 0;
01360
01377 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01378
01393 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01394
01404 virtual UBool isWeekend(UDate date, UErrorCode &status) const;
01405
01413 virtual UBool isWeekend(void) const;
01414
01415 protected:
01416
01425 Calendar(UErrorCode& success);
01426
01433 Calendar(const Calendar& source);
01434
01441 Calendar& operator=(const Calendar& right);
01442
01453 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01454
01464 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01465
01474 virtual void computeTime(UErrorCode& status);
01475
01487 virtual void computeFields(UErrorCode& status);
01488
01498 double getTimeInMillis(UErrorCode& status) const;
01499
01508 void setTimeInMillis( double millis, UErrorCode& status );
01509
01519 void complete(UErrorCode& status);
01520
01521 #ifndef U_HIDE_DEPRECATED_API
01522
01530 inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01531 #endif
01532
01533 #ifndef U_HIDE_INTERNAL_API
01534
01544 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01545
01554 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01555 #endif
01556
01557 #ifndef U_HIDE_DEPRECATED_API
01558
01567 void internalSet(EDateFields field, int32_t value);
01568 #endif
01569
01579 inline void internalSet(UCalendarDateFields field, int32_t value);
01580
01587 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01588
01593 enum ELimitType {
01594 #ifndef U_HIDE_INTERNAL_API
01595 UCAL_LIMIT_MINIMUM = 0,
01596 UCAL_LIMIT_GREATEST_MINIMUM,
01597 UCAL_LIMIT_LEAST_MAXIMUM,
01598 UCAL_LIMIT_MAXIMUM,
01599 UCAL_LIMIT_COUNT
01600 #endif
01601 };
01602
01624 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01625
01633 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01634
01635
01649 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01650 UBool useMonth) const = 0;
01651
01659 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01660
01668 virtual int32_t handleGetYearLength(int32_t eyear) const;
01669
01670
01679 virtual int32_t handleGetExtendedYear() = 0;
01680
01689 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01690
01699 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01700
01707 virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01708
01709 #ifndef U_HIDE_INTERNAL_API
01710
01716 int32_t computeJulianDay();
01717
01725 double computeMillisInDay();
01726
01736 int32_t computeZoneOffset(double millis, double millisInDay, UErrorCode &ec);
01737
01738
01747 int32_t newestStamp(UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar) const;
01748
01754 enum {
01756 kResolveSTOP = -1,
01758 kResolveRemap = 32
01759 };
01760
01766 static const UFieldResolutionTable kDatePrecedence[];
01767
01773 static const UFieldResolutionTable kYearPrecedence[];
01774
01780 static const UFieldResolutionTable kDOWPrecedence[];
01781
01809 UCalendarDateFields resolveFields(const UFieldResolutionTable *precedenceTable);
01810 #endif
01811
01812
01816 virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01817
01818 #ifndef U_HIDE_INTERNAL_API
01819
01824 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01825 #endif
01826
01827
01828 private:
01837 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01838
01839
01840 protected:
01845 UBool fIsTimeSet;
01846
01857 UBool fAreFieldsSet;
01858
01864 UBool fAreAllFieldsSet;
01865
01873 UBool fAreFieldsVirtuallySet;
01874
01881 UDate internalGetTime(void) const { return fTime; }
01882
01890 void internalSetTime(UDate time) { fTime = time; }
01891
01896 int32_t fFields[UCAL_FIELD_COUNT];
01897
01902 UBool fIsSet[UCAL_FIELD_COUNT];
01903
01907 enum {
01908 kUnset = 0,
01909 kInternallySet,
01910 kMinimumUserStamp
01911 };
01912
01919 int32_t fStamp[UCAL_FIELD_COUNT];
01920
01945 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01946
01947 #ifndef U_HIDE_INTERNAL_API
01948
01953 int32_t getGregorianYear() const {
01954 return fGregorianYear;
01955 }
01956
01962 int32_t getGregorianMonth() const {
01963 return fGregorianMonth;
01964 }
01965
01971 int32_t getGregorianDayOfYear() const {
01972 return fGregorianDayOfYear;
01973 }
01974
01980 int32_t getGregorianDayOfMonth() const {
01981 return fGregorianDayOfMonth;
01982 }
01983 #endif
01984
01991 virtual int32_t getDefaultMonthInYear(int32_t eyear) ;
01992
01993
02001 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month);
02002
02003
02004
02005
02006
02007
02037 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
02038
02082 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
02083
02084
02085 #ifndef U_HIDE_INTERNAL_API
02086
02116 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
02117
02122 int32_t getLocalDOW();
02123 #endif
02124
02125 private:
02126
02130 int32_t fNextStamp;
02131
02136 void recalculateStamp();
02137
02141 UDate fTime;
02142
02146 UBool fLenient;
02147
02152 TimeZone* fZone;
02153
02158 UCalendarWallTimeOption fRepeatedWallTime;
02159
02164 UCalendarWallTimeOption fSkippedWallTime;
02165
02174 UCalendarDaysOfWeek fFirstDayOfWeek;
02175 uint8_t fMinimalDaysInFirstWeek;
02176 UCalendarDaysOfWeek fWeekendOnset;
02177 int32_t fWeekendOnsetMillis;
02178 UCalendarDaysOfWeek fWeekendCease;
02179 int32_t fWeekendCeaseMillis;
02180
02191 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success);
02192
02202 void updateTime(UErrorCode& status);
02203
02209 int32_t fGregorianYear;
02210
02216 int32_t fGregorianMonth;
02217
02223 int32_t fGregorianDayOfYear;
02224
02230 int32_t fGregorianDayOfMonth;
02231
02232
02233
02240 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
02241
02242 protected:
02243
02251 void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
02252
02253 private:
02254
02275 void computeWeekFields(UErrorCode &ec);
02276
02277
02286 void validateFields(UErrorCode &status);
02287
02296 void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02297
02298 protected:
02299 #ifndef U_HIDE_INTERNAL_API
02300
02309 static uint8_t julianDayToDayOfWeek(double julian);
02310 #endif
02311
02312 private:
02313 char validLocale[ULOC_FULLNAME_CAPACITY];
02314 char actualLocale[ULOC_FULLNAME_CAPACITY];
02315
02316 public:
02317 #if !UCONFIG_NO_SERVICE
02318
02322 #ifndef U_HIDE_INTERNAL_API
02323
02329 static StringEnumeration* getAvailableLocales(void);
02330
02344 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02345
02361 static UBool unregister(URegistryKey key, UErrorCode& status);
02362 #endif
02363
02368 friend class CalendarFactory;
02369
02374 friend class CalendarService;
02375
02380 friend class DefaultCalendarFactory;
02381 #endif
02382
02387 virtual UBool haveDefaultCentury() const = 0;
02388
02393 virtual UDate defaultCenturyStart() const = 0;
02398 virtual int32_t defaultCenturyStartYear() const = 0;
02399
02406 Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02407
02413 virtual int32_t getRelatedYear(UErrorCode &status) const;
02414
02420 virtual void setRelatedYear(int32_t year);
02421
02422 #ifndef U_HIDE_INTERNAL_API
02423
02429 const char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02430 #endif
02431
02432 private:
02437 BasicTimeZone* getBasicTimeZone() const;
02438
02446 UBool getImmediatePreviousZoneTransition(UDate base, UDate *transitionTime, UErrorCode& status) const;
02447
02448 public:
02449 #ifndef U_HIDE_INTERNAL_API
02450
02458 static Calendar * U_EXPORT2 makeInstance(
02459 const Locale &locale, UErrorCode &status);
02460
02471 static void U_EXPORT2 getCalendarTypeFromLocale(
02472 const Locale &locale,
02473 char *typeBuffer,
02474 int32_t typeBufferSize,
02475 UErrorCode &status);
02476 #endif
02477 };
02478
02479
02480
02481 inline Calendar*
02482 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
02483 {
02484
02485 return createInstance(zone, Locale::getDefault(), errorCode);
02486 }
02487
02488
02489
02490 inline void
02491 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02492 {
02493 roll(field, (int32_t)(up ? +1 : -1), status);
02494 }
02495
02496 #ifndef U_HIDE_DEPRECATED_API
02497 inline void
02498 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02499 {
02500 roll((UCalendarDateFields) field, up, status);
02501 }
02502 #endif
02503
02504
02505
02506
02512 inline void
02513 Calendar::internalSet(UCalendarDateFields field, int32_t value)
02514 {
02515 fFields[field] = value;
02516 fStamp[field] = kInternallySet;
02517 fIsSet[field] = TRUE;
02518 }
02519
02520
02521 #ifndef U_HIDE_INTERNAL_API
02522 inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02523 {
02524 return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02525 }
02526 #endif
02527
02528 U_NAMESPACE_END
02529
02530 #endif
02531
02532 #endif // _CALENDAR