00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 ) const { return 1; }
00580
00586 virtual void computeFields(UErrorCode& status);
00587
00597 virtual void computeTime(UErrorCode& status);
00598
00599 private:
00600 GregorianCalendar();
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
00768 UDate fGregorianCutover;
00769
00775 UDate fNormalizedGregorianCutover;
00776
00781 int32_t fGregorianCutoverYear;
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:
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
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
00948
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
00958
00959 #endif // _GREGOCAL
00960
00961