00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023 #ifndef CALENDAR_H
00024 #define CALENDAR_H
00025
00026 #include "unicode/locid.h"
00027 #include "unicode/timezone.h"
00028
00029
00030
00141 class U_I18N_API Calendar {
00142 public:
00143
00149 enum EDateFields {
00150 ERA,
00151 YEAR,
00152 MONTH,
00153 WEEK_OF_YEAR,
00154 WEEK_OF_MONTH,
00155 DATE,
00156 DAY_OF_YEAR,
00157 DAY_OF_WEEK,
00158 DAY_OF_WEEK_IN_MONTH,
00159 AM_PM,
00160 HOUR,
00161 HOUR_OF_DAY,
00162 MINUTE,
00163 SECOND,
00164 MILLISECOND,
00165 ZONE_OFFSET,
00166 DST_OFFSET,
00167
00168 YEAR_WOY,
00169 DOW_LOCAL,
00170 FIELD_COUNT,
00171
00172 DAY_OF_MONTH = DATE
00173 };
00174
00180 enum EDaysOfWeek {
00181 SUNDAY = 1,
00182 MONDAY,
00183 TUESDAY,
00184 WEDNESDAY,
00185 THURSDAY,
00186 FRIDAY,
00187 SATURDAY
00188 };
00189
00193 enum EMonths {
00194 JANUARY,
00195 FEBRUARY,
00196 MARCH,
00197 APRIL,
00198 MAY,
00199 JUNE,
00200 JULY,
00201 AUGUST,
00202 SEPTEMBER,
00203 OCTOBER,
00204 NOVEMBER,
00205 DECEMBER,
00206 UNDECIMBER
00207 };
00208
00212 enum EAmpm {
00213 AM,
00214 PM
00215 };
00216
00221 virtual ~Calendar();
00222
00227 virtual Calendar* clone(void) const = 0;
00228
00239 static Calendar* createInstance(UErrorCode& success);
00240
00253 static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00254
00266 static Calendar* createInstance(const TimeZone& zone, UErrorCode& success);
00267
00278 static Calendar* createInstance(const Locale& aLocale, UErrorCode& success);
00279
00293 static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00294
00307 static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00308
00318 static const Locale* getAvailableLocales(int32_t& count);
00319
00327 static UDate getNow(void);
00328
00342 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00343
00351 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00352
00364 virtual UBool operator==(const Calendar& that) const;
00365
00374 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00375
00390 UBool equals(const Calendar& when, UErrorCode& status) const;
00391
00405 UBool before(const Calendar& when, UErrorCode& status) const;
00406
00420 UBool after(const Calendar& when, UErrorCode& status) const;
00421
00427 virtual UBool equivalentTo(const Calendar& other) const;
00428
00446 virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00447
00471 void roll(EDateFields field, UBool up, UErrorCode& status);
00472
00495 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00496
00548 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00549
00558 void adoptTimeZone(TimeZone* value);
00559
00567 void setTimeZone(const TimeZone& zone);
00568
00577 const TimeZone& getTimeZone(void) const;
00578
00587 TimeZone* orphanTimeZone(void);
00588
00597 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00598
00611 void setLenient(UBool lenient);
00612
00619 UBool isLenient(void) const;
00620
00627 void setFirstDayOfWeek(EDaysOfWeek value);
00628
00635 EDaysOfWeek getFirstDayOfWeek(void) const;
00636
00646 void setMinimalDaysInFirstWeek(uint8_t value);
00647
00657 uint8_t getMinimalDaysInFirstWeek(void) const;
00658
00667 virtual int32_t getMinimum(EDateFields field) const = 0;
00668
00677 virtual int32_t getMaximum(EDateFields field) const = 0;
00678
00687 virtual int32_t getGreatestMinimum(EDateFields field) const = 0;
00688
00697 virtual int32_t getLeastMaximum(EDateFields field) const = 0;
00698
00712 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00713
00729 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00730
00744 int32_t get(EDateFields field, UErrorCode& status) const;
00745
00753 UBool isSet(EDateFields field) const;
00754
00762 void set(EDateFields field, int32_t value);
00763
00774 void set(int32_t year, int32_t month, int32_t date);
00775
00788 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
00789
00803 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
00804
00811 void clear(void);
00812
00821 void clear(EDateFields field);
00822
00838 virtual UClassID getDynamicClassID(void) const = 0;
00839
00840 protected:
00841
00850 Calendar(UErrorCode& success);
00851
00856 Calendar(const Calendar& source);
00857
00862 Calendar& operator=(const Calendar& right);
00863
00874 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
00875
00885 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00886
00895 virtual void computeTime(UErrorCode& status) = 0;
00896
00904 virtual void computeFields(UErrorCode& status) = 0;
00905
00911 double getTimeInMillis(UErrorCode& status) const;
00912
00918 void setTimeInMillis( double millis, UErrorCode& status );
00919
00929 void complete(UErrorCode& status);
00930
00939 int32_t internalGet(EDateFields field) const {return fFields[field];}
00940
00947 void internalSet(EDateFields field, int32_t value);
00948
00949 protected:
00953 UBool fIsTimeSet;
00954
00964 UBool fAreFieldsSet;
00965
00970 UBool fAreAllFieldsSet;
00971
00976 UDate internalGetTime(void) const { return fTime; }
00977
00982 void internalSetTime(UDate time) { fTime = time; }
00983
00987 int32_t fFields[FIELD_COUNT];
00988
00992 UBool fIsSet[FIELD_COUNT];
00993
00994
00995 enum {
00996 kUnset = 0,
00997 kInternallySet,
00998 kMinimumUserStamp
00999 };
01000
01006 int32_t fStamp[FIELD_COUNT];
01007
01008 private:
01009
01010
01011 int32_t fNextStamp;
01012
01016 UDate fTime;
01017
01021 UBool fLenient;
01022
01027 TimeZone* fZone;
01028
01037 EDaysOfWeek fFirstDayOfWeek;
01038 uint8_t fMinimalDaysInFirstWeek;
01039
01049 void setWeekCountData(const Locale& desiredLocale, UErrorCode& success);
01050
01056 void updateTime(UErrorCode& status);
01057
01064 static int32_t stringToDayNumber(const UnicodeString& string, UErrorCode& status);
01065
01069 static const char* kDateTimeElements;
01070 };
01071
01072
01073
01074 inline Calendar*
01075 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
01076 {
01077
01078 return createInstance(zone, Locale::getDefault(), errorCode);
01079 }
01080
01081
01082
01083 inline void
01084 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
01085 {
01086 roll(field, (int32_t)(up ? +1 : -1), status);
01087 }
01088
01089
01090
01095 inline void
01096 Calendar::internalSet(EDateFields field, int32_t value)
01097 {
01098 fFields[field] = value;
01099 }
01100
01101 #endif // _CALENDAR