00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef CALENDAR_H
00025 #define CALENDAR_H
00026
00027 #include "unicode/utypes.h"
00028
00029 #if !UCONFIG_NO_FORMATTING
00030
00031 #include "unicode/uobject.h"
00032 #include "unicode/locid.h"
00033 #include "unicode/timezone.h"
00034 #include "unicode/ucal.h"
00035
00036 U_NAMESPACE_BEGIN
00037
00038 class ICUServiceFactory;
00039
00043 typedef const void* URegistryKey;
00044
00159 class U_I18N_API Calendar : public UObject {
00160 public:
00161
00168 enum EDateFields {
00169 ERA,
00170 YEAR,
00171 MONTH,
00172 WEEK_OF_YEAR,
00173 WEEK_OF_MONTH,
00174 DATE,
00175 DAY_OF_YEAR,
00176 DAY_OF_WEEK,
00177 DAY_OF_WEEK_IN_MONTH,
00178 AM_PM,
00179 HOUR,
00180 HOUR_OF_DAY,
00181 MINUTE,
00182 SECOND,
00183 MILLISECOND,
00184 ZONE_OFFSET,
00185 DST_OFFSET,
00186
00187 YEAR_WOY,
00188 DOW_LOCAL,
00189 FIELD_COUNT,
00190
00191 DAY_OF_MONTH = DATE
00192 };
00193
00200 enum EDaysOfWeek {
00201 SUNDAY = 1,
00202 MONDAY,
00203 TUESDAY,
00204 WEDNESDAY,
00205 THURSDAY,
00206 FRIDAY,
00207 SATURDAY
00208 };
00209
00214 enum EMonths {
00215 JANUARY,
00216 FEBRUARY,
00217 MARCH,
00218 APRIL,
00219 MAY,
00220 JUNE,
00221 JULY,
00222 AUGUST,
00223 SEPTEMBER,
00224 OCTOBER,
00225 NOVEMBER,
00226 DECEMBER,
00227 UNDECIMBER
00228 };
00229
00234 enum EAmpm {
00235 AM,
00236 PM
00237 };
00238
00243 virtual ~Calendar();
00244
00251 virtual Calendar* clone(void) const = 0;
00252
00264 static Calendar* createInstance(UErrorCode& success);
00265
00278 static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00279
00291 static Calendar* createInstance(const TimeZone& zone, UErrorCode& success);
00292
00303 static Calendar* createInstance(const Locale& aLocale, UErrorCode& success);
00304
00318 static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00319
00332 static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00333
00343 static const Locale* getAvailableLocales(int32_t& count);
00344
00352 static UDate getNow(void);
00353
00367 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00368
00379 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00380
00392 virtual UBool operator==(const Calendar& that) const;
00393
00402 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00403
00414 virtual UBool isEquivalentTo(const Calendar& other) const;
00415
00430 UBool equals(const Calendar& when, UErrorCode& status) const;
00431
00445 UBool before(const Calendar& when, UErrorCode& status) const;
00446
00460 UBool after(const Calendar& when, UErrorCode& status) const;
00461
00479 virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00480
00498 virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status) = 0;
00499
00523 inline void roll(EDateFields field, UBool up, UErrorCode& status);
00524
00548 inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00549
00572 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00573
00596 virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status) = 0;
00597
00653 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00654
00710 virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00711
00720 void adoptTimeZone(TimeZone* value);
00721
00729 void setTimeZone(const TimeZone& zone);
00730
00739 const TimeZone& getTimeZone(void) const;
00740
00749 TimeZone* orphanTimeZone(void);
00750
00759 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00760
00773 void setLenient(UBool lenient);
00774
00781 UBool isLenient(void) const;
00782
00789 void setFirstDayOfWeek(EDaysOfWeek value);
00790
00797 void setFirstDayOfWeek(UCalendarDaysOfWeek value);
00798
00805 EDaysOfWeek getFirstDayOfWeek(void) const;
00806
00814 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00815
00825 void setMinimalDaysInFirstWeek(uint8_t value);
00826
00836 uint8_t getMinimalDaysInFirstWeek(void) const;
00837
00846 virtual int32_t getMinimum(EDateFields field) const = 0;
00847
00856 virtual int32_t getMinimum(UCalendarDateFields field) const = 0;
00857
00866 virtual int32_t getMaximum(EDateFields field) const = 0;
00867
00876 virtual int32_t getMaximum(UCalendarDateFields field) const = 0;
00877
00886 virtual int32_t getGreatestMinimum(EDateFields field) const = 0;
00887
00896 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const = 0;
00897
00906 virtual int32_t getLeastMaximum(EDateFields field) const = 0;
00907
00916 virtual int32_t getLeastMaximum(UCalendarDateFields field) const = 0;
00917
00932 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00933
00948 int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
00949
00966 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00967
00984 int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
00985
00999 int32_t get(EDateFields field, UErrorCode& status) const;
01000
01014 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01015
01024 UBool isSet(EDateFields field) const;
01025
01034 UBool isSet(UCalendarDateFields field) const;
01035
01043 void set(EDateFields field, int32_t value);
01044
01052 void set(UCalendarDateFields field, int32_t value);
01053
01064 void set(int32_t year, int32_t month, int32_t date);
01065
01078 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01079
01093 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01094
01101 void clear(void);
01102
01111 void clear(EDateFields field);
01112
01121 void clear(UCalendarDateFields field);
01122
01138 virtual UClassID getDynamicClassID(void) const = 0;
01139
01148 virtual const char * getType() const = 0;
01149
01150 protected:
01151
01160 Calendar(UErrorCode& success);
01161
01168 Calendar(const Calendar& source);
01169
01176 Calendar& operator=(const Calendar& right);
01177
01188 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
01189
01199 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
01200
01209 virtual void computeTime(UErrorCode& status) = 0;
01210
01222 virtual void computeFields(UErrorCode& status) = 0;
01223
01233 double getTimeInMillis(UErrorCode& status) const;
01234
01243 void setTimeInMillis( double millis, UErrorCode& status );
01244
01254 void complete(UErrorCode& status);
01255
01264 inline int32_t internalGet(EDateFields field) const {return fFields[field];}
01265
01274 inline int32_t internalGet(UCalendarDateFields field) const {return fFields[field];}
01275
01285 void internalSet(EDateFields field, int32_t value);
01286
01296 inline void internalSet(UCalendarDateFields field, int32_t value);
01297
01298 protected:
01303 UBool fIsTimeSet;
01304
01315 UBool fAreFieldsSet;
01316
01322 UBool fAreAllFieldsSet;
01323
01330 UDate internalGetTime(void) const { return fTime; }
01331
01339 void internalSetTime(UDate time) { fTime = time; }
01340
01345 int32_t fFields[UCAL_FIELD_COUNT];
01346
01351 UBool fIsSet[UCAL_FIELD_COUNT];
01352
01356 enum {
01357 kUnset = 0,
01358 kInternallySet,
01359 kMinimumUserStamp
01360 };
01361
01368 int32_t fStamp[UCAL_FIELD_COUNT];
01369
01370 private:
01371
01372
01373 int32_t fNextStamp;
01374
01378 UDate fTime;
01379
01383 UBool fLenient;
01384
01389 TimeZone* fZone;
01390
01399 UCalendarDaysOfWeek fFirstDayOfWeek;
01400 uint8_t fMinimalDaysInFirstWeek;
01401
01411 void setWeekCountData(const Locale& desiredLocale, UErrorCode& success);
01412
01422 void updateTime(UErrorCode& status);
01423
01427 static const char kDateTimeElements[];
01428
01432 static const char kDefaultCalendar[];
01433
01434 public:
01445 static StringEnumeration* getAvailableLocales(void);
01446
01455 static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
01456
01467 static UBool unregister(URegistryKey key, UErrorCode& status);
01468
01473 friend class CalendarFactory;
01474
01479 friend class CalendarService;
01480
01485 friend class DefaultCalendarFactory;
01486
01491 virtual UBool haveDefaultCentury() const = 0;
01492
01497 virtual UDate defaultCenturyStart() const = 0;
01502 virtual int32_t defaultCenturyStartYear() const = 0;
01503
01504 };
01505
01506
01507
01508 inline Calendar*
01509 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
01510 {
01511
01512 return createInstance(zone, Locale::getDefault(), errorCode);
01513 }
01514
01515
01516
01517 inline void
01518 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
01519 {
01520 roll(field, (int32_t)(up ? +1 : -1), status);
01521 }
01522
01523 inline void
01524 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
01525 {
01526 roll((UCalendarDateFields) field, up, status);
01527 }
01528
01529
01530
01536 inline void
01537 Calendar::internalSet(UCalendarDateFields field, int32_t value)
01538 {
01539 fFields[field] = value;
01540 }
01541
01542 inline void
01543 Calendar::internalSet(EDateFields field, int32_t value)
01544 {
01545 internalSet((UCalendarDateFields) field, value);
01546 }
01547
01548 U_NAMESPACE_END
01549
01550 #endif
01551
01552 #endif // _CALENDAR