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
00026 #include "unicode/calendar.h"
00027
00028 U_NAMESPACE_BEGIN
00029
00136 class U_I18N_API GregorianCalendar: public Calendar {
00137 public:
00138
00143 enum EEras {
00144 BC,
00145 AD
00146 };
00147
00156 GregorianCalendar(UErrorCode& success);
00157
00168 GregorianCalendar(TimeZone* zoneToAdopt, UErrorCode& success);
00169
00179 GregorianCalendar(const TimeZone& zone, UErrorCode& success);
00180
00190 GregorianCalendar(const Locale& aLocale, UErrorCode& success);
00191
00203 GregorianCalendar(TimeZone* zoneToAdopt, const Locale& aLocale, UErrorCode& success);
00204
00215 GregorianCalendar(const TimeZone& zone, const Locale& aLocale, UErrorCode& success);
00216
00229 GregorianCalendar(int32_t year, int32_t month, int32_t date, UErrorCode& success);
00230
00245 GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, UErrorCode& success);
00246
00262 GregorianCalendar(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second, UErrorCode& success);
00263
00268 virtual ~GregorianCalendar();
00269
00275 GregorianCalendar(const GregorianCalendar& source);
00276
00282 GregorianCalendar& operator=(const GregorianCalendar& right);
00283
00289 virtual Calendar* clone(void) const;
00290
00300 void setGregorianChange(UDate date, UErrorCode& success);
00301
00310 UDate getGregorianChange(void) const;
00311
00327 UBool isLeapYear(int32_t year) const;
00328
00339 virtual UBool operator==(const Calendar& that) const;
00340
00353 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00354
00366 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00367
00375 virtual int32_t getMinimum(EDateFields field) const;
00376
00384 virtual int32_t getMaximum(EDateFields field) const;
00385
00394 virtual int32_t getGreatestMinimum(EDateFields field) const;
00395
00404 virtual int32_t getLeastMaximum(EDateFields field) const;
00405
00413 int32_t getActualMinimum(EDateFields field) const;
00414
00424 int32_t getActualMaximum(EDateFields field) const;
00425
00435 virtual UBool inDaylightTime(UErrorCode& status) const;
00436
00437 public:
00438
00449 virtual UClassID getDynamicClassID(void) const { return (UClassID)&fgClassID; }
00450
00462 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00463
00464 protected:
00465
00471 virtual void computeFields(UErrorCode& status);
00472
00482 virtual void computeTime(UErrorCode& status);
00483
00484 private:
00485
00491 int32_t internalGetEra() const;
00492
00498 int32_t monthLength(int32_t month) const;
00499
00506 int32_t monthLength(int32_t month, int32_t year) const;
00507
00513 int32_t yearLength(int32_t year) const;
00514
00519 int32_t yearLength(void) const;
00520
00527 void pinDayOfMonth(void);
00528
00535 UDate getEpochDay(UErrorCode& status);
00536
00544 static double computeJulianDayOfYear(UBool isGregorian, int32_t year,
00545 UBool& isLeap);
00546
00553 int32_t computeRelativeDOW() const;
00554
00561 int32_t computeRelativeDOW(double julianDay) const;
00562
00571 int32_t computeDOYfromWOY(double julianDayOfYear) const;
00572
00581 double computeJulianDay(UBool isGregorian, int32_t year);
00582
00593 void timeToFields(UDate theTime, UBool quick, UErrorCode& status);
00594
00595
00610 int32_t weekNumber(int32_t date, int32_t day);
00611
00616 UBool validateFields(void) const;
00617
00621 UBool boundsCheck(int32_t value, EDateFields field) const;
00622
00632 int32_t aggregateStamp(int32_t stamp_a, int32_t stamp_b);
00633
00641
00642 UDate fGregorianCutover;
00643
00649 UDate fNormalizedGregorianCutover;
00650
00655 int32_t fGregorianCutoverYear;
00656
00657 static const char fgClassID;
00658
00666 static double millisToJulianDay(UDate millis);
00667
00675 static UDate julianDayToMillis(double julian);
00676
00685 static uint8_t julianDayToDayOfWeek(double julian);
00686
00697 static double floorDivide(double numerator, double denominator);
00698
00709 static int32_t floorDivide(int32_t numerator, int32_t denominator);
00710
00725 static int32_t floorDivide(int32_t numerator, int32_t denominator, int32_t remainder[]);
00726
00741 static int32_t floorDivide(double numerator, int32_t denominator, int32_t remainder[]);
00742
00743 };
00744
00745
00746 inline uint8_t GregorianCalendar::julianDayToDayOfWeek(double julian)
00747 {
00748
00749
00750 int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7);
00751
00752 uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7 + SUNDAY) : SUNDAY));
00753 return result;
00754 }
00755
00756 U_NAMESPACE_END
00757
00758 #endif // _GREGOCAL
00759
00760