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

gregocal.h

00001 /*
00002 * Copyright (C) {1997-2003}, International Business Machines Corporation and others. All Rights Reserved.
00003 ********************************************************************************
00004 *
00005 * File GREGOCAL.H
00006 *
00007 * Modification History:
00008 *
00009 *   Date        Name        Description
00010 *   04/22/97    aliu        Overhauled header.
00011 *    07/28/98    stephen        Sync with JDK 1.2
00012 *    09/04/98    stephen        Re-sync with JDK 8/31 putback
00013 *    09/14/98    stephen        Changed type of kOneDay, kOneWeek to double.
00014 *                            Fixed bug in roll()
00015 *   10/15/99    aliu        Fixed j31, incorrect WEEK_OF_YEAR computation.
00016 *                           Added documentation of WEEK_OF_YEAR computation.
00017 *   10/15/99    aliu        Fixed j32, cannot set date to Feb 29 2000 AD.
00018 *                           {JDK bug 4210209 4209272}
00019 ********************************************************************************
00020 */
00021 
00022 #ifndef GREGOCAL_H
00023 #define GREGOCAL_H
00024 
00025 #include "unicode/utypes.h"
00026 
00027 #if !UCONFIG_NO_FORMATTING
00028 
00029 #include "unicode/calendar.h"
00030 
00031 U_NAMESPACE_BEGIN
00032 
00139 class U_I18N_API GregorianCalendar: public Calendar {
00140 public:
00141 
00146     enum EEras {
00147         BC,
00148         AD
00149     };
00150 
00159     GregorianCalendar(UErrorCode& success);
00160 
00171     GregorianCalendar(TimeZone* zoneToAdopt, UErrorCode& success);
00172 
00182     GregorianCalendar(const TimeZone& zone, UErrorCode& success);
00183 
00193     GregorianCalendar(const Locale& aLocale, UErrorCode& success);
00194 
00206     GregorianCalendar(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00207 
00218     GregorianCalendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00219 
00232     GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& success);
00233 
00248     GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& success);
00249 
00265     GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second, UErrorCode& success);
00266 
00271     virtual ~GregorianCalendar();
00272 
00278     GregorianCalendar(const GregorianCalendar& source);
00279 
00285     GregorianCalendar& operator=(const GregorianCalendar& right);
00286 
00292     virtual Calendar* clone(void) const;
00293 
00303     void setGregorianChange(UDate date, UErrorCode& success);
00304 
00313     UDate getGregorianChange(void) const;
00314 
00330     UBool isLeapYear(int32_t year) const;
00331 
00339     virtual UBool isEquivalentTo(const Calendar& other) const;
00340 
00353     virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00354 
00367     virtual void add(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00368 
00380     virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00381 
00393     virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00394 
00402     virtual int32_t getMinimum(EDateFields field) const;
00403 
00411     virtual int32_t getMinimum(UCalendarDateFields field) const;
00412 
00420     virtual int32_t getMaximum(EDateFields field) const;
00421 
00429     virtual int32_t getMaximum(UCalendarDateFields field) const;
00430 
00439     virtual int32_t getGreatestMinimum(EDateFields field) const;
00440 
00449     virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
00450 
00459     virtual int32_t getLeastMaximum(EDateFields field) const;
00460 
00469     virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
00470 
00478     int32_t getActualMinimum(EDateFields field) const;
00479 
00487     int32_t getActualMinimum(UCalendarDateFields field) const;
00488 
00498     int32_t getActualMaximum(EDateFields field) const;
00499 
00509     int32_t getActualMaximum(UCalendarDateFields field) const;
00510 
00520     virtual UBool inDaylightTime(UErrorCode& status) const;
00521 
00522 public:
00523 
00534     virtual UClassID getDynamicClassID(void) const;
00535 
00547     static inline UClassID getStaticClassID(void);
00548 
00555     virtual const char * getType() const;
00556 
00557 protected:
00558 
00564     virtual int32_t getGregorianYear(UErrorCode &status) const;
00565 
00571     virtual inline int32_t getDefaultMonthInYear() const { return 0; }
00572 
00573 
00579     virtual inline int32_t getDefaultDayInMonth(int32_t /*month*/) const { return 1; }
00580 
00586     virtual void computeFields(UErrorCode& status);
00587 
00597     virtual void computeTime(UErrorCode& status);
00598 
00599  private:
00600     GregorianCalendar(); // default constructor not implemented
00601 
00602  protected:
00609     virtual int32_t internalGetEra() const;
00610 
00617     virtual int32_t monthLength(int32_t month) const;
00618 
00626     virtual int32_t monthLength(int32_t month, int32_t year) const;
00627     
00634     int32_t yearLength(int32_t year) const;
00635     
00641     int32_t yearLength(void) const;
00642 
00650     void pinDayOfMonth(void);
00651 
00659     virtual UDate getEpochDay(UErrorCode& status);
00660 
00672     virtual void timeToFields(UDate theTime, UBool quick, UErrorCode& status);
00673 
00674  private:
00682     static double computeJulianDayOfYear(UBool isGregorian, int32_t year,
00683                                          UBool& isLeap);
00684     
00691     int32_t computeRelativeDOW() const;
00692     
00699     int32_t computeRelativeDOW(double julianDay) const;
00700 
00709     int32_t computeDOYfromWOY(double julianDayOfYear) const;
00710 
00719     double computeJulianDay(UBool isGregorian, int32_t year);
00720 
00721 
00736     int32_t weekNumber(int32_t date, int32_t day);
00737 
00742     UBool validateFields(void) const;
00743 
00747     UBool boundsCheck(int32_t value, UCalendarDateFields field) const;
00748 
00758     int32_t aggregateStamp(int32_t stamp_a, int32_t stamp_b);
00759 
00767     // This is measured from the standard epoch, not in Julian Days.
00768     UDate                fGregorianCutover;
00769 
00775     UDate                 fNormalizedGregorianCutover;// = gregorianCutover;
00776 
00781     int32_t fGregorianCutoverYear;// = 1582;
00782 
00783     static const char fgClassID;
00784 
00792     static double millisToJulianDay(UDate millis);
00793 
00801     static UDate julianDayToMillis(double julian);
00802 
00811     static uint8_t julianDayToDayOfWeek(double julian);
00812 
00823     static double floorDivide(double numerator, double denominator);
00824 
00835     static int32_t floorDivide(int32_t numerator, int32_t denominator);
00836 
00851     static int32_t floorDivide(int32_t numerator, int32_t denominator, int32_t remainder[]);
00852 
00867     static int32_t floorDivide(double numerator, int32_t denominator, int32_t remainder[]);
00868 
00869  public: // internal implementation
00870 
00875     virtual UBool haveDefaultCentury() const;
00876 
00881     virtual UDate defaultCenturyStart() const;
00882 
00887     virtual int32_t defaultCenturyStartYear() const;
00888 
00889  private:
00896     static UDate         fgSystemDefaultCenturyStart;
00897 
00901     static int32_t          fgSystemDefaultCenturyStartYear;
00902 
00906     static const int32_t    fgSystemDefaultCenturyYear;
00907 
00911     //static const UDate        fgSystemDefaultCentury;
00912 
00919     UDate         internalGetDefaultCenturyStart(void) const;
00920 
00927     int32_t          internalGetDefaultCenturyStartYear(void) const;
00928 
00933     static void  initializeSystemDefaultCentury(void);
00934 
00935 };
00936 
00937 inline UClassID
00938 GregorianCalendar::getStaticClassID(void)
00939 { return (UClassID)&fgClassID; }
00940 
00941 inline UClassID
00942 GregorianCalendar::getDynamicClassID(void) const
00943 { return GregorianCalendar::getStaticClassID(); }
00944 
00945 inline uint8_t GregorianCalendar::julianDayToDayOfWeek(double julian)
00946 {
00947   // If julian is negative, then julian%7 will be negative, so we adjust
00948   // accordingly.  We add 1 because Julian day 0 is Monday.
00949   int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7);
00950 
00951   uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7 + UCAL_SUNDAY) : UCAL_SUNDAY));
00952   return result;
00953 }
00954 
00955 U_NAMESPACE_END
00956 
00957 #endif /* #if !UCONFIG_NO_FORMATTING */
00958 
00959 #endif // _GREGOCAL
00960 //eof
00961 

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