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
00274 GregorianCalendar(const GregorianCalendar& source);
00275
00280 GregorianCalendar& operator=(const GregorianCalendar& right);
00281
00286 virtual Calendar* clone(void) const;
00287
00297 void setGregorianChange(UDate date, UErrorCode& success);
00298
00307 UDate getGregorianChange(void) const;
00308
00324 UBool isLeapYear(int32_t year) const;
00325
00336 virtual UBool operator==(const Calendar& that) const;
00337
00344 virtual UBool equivalentTo(const Calendar& other) const;
00345
00358 virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00359
00371 virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00372
00378 virtual int32_t getMinimum(EDateFields field) const;
00379
00385 virtual int32_t getMaximum(EDateFields field) const;
00386
00392 virtual int32_t getGreatestMinimum(EDateFields field) const;
00393
00399 virtual int32_t getLeastMaximum(EDateFields field) const;
00400
00406 int32_t getActualMinimum(EDateFields field) const;
00407
00415 int32_t getActualMaximum(EDateFields field) const;
00416
00426 virtual UBool inDaylightTime(UErrorCode& status) const;
00427
00428 public:
00429
00440 virtual UClassID getDynamicClassID(void) const { return (UClassID)&fgClassID; }
00441
00453 static UClassID getStaticClassID(void) { return (UClassID)&fgClassID; }
00454
00455 protected:
00456
00461 virtual void computeFields(UErrorCode& status);
00462
00472 virtual void computeTime(UErrorCode& status);
00473
00474 private:
00475
00480 int32_t internalGetEra() const;
00481
00482 int32_t monthLength(int32_t month) const;
00483 int32_t monthLength(int32_t month, int32_t year) const;
00484
00485 int32_t yearLength(int32_t year) const;
00486
00487 int32_t yearLength(void) const;
00488
00495 void pinDayOfMonth(void);
00496
00501 UDate getEpochDay(UErrorCode& status);
00502
00503 static double computeJulianDayOfYear(UBool isGregorian, int32_t year,
00504 UBool& isLeap);
00505
00506 int32_t computeRelativeDOW() const;
00507
00508 int32_t computeRelativeDOW(double julianDay) const;
00509
00510 int32_t computeDOYfromWOY(double julianDayOfYear) const;
00511
00520 double computeJulianDay(UBool isGregorian, int32_t year);
00521
00531 void timeToFields(UDate theTime, UBool quick, UErrorCode& status);
00532
00533
00548 int32_t weekNumber(int32_t date, int32_t day);
00549
00553 UBool validateFields(void) const;
00554
00558 UBool boundsCheck(int32_t value, EDateFields field) const;
00559
00566 int32_t aggregateStamp(int32_t stamp_a, int32_t stamp_b);
00567
00575
00576 UDate fGregorianCutover;
00577
00583 UDate fNormalizedGregorianCutover;
00584
00589 int32_t fGregorianCutoverYear;
00590
00591 static const char fgClassID;
00592
00600 static double millisToJulianDay(UDate millis);
00601
00609 static UDate julianDayToMillis(double julian);
00610
00618 static uint8_t julianDayToDayOfWeek(double julian);
00619
00630 static double floorDivide(double numerator, double denominator);
00631
00642 static int32_t floorDivide(int32_t numerator, int32_t denominator);
00643
00658 static int32_t floorDivide(int32_t numerator, int32_t denominator, int32_t remainder[]);
00659
00674 static int32_t floorDivide(double numerator, int32_t denominator, int32_t remainder[]);
00675
00676 };
00677
00678
00679 inline uint8_t GregorianCalendar::julianDayToDayOfWeek(double julian)
00680 {
00681
00682
00683 int8_t dayOfWeek = (int8_t) uprv_fmod(julian + 1, 7);
00684
00685 uint8_t result = (uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7 + SUNDAY) : SUNDAY));
00686 return result;
00687 }
00688
00689 U_NAMESPACE_END
00690
00691 #endif // _GREGOCAL
00692
00693