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
00035 U_NAMESPACE_BEGIN
00036
00147 class U_I18N_API Calendar : public UObject {
00148 public:
00149
00156 enum EDateFields {
00157 ERA,
00158 YEAR,
00159 MONTH,
00160 WEEK_OF_YEAR,
00161 WEEK_OF_MONTH,
00162 DATE,
00163 DAY_OF_YEAR,
00164 DAY_OF_WEEK,
00165 DAY_OF_WEEK_IN_MONTH,
00166 AM_PM,
00167 HOUR,
00168 HOUR_OF_DAY,
00169 MINUTE,
00170 SECOND,
00171 MILLISECOND,
00172 ZONE_OFFSET,
00173 DST_OFFSET,
00174
00175 YEAR_WOY,
00176 DOW_LOCAL,
00177 FIELD_COUNT,
00178
00179 DAY_OF_MONTH = DATE
00180 };
00181
00188 enum EDaysOfWeek {
00189 SUNDAY = 1,
00190 MONDAY,
00191 TUESDAY,
00192 WEDNESDAY,
00193 THURSDAY,
00194 FRIDAY,
00195 SATURDAY
00196 };
00197
00202 enum EMonths {
00203 JANUARY,
00204 FEBRUARY,
00205 MARCH,
00206 APRIL,
00207 MAY,
00208 JUNE,
00209 JULY,
00210 AUGUST,
00211 SEPTEMBER,
00212 OCTOBER,
00213 NOVEMBER,
00214 DECEMBER,
00215 UNDECIMBER
00216 };
00217
00222 enum EAmpm {
00223 AM,
00224 PM
00225 };
00226
00231 virtual ~Calendar();
00232
00239 virtual Calendar* clone(void) const = 0;
00240
00251 static Calendar* createInstance(UErrorCode& success);
00252
00265 static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success);
00266
00278 static Calendar* createInstance(const TimeZone& zone, UErrorCode& success);
00279
00290 static Calendar* createInstance(const Locale& aLocale, UErrorCode& success);
00291
00305 static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00306
00319 static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00320
00330 static const Locale* getAvailableLocales(int32_t& count);
00331
00339 static UDate getNow(void);
00340
00354 inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); }
00355
00366 inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00367
00379 virtual UBool operator==(const Calendar& that) const;
00380
00389 UBool operator!=(const Calendar& that) const {return !operator==(that);}
00390
00401 virtual UBool isEquivalentTo(const Calendar& other) const;
00402
00417 UBool equals(const Calendar& when, UErrorCode& status) const;
00418
00432 UBool before(const Calendar& when, UErrorCode& status) const;
00433
00447 UBool after(const Calendar& when, UErrorCode& status) const;
00448
00466 virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00467
00491 void roll(EDateFields field, UBool up, UErrorCode& status);
00492
00515 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0;
00516
00572 virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00573
00582 void adoptTimeZone(TimeZone* value);
00583
00591 void setTimeZone(const TimeZone& zone);
00592
00601 const TimeZone& getTimeZone(void) const;
00602
00611 TimeZone* orphanTimeZone(void);
00612
00621 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00622
00635 void setLenient(UBool lenient);
00636
00643 UBool isLenient(void) const;
00644
00651 void setFirstDayOfWeek(EDaysOfWeek value);
00652
00659 EDaysOfWeek getFirstDayOfWeek(void) const;
00660
00670 void setMinimalDaysInFirstWeek(uint8_t value);
00671
00681 uint8_t getMinimalDaysInFirstWeek(void) const;
00682
00691 virtual int32_t getMinimum(EDateFields field) const = 0;
00692
00701 virtual int32_t getMaximum(EDateFields field) const = 0;
00702
00711 virtual int32_t getGreatestMinimum(EDateFields field) const = 0;
00712
00721 virtual int32_t getLeastMaximum(EDateFields field) const = 0;
00722
00737 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00738
00755 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00756
00770 int32_t get(EDateFields field, UErrorCode& status) const;
00771
00780 UBool isSet(EDateFields field) const;
00781
00789 void set(EDateFields field, int32_t value);
00790
00801 void set(int32_t year, int32_t month, int32_t date);
00802
00815 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
00816
00830 void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
00831
00838 void clear(void);
00839
00848 void clear(EDateFields field);
00849
00865 virtual UClassID getDynamicClassID(void) const = 0;
00866
00867 protected:
00868
00877 Calendar(UErrorCode& success);
00878
00885 Calendar(const Calendar& source);
00886
00893 Calendar& operator=(const Calendar& right);
00894
00905 Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success);
00906
00916 Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00917
00926 virtual void computeTime(UErrorCode& status) = 0;
00927
00939 virtual void computeFields(UErrorCode& status) = 0;
00940
00950 double getTimeInMillis(UErrorCode& status) const;
00951
00960 void setTimeInMillis( double millis, UErrorCode& status );
00961
00971 void complete(UErrorCode& status);
00972
00981 int32_t internalGet(EDateFields field) const {return fFields[field];}
00982
00992 void internalSet(EDateFields field, int32_t value);
00993
00994 protected:
00999 UBool fIsTimeSet;
01000
01011 UBool fAreFieldsSet;
01012
01018 UBool fAreAllFieldsSet;
01019
01026 UDate internalGetTime(void) const { return fTime; }
01027
01035 void internalSetTime(UDate time) { fTime = time; }
01036
01041 int32_t fFields[FIELD_COUNT];
01042
01047 UBool fIsSet[FIELD_COUNT];
01048
01052 enum {
01053 kUnset = 0,
01054 kInternallySet,
01055 kMinimumUserStamp
01056 };
01057
01064 int32_t fStamp[FIELD_COUNT];
01065
01066 private:
01067
01068
01069 int32_t fNextStamp;
01070
01074 UDate fTime;
01075
01079 UBool fLenient;
01080
01085 TimeZone* fZone;
01086
01095 EDaysOfWeek fFirstDayOfWeek;
01096 uint8_t fMinimalDaysInFirstWeek;
01097
01107 void setWeekCountData(const Locale& desiredLocale, UErrorCode& success);
01108
01118 void updateTime(UErrorCode& status);
01119
01123 static const char kDateTimeElements[];
01124 };
01125
01126
01127
01128 inline Calendar*
01129 Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode)
01130 {
01131
01132 return createInstance(zone, Locale::getDefault(), errorCode);
01133 }
01134
01135
01136
01137 inline void
01138 Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
01139 {
01140 roll(field, (int32_t)(up ? +1 : -1), status);
01141 }
01142
01143
01144
01149 inline void
01150 Calendar::internalSet(EDateFields field, int32_t value)
01151 {
01152 fFields[field] = value;
01153 }
01154
01155 U_NAMESPACE_END
01156
01157 #endif
01158
01159 #endif // _CALENDAR