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/utypes.h"
00027 #include "unicode/uobject.h"
00028 #include "unicode/locid.h"
00029 #include "unicode/timezone.h"
00030
00031 U_NAMESPACE_BEGIN
00032
00144 class U_I18N_API Calendar : public UObject {
00145 public:
00146
00153 enum EDateFields {
00154 ERA,
00155 YEAR,
00156 MONTH,
00157 WEEK_OF_YEAR,
00158 WEEK_OF_MONTH,
00159 DATE,
00160 DAY_OF_YEAR,
00161 DAY_OF_WEEK,
00162 DAY_OF_WEEK_IN_MONTH,
00163 AM_PM,
00164 HOUR,
00165 HOUR_OF_DAY,
00166 MINUTE,
00167 SECOND,
00168 MILLISECOND,
00169 ZONE_OFFSET,
00170 DST_OFFSET,
00171
00172 YEAR_WOY,
00173 DOW_LOCAL,
00174 FIELD_COUNT,
00175
00176 DAY_OF_MONTH = DATE
00177 };
00178
00185 enum EDaysOfWeek {
00186 SUNDAY = 1,
00187 MONDAY,
00188 TUESDAY,
00189 WEDNESDAY,
00190 THURSDAY,
00191 FRIDAY,
00192 SATURDAY
00193 };
00194
00199 enum EMonths {
00200 JANUARY,
00201 FEBRUARY,
00202 MARCH,
00203 APRIL,
00204 MAY,
00205 JUNE,
00206 JULY,
00207 AUGUST,
00208 SEPTEMBER,
00209 OCTOBER,
00210 NOVEMBER,
00211 DECEMBER,
00212 UNDECIMBER
00213 };
00214
00219 enum EAmpm {
00220 AM,
00221 PM
00222 };
00223
00228 virtual ~Calendar();
00229
00236 virtual Calendar* clone(void) const = 0;
00237
00248 static Calendar* createInstance(UErrorCode& success);
00249
00262 static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00263
00275 static Calendar* createInstance(const TimeZone& zone, UErrorCode& success);
00276
00287 static Calendar* createInstance(const Locale& aLocale, UErrorCode& success);
00288
00302 static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00303
00316 static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00317
00327 static const Locale* getAvailableLocales(int32_t& count);
00328
00336 static UDate getNow(void);
00337
00351 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00352
00363 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00364
00376 virtual UBool operator==(const Calendar& that) const;
00377
00386 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00387
00402 UBool equals(const Calendar& when, UErrorCode& status) const;
00403
00417 UBool before(const Calendar& when, UErrorCode& status) const;
00418
00432 UBool after(const Calendar& when, UErrorCode& status) const;
00433
00451 virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00452
00476 void roll(EDateFields field, UBool up, UErrorCode& status);
00477
00500 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00501
00557 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00558
00567 void adoptTimeZone(TimeZone* value);
00568
00576 void setTimeZone(const TimeZone& zone);
00577
00586 const TimeZone& getTimeZone(void) const;
00587
00596 TimeZone* orphanTimeZone(void);
00597
00606 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00607
00620 void setLenient(UBool lenient);
00621
00628 UBool isLenient(void) const;
00629
00636 void setFirstDayOfWeek(EDaysOfWeek value);
00637
00644 EDaysOfWeek getFirstDayOfWeek(void) const;
00645
00655 void setMinimalDaysInFirstWeek(uint8_t value);
00656
00666 uint8_t getMinimalDaysInFirstWeek(void) const;
00667
00676 virtual int32_t getMinimum(EDateFields field) const = 0;
00677
00686 virtual int32_t getMaximum(EDateFields field) const = 0;
00687
00696 virtual int32_t getGreatestMinimum(EDateFields field) const = 0;
00697
00706 virtual int32_t getLeastMaximum(EDateFields field) const = 0;
00707
00722 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00723
00740 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00741
00755 int32_t get(EDateFields field, UErrorCode& status) const;
00756
00765 UBool isSet(EDateFields field) const;
00766
00774 void set(EDateFields field, int32_t value);
00775
00786 void set(int32_t year, int32_t month, int32_t date);
00787
00800 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
00801
00815 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
00816
00823 void clear(void);
00824
00833 void clear(EDateFields field);
00834
00850 virtual UClassID getDynamicClassID(void) const = 0;
00851
00852 protected:
00853
00862 Calendar(UErrorCode& success);
00863
00870 Calendar(const Calendar& source);
00871
00878 Calendar& operator=(const Calendar& right);
00879
00890 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
00891
00901 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00902
00911 virtual void computeTime(UErrorCode& status) = 0;
00912
00924 virtual void computeFields(UErrorCode& status) = 0;
00925
00935 double getTimeInMillis(UErrorCode& status) const;
00936
00945 void setTimeInMillis( double millis, UErrorCode& status );
00946
00956 void complete(UErrorCode& status);
00957
00966 int32_t internalGet(EDateFields field) const {return fFields[field];}
00967
00977 void internalSet(EDateFields field, int32_t value);
00978
00979 protected:
00984 UBool fIsTimeSet;
00985
00996 UBool fAreFieldsSet;
00997
01003 UBool fAreAllFieldsSet;
01004
01011 UDate internalGetTime(void) const { return fTime; }
01012
01020 void internalSetTime(UDate time) { fTime = time; }
01021
01026 int32_t fFields[FIELD_COUNT];
01027
01032 UBool fIsSet[FIELD_COUNT];
01033
01037 enum {
01038 kUnset = 0,
01039 kInternallySet,
01040 kMinimumUserStamp
01041 };
01042
01049 int32_t fStamp[FIELD_COUNT];
01050
01051 private:
01052
01053
01054 int32_t fNextStamp;
01055
01059 UDate fTime;
01060
01064 UBool fLenient;
01065
01070 TimeZone* fZone;
01071
01080 EDaysOfWeek fFirstDayOfWeek;
01081 uint8_t fMinimalDaysInFirstWeek;
01082
01092 void setWeekCountData(const Locale& desiredLocale, UErrorCode& success);
01093
01103 void updateTime(UErrorCode& status);
01104
01108 static const char kDateTimeElements[];
01109 };
01110
01111
01112
01113 inline Calendar*
01114 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
01115 {
01116
01117 return createInstance(zone, Locale::getDefault(), errorCode);
01118 }
01119
01120
01121
01122 inline void
01123 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
01124 {
01125 roll(field, (int32_t)(up ? +1 : -1), status);
01126 }
01127
01128
01129
01134 inline void
01135 Calendar::internalSet(EDateFields field, int32_t value)
01136 {
01137 fFields[field] = value;
01138 }
01139
01140 U_NAMESPACE_END
01141
01142 #endif // _CALENDAR