/* ******************************************************************************** * Copyright (C) 1997-1999, International Business Machines * Corporation and others. All Rights Reserved. ******************************************************************************** * * File CALENDAR.H * * Modification History: * * Date Name Description * 04/22/97 aliu Expanded and corrected comments and other header * contents. * 05/01/97 aliu Made equals(), before(), after() arguments const. * 05/20/97 aliu Replaced fAreFieldsSet with fAreFieldsInSync and * fAreAllFieldsSet. * 07/27/98 stephen Sync up with JDK 1.2 * 11/15/99 weiv added YEAR_WOY and DOW_LOCAL * to EDateFields ******************************************************************************** */ #ifndef CALENDAR_H #define CALENDAR_H #include "unicode/locid.h" #include "unicode/timezone.h" class U_I18N_API Calendar { public: enum EDateFields { ERA, // Example: 0..1 YEAR, // Example: 1..big number MONTH, // Example: 0..11 WEEK_OF_YEAR, // Example: 1..53 WEEK_OF_MONTH, // Example: 1..4 DATE, // Example: 1..31 DAY_OF_YEAR, // Example: 1..365 DAY_OF_WEEK, // Example: 1..7 DAY_OF_WEEK_IN_MONTH, // Example: 1..4, may be specified as -1 AM_PM, // Example: 0..1 HOUR, // Example: 0..11 HOUR_OF_DAY, // Example: 0..23 MINUTE, // Example: 0..59 SECOND, // Example: 0..59 MILLISECOND, // Example: 0..999 ZONE_OFFSET, // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR DST_OFFSET, // Example: 0 or U_MILLIS_PER_HOUR // here will go names for 'Y' and 'e' YEAR_WOY, // 'Y' Example: 1..big number DOW_LOCAL, // 'e' Example: 1..7 FIELD_COUNT, DAY_OF_MONTH = DATE // Synonyms }; enum EDaysOfWeek { SUNDAY = 1, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY }; enum EMonths { JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER, UNDECIMBER }; enum EAmpm { AM, PM }; virtual ~Calendar(); virtual Calendar* clone(void) const = 0; static Calendar* createInstance(UErrorCode& success); static Calendar* createInstance(TimeZone* zoneToAdopt, UErrorCode& success); static Calendar* createInstance(const TimeZone& zone, UErrorCode& success); static Calendar* createInstance(const Locale& aLocale, UErrorCode& success); static Calendar* createInstance(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success); static Calendar* createInstance(const TimeZone& zoneToAdopt, const Locale& aLocale, UErrorCode& success); static const Locale* getAvailableLocales(int32_t& count); static UDate getNow(void); inline UDate getTime(UErrorCode& status) const { return getTimeInMillis(status); } inline void setTime(UDate date, UErrorCode& status) { setTimeInMillis(date, status); } virtual UBool operator==(const Calendar& that) const; UBool operator!=(const Calendar& that) const {return !operator==(that);} UBool equals(const Calendar& when, UErrorCode& status) const; UBool before(const Calendar& when, UErrorCode& status) const; UBool after(const Calendar& when, UErrorCode& status) const; virtual UBool equivalentTo(const Calendar& other) const; virtual void add(EDateFields field, int32_t amount, UErrorCode& status) = 0; void roll(EDateFields field, UBool up, UErrorCode& status); virtual void roll(EDateFields field, int32_t amount, UErrorCode& status) = 0; void adoptTimeZone(TimeZone* value); void setTimeZone(const TimeZone& zone); const TimeZone& getTimeZone(void) const; TimeZone* orphanTimeZone(void); virtual UBool inDaylightTime(UErrorCode& status) const = 0; void setLenient(UBool lenient); UBool isLenient(void) const; void setFirstDayOfWeek(EDaysOfWeek value); EDaysOfWeek getFirstDayOfWeek(void) const; void setMinimalDaysInFirstWeek(uint8_t value); uint8_t getMinimalDaysInFirstWeek(void) const; virtual int32_t getMinimum(EDateFields field) const = 0; virtual int32_t getMaximum(EDateFields field) const = 0; virtual int32_t getGreatestMinimum(EDateFields field) const = 0; virtual int32_t getLeastMaximum(EDateFields field) const = 0; int32_t getActualMinimum(EDateFields field, UErrorCode& status) const; int32_t getActualMaximum(EDateFields field, UErrorCode& status) const; int32_t get(EDateFields field, UErrorCode& status) const; UBool isSet(EDateFields field) const; void set(EDateFields field, int32_t value); void set(int32_t year, int32_t month, int32_t date); void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute); void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second); void clear(void); void clear(EDateFields field); virtual UClassID getDynamicClassID(void) const = 0; protected: Calendar(UErrorCode& success); Calendar(const Calendar& source); Calendar& operator=(const Calendar& right); Calendar(TimeZone* zone, const Locale& aLocale, UErrorCode& success); Calendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success); virtual void computeTime(UErrorCode& status) = 0; virtual void computeFields(UErrorCode& status) = 0; double getTimeInMillis(UErrorCode& status) const; void setTimeInMillis( double millis, UErrorCode& status ); void complete(UErrorCode& status); int32_t internalGet(EDateFields field) const {return fFields[field];} void internalSet(EDateFields field, int32_t value); protected: UBool fIsTimeSet; UBool fAreFieldsSet; UBool fAreAllFieldsSet; UDate internalGetTime(void) const { return fTime; } void internalSetTime(UDate time) { fTime = time; } int32_t fFields[FIELD_COUNT]; UBool fIsSet[FIELD_COUNT]; // Special values of stamp[] enum { kUnset = 0, kInternallySet, kMinimumUserStamp }; int32_t fStamp[FIELD_COUNT]; private: // The next available value for stampp[] int32_t fNextStamp;// = MINIMUM_USER_STAMP; UDate fTime; UBool fLenient; TimeZone* fZone; EDaysOfWeek fFirstDayOfWeek; uint8_t fMinimalDaysInFirstWeek; void setWeekCountData(const Locale& desiredLocale, UErrorCode& success); void updateTime(UErrorCode& status); static int32_t stringToDayNumber(const UnicodeString& string, UErrorCode& status); static const char* kDateTimeElements; }; // ------------------------------------- inline Calendar* Calendar::createInstance(TimeZone* zone, UErrorCode& errorCode) { // since the Locale isn't specified, use the default locale return createInstance(zone, Locale::getDefault(), errorCode); } // ------------------------------------- inline void Calendar::roll(EDateFields field, UBool up, UErrorCode& status) { roll(field, (int32_t)(up ? +1 : -1), status); } // ------------------------------------- inline void Calendar::internalSet(EDateFields field, int32_t value) { fFields[field] = value; } #endif // _CALENDAR