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 #ifndef CALENDAR_H
00026 #define CALENDAR_H
00027
00028 #include "unicode/utypes.h"
00029
00034 #if !UCONFIG_NO_FORMATTING
00035
00036 #include "unicode/uobject.h"
00037 #include "unicode/locid.h"
00038 #include "unicode/timezone.h"
00039 #include "unicode/ucal.h"
00040 #include "unicode/umisc.h"
00041
00042 U_NAMESPACE_BEGIN
00043
00044 class ICUServiceFactory;
00045
00049 typedef int32_t UFieldResolutionTable[12][8];
00050
00051 class BasicTimeZone;
00200 class U_I18N_API Calendar : public UObject {
00201 public:
00202
00209 enum EDateFields {
00210 #ifndef U_HIDE_DEPRECATED_API
00211
00212
00213
00214 #ifdef ERA
00215 #undef ERA
00216 #endif
00217 ERA,
00218 YEAR,
00219 MONTH,
00220 WEEK_OF_YEAR,
00221 WEEK_OF_MONTH,
00222 DATE,
00223 DAY_OF_YEAR,
00224 DAY_OF_WEEK,
00225 DAY_OF_WEEK_IN_MONTH,
00226 AM_PM,
00227 HOUR,
00228 HOUR_OF_DAY,
00229 MINUTE,
00230 SECOND,
00231 MILLISECOND,
00232 ZONE_OFFSET,
00233 DST_OFFSET,
00234 YEAR_WOY,
00235 DOW_LOCAL,
00236
00237 EXTENDED_YEAR,
00238 JULIAN_DAY,
00239 MILLISECONDS_IN_DAY,
00240 IS_LEAP_MONTH,
00241
00242 FIELD_COUNT = UCAL_FIELD_COUNT
00243 #endif
00244 };
00245
00246 #ifndef U_HIDE_DEPRECATED_API
00247
00253 enum EDaysOfWeek {
00254 SUNDAY = 1,
00255 MONDAY,
00256 TUESDAY,
00257 WEDNESDAY,
00258 THURSDAY,
00259 FRIDAY,
00260 SATURDAY
00261 };
00262
00267 enum EMonths {
00268 JANUARY,
00269 FEBRUARY,
00270 MARCH,
00271 APRIL,
00272 MAY,
00273 JUNE,
00274 JULY,
00275 AUGUST,
00276 SEPTEMBER,
00277 OCTOBER,
00278 NOVEMBER,
00279 DECEMBER,
00280 UNDECIMBER
00281 };
00282
00287 enum EAmpm {
00288 AM,
00289 PM
00290 };
00291 #endif
00292
00297 virtual ~Calendar();
00298
00305 virtual Calendar* clone(void) const = 0;
00306
00318 static Calendar* U_EXPORT2 createInstance(UErrorCode& success);
00319
00332 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00333
00345 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, UErrorCode& success);
00346
00357 static Calendar* U_EXPORT2 createInstance(const Locale& aLocale, UErrorCode& success);
00358
00372 static Calendar* U_EXPORT2 createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00373
00386 static Calendar* U_EXPORT2 createInstance(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00387
00397 static const Locale* U_EXPORT2 getAvailableLocales(int32_t& count);
00398
00399
00416 static StringEnumeration* U_EXPORT2 getKeywordValuesForLocale(const char* key,
00417 const Locale& locale, UBool commonlyUsed, UErrorCode& status);
00418
00426 static UDate U_EXPORT2 getNow(void);
00427
00441 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00442
00453 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00454
00466 virtual UBool operator==(const Calendar& that) const;
00467
00476 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00477
00488 virtual UBool isEquivalentTo(const Calendar& other) const;
00489
00504 UBool equals(const Calendar& when, UErrorCode& status) const;
00505
00519 UBool before(const Calendar& when, UErrorCode& status) const;
00520
00534 UBool after(const Calendar& when, UErrorCode& status) const;
00535
00556 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00557
00578 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00579
00580 #ifndef U_HIDE_DEPRECATED_API
00581
00613 inline void roll(EDateFields field, UBool up, UErrorCode& status);
00614 #endif
00615
00648 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00649
00681 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00682
00714 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00715
00771 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00772
00828 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00829
00838 void adoptTimeZone(TimeZone* value);
00839
00847 void setTimeZone(const TimeZone& zone);
00848
00857 const TimeZone& getTimeZone(void) const;
00858
00867 TimeZone* orphanTimeZone(void);
00868
00877 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00878
00891 void setLenient(UBool lenient);
00892
00899 UBool isLenient(void) const;
00900
00921 void setRepeatedWallTimeOption(UCalendarWallTimeOption option);
00922
00932 UCalendarWallTimeOption getRepeatedWallTimeOption(void) const;
00933
00955 void setSkippedWallTimeOption(UCalendarWallTimeOption option);
00956
00967 UCalendarWallTimeOption getSkippedWallTimeOption(void) const;
00968
00969 #ifndef U_HIDE_DEPRECATED_API
00970
00976 void setFirstDayOfWeek(EDaysOfWeek value);
00977 #endif
00978
00985 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00986
00987 #ifndef U_HIDE_DEPRECATED_API
00988
00994 EDaysOfWeek getFirstDayOfWeek(void) const;
00995 #endif
00996
01004 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
01005
01015 void setMinimalDaysInFirstWeek(uint8_t value);
01016
01026 uint8_t getMinimalDaysInFirstWeek(void) const;
01027
01036 virtual int32_t getMinimum(EDateFields field) const;
01037
01046 virtual int32_t getMinimum(UCalendarDateFields field) const;
01047
01056 virtual int32_t getMaximum(EDateFields field) const;
01057
01066 virtual int32_t getMaximum(UCalendarDateFields field) const;
01067
01076 virtual int32_t getGreatestMinimum(EDateFields field) const;
01077
01086 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
01087
01096 virtual int32_t getLeastMaximum(EDateFields field) const;
01097
01106 virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
01107
01108 #ifndef U_HIDE_DEPRECATED_API
01109
01123 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
01124 #endif
01125
01140 virtual int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
01141
01142 #ifndef U_HIDE_DEPRECATED_API
01143
01159 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
01160 #endif
01161
01178 virtual int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
01179
01180 #ifndef U_HIDE_DEPRECATED_API
01181
01194 int32_t get(EDateFields field, UErrorCode& status) const;
01195 #endif
01196
01210 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01211
01212 #ifndef U_HIDE_DEPRECATED_API
01213
01221 UBool isSet(EDateFields field) const;
01222 #endif
01223
01232 UBool isSet(UCalendarDateFields field) const;
01233
01234 #ifndef U_HIDE_DEPRECATED_API
01235
01242 void set(EDateFields field, int32_t value);
01243 #endif
01244
01252 void set(UCalendarDateFields field, int32_t value);
01253
01264 void set(int32_t year, int32_t month, int32_t date);
01265
01278 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01279
01293 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01294
01301 void clear(void);
01302
01303 #ifndef U_HIDE_DEPRECATED_API
01304
01312 void clear(EDateFields field);
01313 #endif
01314
01323 void clear(UCalendarDateFields field);
01324
01340 virtual UClassID getDynamicClassID(void) const = 0;
01341
01374 virtual const char * getType() const = 0;
01375
01392 virtual UCalendarWeekdayType getDayOfWeekType(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01393
01408 virtual int32_t getWeekendTransition(UCalendarDaysOfWeek dayOfWeek, UErrorCode &status) const;
01409
01419 virtual UBool isWeekend(UDate date, UErrorCode &status) const;
01420
01428 virtual UBool isWeekend(void) const;
01429
01430 protected:
01431
01440 Calendar(UErrorCode& success);
01441
01448 Calendar(const Calendar& source);
01449
01456 Calendar& operator=(const Calendar& right);
01457
01468 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01469
01479 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01480
01489 virtual void computeTime(UErrorCode& status);
01490
01502 virtual void computeFields(UErrorCode& status);
01503
01513 double getTimeInMillis(UErrorCode& status) const;
01514
01523 void setTimeInMillis( double millis, UErrorCode& status );
01524
01534 void complete(UErrorCode& status);
01535
01536 #ifndef U_HIDE_DEPRECATED_API
01537
01545 inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01546 #endif
01547
01548 #ifndef U_HIDE_INTERNAL_API
01549
01559 inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue) const {return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01560
01569 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01570 #endif
01571
01572 #ifndef U_HIDE_DEPRECATED_API
01573
01582 void internalSet(EDateFields field, int32_t value);
01583 #endif
01584
01594 inline void internalSet(UCalendarDateFields field, int32_t value);
01595
01602 virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01603
01608 enum ELimitType {
01609 #ifndef U_HIDE_INTERNAL_API
01610 UCAL_LIMIT_MINIMUM = 0,
01611 UCAL_LIMIT_GREATEST_MINIMUM,
01612 UCAL_LIMIT_LEAST_MAXIMUM,
01613 UCAL_LIMIT_MAXIMUM,
01614 UCAL_LIMIT_COUNT
01615 #endif
01616 };
01617
01639 virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const = 0;
01640
01648 virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType) const;
01649
01650
01664 virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01665 UBool useMonth) const = 0;
01666
01674 virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month) const ;
01675
01683 virtual int32_t handleGetYearLength(int32_t eyear) const;
01684
01685
01694 virtual int32_t handleGetExtendedYear() = 0;
01695
01704 virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01705
01714 virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01715
01724 virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01725
01726 #ifndef U_HIDE_INTERNAL_API
01727
01733 int32_t computeJulianDay();
01734
01742 int32_t computeMillisInDay();
01743
01753 int32_t computeZoneOffset(double millis, int32_t 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
01919 UBool fIsSet[UCAL_FIELD_COUNT];
01920
01924 enum {
01925 kUnset = 0,
01926 kInternallySet,
01927 kMinimumUserStamp
01928 };
01929
01936 int32_t fStamp[UCAL_FIELD_COUNT];
01937
01962 virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01963
01964 #ifndef U_HIDE_INTERNAL_API
01965
01970 int32_t getGregorianYear() const {
01971 return fGregorianYear;
01972 }
01973
01979 int32_t getGregorianMonth() const {
01980 return fGregorianMonth;
01981 }
01982
01988 int32_t getGregorianDayOfYear() const {
01989 return fGregorianDayOfYear;
01990 }
01991
01997 int32_t getGregorianDayOfMonth() const {
01998 return fGregorianDayOfMonth;
01999 }
02000 #endif
02001
02008 virtual int32_t getDefaultMonthInYear(int32_t eyear) ;
02009
02010
02018 virtual int32_t getDefaultDayInMonth(int32_t eyear, int32_t month);
02019
02020
02021
02022
02023
02024
02054 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
02055
02099 int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
02100
02101
02102 #ifndef U_HIDE_INTERNAL_API
02103
02133 inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
02134
02139 int32_t getLocalDOW();
02140 #endif
02141
02142 private:
02143
02147 int32_t fNextStamp;
02148
02153 void recalculateStamp();
02154
02158 UDate fTime;
02159
02163 UBool fLenient;
02164
02169 TimeZone* fZone;
02170
02175 UCalendarWallTimeOption fRepeatedWallTime;
02176
02181 UCalendarWallTimeOption fSkippedWallTime;
02182
02191 UCalendarDaysOfWeek fFirstDayOfWeek;
02192 uint8_t fMinimalDaysInFirstWeek;
02193 UCalendarDaysOfWeek fWeekendOnset;
02194 int32_t fWeekendOnsetMillis;
02195 UCalendarDaysOfWeek fWeekendCease;
02196 int32_t fWeekendCeaseMillis;
02197
02208 void setWeekData(const Locale& desiredLocale, const char *type, UErrorCode& success);
02209
02219 void updateTime(UErrorCode& status);
02220
02226 int32_t fGregorianYear;
02227
02233 int32_t fGregorianMonth;
02234
02240 int32_t fGregorianDayOfYear;
02241
02247 int32_t fGregorianDayOfMonth;
02248
02249
02250
02257 void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
02258
02259 protected:
02260
02268 void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
02269
02270 private:
02271
02292 void computeWeekFields(UErrorCode &ec);
02293
02294
02303 void validateFields(UErrorCode &status);
02304
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 // _CALENDAR