Main Page | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

calendar.h

00001 /*
00002 ********************************************************************************
00003 *   Copyright (C) 1997-2003, International Business Machines
00004 *   Corporation and others.  All Rights Reserved.
00005 ********************************************************************************
00006 *
00007 * File CALENDAR.H
00008 *
00009 * Modification History:
00010 *
00011 *   Date        Name        Description
00012 *   04/22/97    aliu        Expanded and corrected comments and other header
00013 *                           contents.
00014 *   05/01/97    aliu        Made equals(), before(), after() arguments const.
00015 *   05/20/97    aliu        Replaced fAreFieldsSet with fAreFieldsInSync and
00016 *                           fAreAllFieldsSet.
00017 *   07/27/98    stephen     Sync up with JDK 1.2
00018 *   11/15/99    weiv        added YEAR_WOY and DOW_LOCAL
00019 *                           to EDateFields
00020 *    8/19/2002  srl         Removed Javaisms
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,                  // Example: 0..1
00170         YEAR,                 // Example: 1..big number
00171         MONTH,                // Example: 0..11
00172         WEEK_OF_YEAR,         // Example: 1..53
00173         WEEK_OF_MONTH,        // Example: 1..4
00174         DATE,                 // Example: 1..31
00175         DAY_OF_YEAR,          // Example: 1..365
00176         DAY_OF_WEEK,          // Example: 1..7
00177         DAY_OF_WEEK_IN_MONTH, // Example: 1..4, may be specified as -1
00178         AM_PM,                // Example: 0..1
00179         HOUR,                 // Example: 0..11
00180         HOUR_OF_DAY,          // Example: 0..23
00181         MINUTE,               // Example: 0..59
00182         SECOND,               // Example: 0..59
00183         MILLISECOND,          // Example: 0..999
00184         ZONE_OFFSET,          // Example: -12*U_MILLIS_PER_HOUR..12*U_MILLIS_PER_HOUR
00185         DST_OFFSET,           // Example: 0 or U_MILLIS_PER_HOUR
00186 // here will go names for 'Y' and 'e'
00187         YEAR_WOY,  // 'Y' Example: 1..big number
00188         DOW_LOCAL, // 'e' Example: 1..7
00189         FIELD_COUNT,
00190 
00191         DAY_OF_MONTH = DATE   // Synonyms
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     // The next available value for stampp[]
01373     int32_t fNextStamp;// = MINIMUM_USER_STAMP;
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     // since the Locale isn't specified, use the default locale
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 /* #if !UCONFIG_NO_FORMATTING */
01551 
01552 #endif // _CALENDAR

Generated on Wed Sep 3 17:47:08 2003 for ICU 2.6 by doxygen 1.3.2