00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
#ifndef CALENDAR_H
00026
#define CALENDAR_H
00027
00028
#include "unicode/utypes.h"
00029
00030
#if !UCONFIG_NO_FORMATTING
00031
00032
#include "unicode/uobject.h"
00033
#include "unicode/locid.h"
00034
#include "unicode/timezone.h"
00035
#include "unicode/ucal.h"
00036
00037
U_NAMESPACE_BEGIN
00038
00039
class ICUServiceFactory;
00040
00044
typedef const void*
URegistryKey;
00045
00049
typedef int32_t UFieldResolutionTable[12][8];
00050
00165
class U_I18N_API Calendar :
public UObject {
00166
public:
00167
00174
enum EDateFields {
00175 ERA,
00176 YEAR,
00177 MONTH,
00178 WEEK_OF_YEAR,
00179 WEEK_OF_MONTH,
00180 DATE,
00181 DAY_OF_YEAR,
00182 DAY_OF_WEEK,
00183 DAY_OF_WEEK_IN_MONTH,
00184 AM_PM,
00185 HOUR,
00186 HOUR_OF_DAY,
00187 MINUTE,
00188 SECOND,
00189 MILLISECOND,
00190 ZONE_OFFSET,
00191 DST_OFFSET,
00192 YEAR_WOY,
00193 DOW_LOCAL,
00194
00195 FIELD_COUNT =
UCAL_FIELD_COUNT
00196 };
00197
00204
enum EDaysOfWeek {
00205 SUNDAY = 1,
00206 MONDAY,
00207 TUESDAY,
00208 WEDNESDAY,
00209 THURSDAY,
00210 FRIDAY,
00211 SATURDAY
00212 };
00213
00218
enum EMonths {
00219 JANUARY,
00220 FEBRUARY,
00221 MARCH,
00222 APRIL,
00223 MAY,
00224 JUNE,
00225 JULY,
00226 AUGUST,
00227 SEPTEMBER,
00228 OCTOBER,
00229 NOVEMBER,
00230 DECEMBER,
00231 UNDECIMBER
00232 };
00233
00238
enum EAmpm {
00239 AM,
00240 PM
00241 };
00242
00247 virtual ~Calendar();
00248
00255
virtual Calendar* clone(
void) const = 0;
00256
00268 static Calendar* createInstance(
UErrorCode& success);
00269
00282 static Calendar* createInstance(
TimeZone* zoneToAdopt, UErrorCode& success);
00283
00295 static Calendar* createInstance(const
TimeZone& zone, UErrorCode& success);
00296
00307 static Calendar* createInstance(const
Locale& aLocale, UErrorCode& success);
00308
00322 static Calendar* createInstance(
TimeZone* zoneToAdopt, const
Locale& aLocale, UErrorCode& success);
00323
00336 static Calendar* createInstance(const
TimeZone& zoneToAdopt, const
Locale& aLocale, UErrorCode& success);
00337
00347 static const
Locale* getAvailableLocales(int32_t& count);
00348
00356 static UDate getNow(
void);
00357
00371 inline UDate getTime(UErrorCode& status)
const {
return getTimeInMillis(status); }
00372
00383
inline void setTime(
UDate date, UErrorCode& status) { setTimeInMillis(date, status); }
00384
00396
virtual UBool operator==(
const Calendar& that)
const;
00397
00406
UBool operator!=(
const Calendar& that)
const {
return !operator==(that);}
00407
00418
virtual UBool isEquivalentTo(
const Calendar& other)
const;
00419
00434
UBool equals(
const Calendar& when, UErrorCode& status)
const;
00435
00449
UBool before(
const Calendar& when, UErrorCode& status)
const;
00450
00464
UBool after(
const Calendar& when, UErrorCode& status)
const;
00465
00483
virtual void add(EDateFields field, int32_t amount, UErrorCode& status);
00484
00502
virtual void add(
UCalendarDateFields field, int32_t amount, UErrorCode& status);
00503
00527
inline void roll(EDateFields field, UBool up, UErrorCode& status);
00528
00552
inline void roll(UCalendarDateFields field, UBool up, UErrorCode& status);
00553
00576
virtual void roll(EDateFields field, int32_t amount, UErrorCode& status);
00577
00600
virtual void roll(UCalendarDateFields field, int32_t amount, UErrorCode& status);
00601
00657
virtual int32_t fieldDifference(UDate when, EDateFields field, UErrorCode& status);
00658
00714
virtual int32_t fieldDifference(UDate when, UCalendarDateFields field, UErrorCode& status);
00715
00724
void adoptTimeZone(
TimeZone* value);
00725
00733
void setTimeZone(
const TimeZone& zone);
00734
00743
const TimeZone& getTimeZone(
void) const;
00744
00753
TimeZone* orphanTimeZone(
void);
00754
00763 virtual UBool inDaylightTime(UErrorCode& status) const = 0;
00764
00777
void setLenient(UBool lenient);
00778
00785 UBool isLenient(
void) const;
00786
00793
void setFirstDayOfWeek(EDaysOfWeek value);
00794
00801
void setFirstDayOfWeek(
UCalendarDaysOfWeek value);
00802
00809 EDaysOfWeek getFirstDayOfWeek(
void) const;
00810
00818 UCalendarDaysOfWeek getFirstDayOfWeek(UErrorCode &status) const;
00819
00829
void setMinimalDaysInFirstWeek(
uint8_t value);
00830
00840 uint8_t getMinimalDaysInFirstWeek(
void) const;
00841
00850 virtual int32_t getMinimum(EDateFields field) const;
00851
00860 virtual int32_t getMinimum(UCalendarDateFields field) const;
00861
00870 virtual int32_t getMaximum(EDateFields field) const;
00871
00880 virtual int32_t getMaximum(UCalendarDateFields field) const;
00881
00890 virtual int32_t getGreatestMinimum(EDateFields field) const;
00891
00900 virtual int32_t getGreatestMinimum(UCalendarDateFields field) const;
00901
00910 virtual int32_t getLeastMaximum(EDateFields field) const;
00911
00920 virtual int32_t getLeastMaximum(UCalendarDateFields field) const;
00921
00936 int32_t getActualMinimum(EDateFields field, UErrorCode& status) const;
00937
00952 int32_t getActualMinimum(UCalendarDateFields field, UErrorCode& status) const;
00953
00970 int32_t getActualMaximum(EDateFields field, UErrorCode& status) const;
00971
00988 int32_t getActualMaximum(UCalendarDateFields field, UErrorCode& status) const;
00989
01003 int32_t get(EDateFields field, UErrorCode& status) const;
01004
01018 int32_t get(UCalendarDateFields field, UErrorCode& status) const;
01019
01028 UBool isSet(EDateFields field) const;
01029
01038 UBool isSet(UCalendarDateFields field) const;
01039
01047
void set(EDateFields field, int32_t value);
01048
01056
void set(UCalendarDateFields field, int32_t value);
01057
01068
void set(int32_t year, int32_t month, int32_t date);
01069
01082
void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute);
01083
01097
void set(int32_t year, int32_t month, int32_t date, int32_t hour, int32_t minute, int32_t second);
01098
01105
void clear(
void);
01106
01115
void clear(EDateFields field);
01116
01125
void clear(UCalendarDateFields field);
01126
01142 virtual UClassID getDynamicClassID(
void) const = 0;
01143
01152 virtual const
char * getType() const = 0;
01153
01154 protected:
01155
01164 Calendar(UErrorCode& success);
01165
01172 Calendar(const Calendar& source);
01173
01180 Calendar& operator=(const Calendar& right);
01181
01192 Calendar(
TimeZone* zone, const
Locale& aLocale, UErrorCode& success);
01193
01203 Calendar(const
TimeZone& zone, const
Locale& aLocale, UErrorCode& success);
01204
01213 virtual
void computeTime(UErrorCode& status);
01214
01226 virtual
void computeFields(UErrorCode& status);
01227
01237
double getTimeInMillis(UErrorCode& status) const;
01238
01247
void setTimeInMillis(
double millis, UErrorCode& status );
01248
01258
void complete(UErrorCode& status);
01259
01268 inline int32_t internalGet(EDateFields field)
const {
return fFields[field];}
01269
01280
inline int32_t internalGet(UCalendarDateFields field, int32_t defaultValue)
const {
return fStamp[field]>kUnset ? fFields[field] : defaultValue;}
01281
01290
inline int32_t internalGet(UCalendarDateFields field)
const {
return fFields[field];}
01291
01301
void internalSet(EDateFields field, int32_t value);
01302
01312
inline void internalSet(UCalendarDateFields field, int32_t value);
01313
01320
virtual void prepareGetActual(UCalendarDateFields field, UBool isMinimum, UErrorCode &status);
01321
01326
enum ELimitType {
01327 UCAL_LIMIT_MINIMUM = 0,
01328 UCAL_LIMIT_GREATEST_MINIMUM,
01329 UCAL_LIMIT_LEAST_MAXIMUM,
01330 UCAL_LIMIT_MAXIMUM,
01331 UCAL_LIMIT_COUNT
01332 };
01333
01355
virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType)
const = 0;
01356
01364
virtual int32_t getLimit(UCalendarDateFields field, ELimitType limitType)
const;
01365
01366
01380
virtual int32_t handleComputeMonthStart(int32_t eyear, int32_t month,
01381 UBool useMonth)
const = 0;
01382
01390
virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month)
const ;
01391
01399
virtual int32_t handleGetYearLength(int32_t eyear)
const;
01400
01401
01410
virtual int32_t handleGetExtendedYear() = 0;
01411
01420
virtual int32_t handleComputeJulianDay(UCalendarDateFields bestField);
01421
01430
virtual int32_t handleGetExtendedYearFromWeekFields(int32_t yearWoy, int32_t woy);
01431
01438
int32_t computeJulianDay();
01439
01447
int32_t computeMillisInDay();
01448
01458
int32_t computeZoneOffset(
double millis, int32_t millisInDay, UErrorCode &ec);
01459
01460
01469
int32_t newestStamp(
UCalendarDateFields start, UCalendarDateFields end, int32_t bestSoFar)
const;
01470
01476
enum {
01478 kResolveSTOP = -1,
01480 kResolveRemap = 32
01481 };
01482
01488
static const UFieldResolutionTable kDatePrecedence[];
01489
01495
static const UFieldResolutionTable kYearPrecedence[];
01496
01502
static const UFieldResolutionTable kDOWPrecedence[];
01503
01531
UCalendarDateFields resolveFields(
const UFieldResolutionTable *precedenceTable);
01532
01533
virtual const UFieldResolutionTable* getFieldResolutionTable() const;
01534
01540 UCalendarDateFields newerField(UCalendarDateFields defaultField, UCalendarDateFields alternateField) const;
01541
01542
01543 private:
01552 int32_t getActualHelper(UCalendarDateFields field, int32_t startValue, int32_t endValue, UErrorCode &status) const;
01553
01554
01555 protected:
01560 UBool fIsTimeSet;
01561
01572 UBool fAreFieldsSet;
01573
01579 UBool fAreAllFieldsSet;
01580
01588 UBool fAreFieldsVirtuallySet;
01589
01596 UDate internalGetTime(
void)
const {
return fTime; }
01597
01605
void internalSetTime(UDate time) { fTime = time; }
01606
01611
int32_t fFields[
UCAL_FIELD_COUNT];
01612
01617
UBool fIsSet[
UCAL_FIELD_COUNT];
01618
01622
enum {
01623 kUnset = 0,
01624 kInternallySet,
01625 kMinimumUserStamp
01626 };
01627
01634
int32_t fStamp[
UCAL_FIELD_COUNT];
01635
01660
virtual void handleComputeFields(int32_t julianDay, UErrorCode &status);
01661
01668
int32_t getGregorianYear()
const {
01669
return fGregorianYear;
01670 }
01671
01678
int32_t getGregorianMonth()
const {
01679
return fGregorianMonth;
01680 }
01681
01688
int32_t getGregorianDayOfYear()
const {
01689
return fGregorianDayOfYear;
01690 }
01691
01698
int32_t getGregorianDayOfMonth()
const {
01699
return fGregorianDayOfMonth;
01700 }
01701
01708
virtual int32_t getDefaultMonthInYear() ;
01709
01710
01716
virtual int32_t getDefaultDayInMonth(int32_t );
01717
01718
01719
01720
01721
01722
01752 virtual void pinField(UCalendarDateFields field, UErrorCode& status);
01753
01797
int32_t weekNumber(int32_t desiredDay, int32_t dayOfPeriod, int32_t dayOfWeek);
01798
01799
01830
inline int32_t weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek);
01831
01836
int32_t getLocalDOW();
01837
01838
private:
01839
01843
int32_t fNextStamp;
01844
01848
UDate fTime;
01849
01853
UBool fLenient;
01854
01859
TimeZone* fZone;
01860
01869 UCalendarDaysOfWeek fFirstDayOfWeek;
01870
uint8_t fMinimalDaysInFirstWeek;
01871
01882
void setWeekCountData(
const Locale& desiredLocale,
const char *type, UErrorCode& success);
01883
01893
void updateTime(UErrorCode& status);
01894
01898
static const char kDateTimeElements[];
01899
01903
static const char kDefaultCalendar[];
01904
01905
01910
int32_t fGregorianYear;
01911
01916
int32_t fGregorianMonth;
01917
01922
int32_t fGregorianDayOfYear;
01923
01928
int32_t fGregorianDayOfMonth;
01929
01930
01931
01938
void computeGregorianAndDOWFields(int32_t julianDay, UErrorCode &ec);
01939
01950
void computeGregorianFields(int32_t julianDay, UErrorCode &ec);
01951
01972
void computeWeekFields(UErrorCode &ec);
01973
01974
01983
void validateFields(UErrorCode &status);
01984
01993
virtual void validateField(UCalendarDateFields field, UErrorCode &status);
01994
02003
void validateField(UCalendarDateFields field, int32_t min, int32_t max, UErrorCode& status);
02004
02005
protected:
02015
static uint8_t julianDayToDayOfWeek(
double julian);
02016
02017
private:
02018
char validLocale[
ULOC_FULLNAME_CAPACITY];
02019
char actualLocale[
ULOC_FULLNAME_CAPACITY];
02020
02021
public:
02032
static StringEnumeration* getAvailableLocales(
void);
02033
02042
static URegistryKey registerFactory(ICUServiceFactory* toAdopt, UErrorCode& status);
02043
02054
static UBool unregister(URegistryKey key, UErrorCode& status);
02055
02060
friend class CalendarFactory;
02061
02066
friend class CalendarService;
02067
02072
friend class DefaultCalendarFactory;
02073
02078
virtual UBool haveDefaultCentury() const = 0;
02079
02084 virtual UDate defaultCenturyStart() const = 0;
02089 virtual int32_t defaultCenturyStartYear() const = 0;
02090
02097
Locale getLocale(ULocDataLocaleType type, UErrorCode &status) const;
02098
02105 const
char* getLocaleID(ULocDataLocaleType type, UErrorCode &status) const;
02106
02107 };
02108
02109
02110
02111 inline Calendar*
02112 Calendar::createInstance(
TimeZone* zone, UErrorCode& errorCode)
02113 {
02114
02115
return createInstance(zone, Locale::getDefault(), errorCode);
02116 }
02117
02118
02119
02120
inline void
02121 Calendar::roll(UCalendarDateFields field, UBool up, UErrorCode& status)
02122 {
02123 roll(field, (int32_t)(up ? +1 : -1), status);
02124 }
02125
02126
inline void
02127
Calendar::roll(EDateFields field, UBool up, UErrorCode& status)
02128 {
02129 roll((UCalendarDateFields) field, up, status);
02130 }
02131
02132
02133
02134
02140
inline void
02141
Calendar::internalSet(UCalendarDateFields field, int32_t value)
02142 {
02143
fFields[field] = value;
02144
fStamp[field] =
kInternallySet;
02145
fIsSet[field] =
TRUE;
02146 }
02147
02148
inline void
02149
Calendar::internalSet(EDateFields field, int32_t value)
02150 {
02151 internalSet((UCalendarDateFields) field, value);
02152 }
02153
02154
inline uint8_t Calendar::julianDayToDayOfWeek(
double julian)
02155 {
02156
02157
02158
int8_t dayOfWeek = (
int8_t)
uprv_fmod(julian + 1, 7);
02159
02160
uint8_t result = (
uint8_t)(dayOfWeek + ((dayOfWeek < 0) ? (7+
UCAL_SUNDAY ) :
UCAL_SUNDAY));
02161
return result;
02162 }
02163
02164
inline int32_t Calendar::weekNumber(int32_t dayOfPeriod, int32_t dayOfWeek)
02165 {
02166
return weekNumber(dayOfPeriod, dayOfPeriod, dayOfWeek);
02167 }
02168
02169
02170
U_NAMESPACE_END
02171
02172
#endif
02173
02174
#endif // _CALENDAR