1*0e209d39SAndroid Build Coastguard Worker // © 2016 and later: Unicode, Inc. and others. 2*0e209d39SAndroid Build Coastguard Worker // License & terms of use: http://www.unicode.org/copyright.html 3*0e209d39SAndroid Build Coastguard Worker /* 4*0e209d39SAndroid Build Coastguard Worker ****************************************************************************** 5*0e209d39SAndroid Build Coastguard Worker * Copyright (C) 2003-2013, International Business Machines Corporation 6*0e209d39SAndroid Build Coastguard Worker * and others. All Rights Reserved. 7*0e209d39SAndroid Build Coastguard Worker ****************************************************************************** 8*0e209d39SAndroid Build Coastguard Worker * 9*0e209d39SAndroid Build Coastguard Worker * File PERSNCAL.H 10*0e209d39SAndroid Build Coastguard Worker * 11*0e209d39SAndroid Build Coastguard Worker * Modification History: 12*0e209d39SAndroid Build Coastguard Worker * 13*0e209d39SAndroid Build Coastguard Worker * Date Name Description 14*0e209d39SAndroid Build Coastguard Worker * 9/23/2003 mehran posted to icu-design 15*0e209d39SAndroid Build Coastguard Worker ***************************************************************************** 16*0e209d39SAndroid Build Coastguard Worker */ 17*0e209d39SAndroid Build Coastguard Worker 18*0e209d39SAndroid Build Coastguard Worker #ifndef PERSNCAL_H 19*0e209d39SAndroid Build Coastguard Worker #define PERSNCAL_H 20*0e209d39SAndroid Build Coastguard Worker 21*0e209d39SAndroid Build Coastguard Worker #include "unicode/utypes.h" 22*0e209d39SAndroid Build Coastguard Worker 23*0e209d39SAndroid Build Coastguard Worker #if !UCONFIG_NO_FORMATTING 24*0e209d39SAndroid Build Coastguard Worker 25*0e209d39SAndroid Build Coastguard Worker #include "unicode/calendar.h" 26*0e209d39SAndroid Build Coastguard Worker 27*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_BEGIN 28*0e209d39SAndroid Build Coastguard Worker 29*0e209d39SAndroid Build Coastguard Worker /** 30*0e209d39SAndroid Build Coastguard Worker * <code>PersianCalendar</code> is a subclass of <code>Calendar</code> 31*0e209d39SAndroid Build Coastguard Worker * that implements the Persian calendar. It is used as the official 32*0e209d39SAndroid Build Coastguard Worker * calendar in Iran. This calendar is also known as the "Hijri Shamsi" 33*0e209d39SAndroid Build Coastguard Worker * calendar, since it starts at the time of Mohammed's emigration (or 34*0e209d39SAndroid Build Coastguard Worker * "hijra") to Medinah on Thursday, July 15, 622 AD (Julian) and is a 35*0e209d39SAndroid Build Coastguard Worker * solar calendar system (or "shamsi"). 36*0e209d39SAndroid Build Coastguard Worker * <p> 37*0e209d39SAndroid Build Coastguard Worker * The Persian calendar is strictly solar, and thus a Persian year has twelve 38*0e209d39SAndroid Build Coastguard Worker * solar months. A Persian year is about 365 days long, except in leap years 39*0e209d39SAndroid Build Coastguard Worker * which is 366 days long. 40*0e209d39SAndroid Build Coastguard Worker * <p> 41*0e209d39SAndroid Build Coastguard Worker * The six first months of Persian Calendar are 31 days long. The next five 42*0e209d39SAndroid Build Coastguard Worker * months are 30 days long. The last month is 29 days long in normal years, 43*0e209d39SAndroid Build Coastguard Worker * and 30 days long in leap years. 44*0e209d39SAndroid Build Coastguard Worker * 45*0e209d39SAndroid Build Coastguard Worker * @see GregorianCalendar 46*0e209d39SAndroid Build Coastguard Worker * 47*0e209d39SAndroid Build Coastguard Worker * @author Mehran Mehr 48*0e209d39SAndroid Build Coastguard Worker * @internal 49*0e209d39SAndroid Build Coastguard Worker */ 50*0e209d39SAndroid Build Coastguard Worker class PersianCalendar : public Calendar { 51*0e209d39SAndroid Build Coastguard Worker public: 52*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 53*0e209d39SAndroid Build Coastguard Worker // Constants... 54*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 55*0e209d39SAndroid Build Coastguard Worker /** 56*0e209d39SAndroid Build Coastguard Worker * Constants for the months 57*0e209d39SAndroid Build Coastguard Worker * @internal 58*0e209d39SAndroid Build Coastguard Worker */ 59*0e209d39SAndroid Build Coastguard Worker enum EMonths { 60*0e209d39SAndroid Build Coastguard Worker /** 61*0e209d39SAndroid Build Coastguard Worker * Constant for Farvardin, the 1st month of the Persian year. 62*0e209d39SAndroid Build Coastguard Worker * @internal 63*0e209d39SAndroid Build Coastguard Worker */ 64*0e209d39SAndroid Build Coastguard Worker FARVARDIN = 0, 65*0e209d39SAndroid Build Coastguard Worker 66*0e209d39SAndroid Build Coastguard Worker /** 67*0e209d39SAndroid Build Coastguard Worker * Constant for Ordibehesht, the 2nd month of the Persian year. 68*0e209d39SAndroid Build Coastguard Worker * @internal 69*0e209d39SAndroid Build Coastguard Worker */ 70*0e209d39SAndroid Build Coastguard Worker ORDIBEHESHT = 1, 71*0e209d39SAndroid Build Coastguard Worker 72*0e209d39SAndroid Build Coastguard Worker /** 73*0e209d39SAndroid Build Coastguard Worker * Constant for Khordad, the 3rd month of the Persian year. 74*0e209d39SAndroid Build Coastguard Worker * @internal 75*0e209d39SAndroid Build Coastguard Worker */ 76*0e209d39SAndroid Build Coastguard Worker KHORDAD = 2, 77*0e209d39SAndroid Build Coastguard Worker 78*0e209d39SAndroid Build Coastguard Worker /** 79*0e209d39SAndroid Build Coastguard Worker * Constant for Tir, the 4th month of the Persian year. 80*0e209d39SAndroid Build Coastguard Worker * @internal 81*0e209d39SAndroid Build Coastguard Worker */ 82*0e209d39SAndroid Build Coastguard Worker TIR = 3, 83*0e209d39SAndroid Build Coastguard Worker 84*0e209d39SAndroid Build Coastguard Worker /** 85*0e209d39SAndroid Build Coastguard Worker * Constant for Mordad, the 5th month of the Persian year. 86*0e209d39SAndroid Build Coastguard Worker * @internal 87*0e209d39SAndroid Build Coastguard Worker */ 88*0e209d39SAndroid Build Coastguard Worker MORDAD = 4, 89*0e209d39SAndroid Build Coastguard Worker 90*0e209d39SAndroid Build Coastguard Worker /** 91*0e209d39SAndroid Build Coastguard Worker * Constant for Shahrivar, the 6th month of the Persian year. 92*0e209d39SAndroid Build Coastguard Worker * @internal 93*0e209d39SAndroid Build Coastguard Worker */ 94*0e209d39SAndroid Build Coastguard Worker SHAHRIVAR = 5, 95*0e209d39SAndroid Build Coastguard Worker 96*0e209d39SAndroid Build Coastguard Worker /** 97*0e209d39SAndroid Build Coastguard Worker * Constant for Mehr, the 7th month of the Persian year. 98*0e209d39SAndroid Build Coastguard Worker * @internal 99*0e209d39SAndroid Build Coastguard Worker */ 100*0e209d39SAndroid Build Coastguard Worker MEHR = 6, 101*0e209d39SAndroid Build Coastguard Worker 102*0e209d39SAndroid Build Coastguard Worker /** 103*0e209d39SAndroid Build Coastguard Worker * Constant for Aban, the 8th month of the Persian year. 104*0e209d39SAndroid Build Coastguard Worker * @internal 105*0e209d39SAndroid Build Coastguard Worker */ 106*0e209d39SAndroid Build Coastguard Worker ABAN = 7, 107*0e209d39SAndroid Build Coastguard Worker 108*0e209d39SAndroid Build Coastguard Worker /** 109*0e209d39SAndroid Build Coastguard Worker * Constant for Azar, the 9th month of the Persian year. 110*0e209d39SAndroid Build Coastguard Worker * @internal 111*0e209d39SAndroid Build Coastguard Worker */ 112*0e209d39SAndroid Build Coastguard Worker AZAR = 8, 113*0e209d39SAndroid Build Coastguard Worker 114*0e209d39SAndroid Build Coastguard Worker /** 115*0e209d39SAndroid Build Coastguard Worker * Constant for Dei, the 10th month of the Persian year. 116*0e209d39SAndroid Build Coastguard Worker * @internal 117*0e209d39SAndroid Build Coastguard Worker */ 118*0e209d39SAndroid Build Coastguard Worker DEI = 9, 119*0e209d39SAndroid Build Coastguard Worker 120*0e209d39SAndroid Build Coastguard Worker /** 121*0e209d39SAndroid Build Coastguard Worker * Constant for Bahman, the 11th month of the Persian year. 122*0e209d39SAndroid Build Coastguard Worker * @internal 123*0e209d39SAndroid Build Coastguard Worker */ 124*0e209d39SAndroid Build Coastguard Worker BAHMAN = 10, 125*0e209d39SAndroid Build Coastguard Worker 126*0e209d39SAndroid Build Coastguard Worker /** 127*0e209d39SAndroid Build Coastguard Worker * Constant for Esfand, the 12th month of the Persian year. 128*0e209d39SAndroid Build Coastguard Worker * @internal 129*0e209d39SAndroid Build Coastguard Worker */ 130*0e209d39SAndroid Build Coastguard Worker ESFAND = 11, 131*0e209d39SAndroid Build Coastguard Worker 132*0e209d39SAndroid Build Coastguard Worker PERSIAN_MONTH_MAX 133*0e209d39SAndroid Build Coastguard Worker }; 134*0e209d39SAndroid Build Coastguard Worker 135*0e209d39SAndroid Build Coastguard Worker 136*0e209d39SAndroid Build Coastguard Worker 137*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 138*0e209d39SAndroid Build Coastguard Worker // Constructors... 139*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 140*0e209d39SAndroid Build Coastguard Worker 141*0e209d39SAndroid Build Coastguard Worker /** 142*0e209d39SAndroid Build Coastguard Worker * Constructs a PersianCalendar based on the current time in the default time zone 143*0e209d39SAndroid Build Coastguard Worker * with the given locale. 144*0e209d39SAndroid Build Coastguard Worker * 145*0e209d39SAndroid Build Coastguard Worker * @param aLocale The given locale. 146*0e209d39SAndroid Build Coastguard Worker * @param success Indicates the status of PersianCalendar object construction. 147*0e209d39SAndroid Build Coastguard Worker * Returns U_ZERO_ERROR if constructed successfully. 148*0e209d39SAndroid Build Coastguard Worker * @internal 149*0e209d39SAndroid Build Coastguard Worker */ 150*0e209d39SAndroid Build Coastguard Worker PersianCalendar(const Locale& aLocale, UErrorCode &success); 151*0e209d39SAndroid Build Coastguard Worker 152*0e209d39SAndroid Build Coastguard Worker /** 153*0e209d39SAndroid Build Coastguard Worker * Copy Constructor 154*0e209d39SAndroid Build Coastguard Worker * @internal 155*0e209d39SAndroid Build Coastguard Worker */ 156*0e209d39SAndroid Build Coastguard Worker PersianCalendar(const PersianCalendar& other); 157*0e209d39SAndroid Build Coastguard Worker 158*0e209d39SAndroid Build Coastguard Worker /** 159*0e209d39SAndroid Build Coastguard Worker * Destructor. 160*0e209d39SAndroid Build Coastguard Worker * @internal 161*0e209d39SAndroid Build Coastguard Worker */ 162*0e209d39SAndroid Build Coastguard Worker virtual ~PersianCalendar(); 163*0e209d39SAndroid Build Coastguard Worker 164*0e209d39SAndroid Build Coastguard Worker // TODO: copy c'tor, etc 165*0e209d39SAndroid Build Coastguard Worker 166*0e209d39SAndroid Build Coastguard Worker // clone 167*0e209d39SAndroid Build Coastguard Worker virtual PersianCalendar* clone() const override; 168*0e209d39SAndroid Build Coastguard Worker 169*0e209d39SAndroid Build Coastguard Worker private: 170*0e209d39SAndroid Build Coastguard Worker /** 171*0e209d39SAndroid Build Coastguard Worker * Determine whether a year is a leap year in the Persian calendar 172*0e209d39SAndroid Build Coastguard Worker */ 173*0e209d39SAndroid Build Coastguard Worker static UBool isLeapYear(int32_t year); 174*0e209d39SAndroid Build Coastguard Worker 175*0e209d39SAndroid Build Coastguard Worker /** 176*0e209d39SAndroid Build Coastguard Worker * Return the day # on which the given year starts. Days are counted 177*0e209d39SAndroid Build Coastguard Worker * from the Hijri epoch, origin 0. 178*0e209d39SAndroid Build Coastguard Worker */ 179*0e209d39SAndroid Build Coastguard Worker int32_t yearStart(int32_t year, UErrorCode& status); 180*0e209d39SAndroid Build Coastguard Worker 181*0e209d39SAndroid Build Coastguard Worker /** 182*0e209d39SAndroid Build Coastguard Worker * Return the day # on which the given month starts. Days are counted 183*0e209d39SAndroid Build Coastguard Worker * from the Hijri epoch, origin 0. 184*0e209d39SAndroid Build Coastguard Worker * 185*0e209d39SAndroid Build Coastguard Worker * @param year The hijri shamsi year 186*0e209d39SAndroid Build Coastguard Worker * @param year The hijri shamsi month, 0-based 187*0e209d39SAndroid Build Coastguard Worker */ 188*0e209d39SAndroid Build Coastguard Worker int32_t monthStart(int32_t year, int32_t month, UErrorCode& status) const; 189*0e209d39SAndroid Build Coastguard Worker 190*0e209d39SAndroid Build Coastguard Worker //---------------------------------------------------------------------- 191*0e209d39SAndroid Build Coastguard Worker // Calendar framework 192*0e209d39SAndroid Build Coastguard Worker //---------------------------------------------------------------------- 193*0e209d39SAndroid Build Coastguard Worker protected: 194*0e209d39SAndroid Build Coastguard Worker /** 195*0e209d39SAndroid Build Coastguard Worker * @internal 196*0e209d39SAndroid Build Coastguard Worker */ 197*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetLimit(UCalendarDateFields field, ELimitType limitType) const override; 198*0e209d39SAndroid Build Coastguard Worker 199*0e209d39SAndroid Build Coastguard Worker /** 200*0e209d39SAndroid Build Coastguard Worker * Return the length (in days) of the given month. 201*0e209d39SAndroid Build Coastguard Worker * 202*0e209d39SAndroid Build Coastguard Worker * @param year The hijri shamsi year 203*0e209d39SAndroid Build Coastguard Worker * @param year The hijri shamsi month, 0-based 204*0e209d39SAndroid Build Coastguard Worker * @internal 205*0e209d39SAndroid Build Coastguard Worker */ 206*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetMonthLength(int32_t extendedYear, int32_t month, UErrorCode& status) const override; 207*0e209d39SAndroid Build Coastguard Worker 208*0e209d39SAndroid Build Coastguard Worker /** 209*0e209d39SAndroid Build Coastguard Worker * Return the number of days in the given Persian year 210*0e209d39SAndroid Build Coastguard Worker * @internal 211*0e209d39SAndroid Build Coastguard Worker */ 212*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetYearLength(int32_t extendedYear) const override; 213*0e209d39SAndroid Build Coastguard Worker 214*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 215*0e209d39SAndroid Build Coastguard Worker // Functions for converting from field values to milliseconds.... 216*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 217*0e209d39SAndroid Build Coastguard Worker 218*0e209d39SAndroid Build Coastguard Worker // Return JD of start of given month/year 219*0e209d39SAndroid Build Coastguard Worker /** 220*0e209d39SAndroid Build Coastguard Worker * @internal 221*0e209d39SAndroid Build Coastguard Worker */ 222*0e209d39SAndroid Build Coastguard Worker virtual int64_t handleComputeMonthStart(int32_t eyear, int32_t month, UBool useMonth, UErrorCode& status) const override; 223*0e209d39SAndroid Build Coastguard Worker 224*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 225*0e209d39SAndroid Build Coastguard Worker // Functions for converting from milliseconds to field values 226*0e209d39SAndroid Build Coastguard Worker //------------------------------------------------------------------------- 227*0e209d39SAndroid Build Coastguard Worker 228*0e209d39SAndroid Build Coastguard Worker /** 229*0e209d39SAndroid Build Coastguard Worker * @internal 230*0e209d39SAndroid Build Coastguard Worker */ 231*0e209d39SAndroid Build Coastguard Worker virtual int32_t handleGetExtendedYear(UErrorCode& status) override; 232*0e209d39SAndroid Build Coastguard Worker 233*0e209d39SAndroid Build Coastguard Worker /** 234*0e209d39SAndroid Build Coastguard Worker * Override Calendar to compute several fields specific to the Persian 235*0e209d39SAndroid Build Coastguard Worker * calendar system. These are: 236*0e209d39SAndroid Build Coastguard Worker * 237*0e209d39SAndroid Build Coastguard Worker * <ul><li>ERA 238*0e209d39SAndroid Build Coastguard Worker * <li>YEAR 239*0e209d39SAndroid Build Coastguard Worker * <li>MONTH 240*0e209d39SAndroid Build Coastguard Worker * <li>DAY_OF_MONTH 241*0e209d39SAndroid Build Coastguard Worker * <li>DAY_OF_YEAR 242*0e209d39SAndroid Build Coastguard Worker * <li>EXTENDED_YEAR</ul> 243*0e209d39SAndroid Build Coastguard Worker * 244*0e209d39SAndroid Build Coastguard Worker * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this 245*0e209d39SAndroid Build Coastguard Worker * method is called. The getGregorianXxx() methods return Gregorian 246*0e209d39SAndroid Build Coastguard Worker * calendar equivalents for the given Julian day. 247*0e209d39SAndroid Build Coastguard Worker * @internal 248*0e209d39SAndroid Build Coastguard Worker */ 249*0e209d39SAndroid Build Coastguard Worker virtual void handleComputeFields(int32_t julianDay, UErrorCode &status) override; 250*0e209d39SAndroid Build Coastguard Worker 251*0e209d39SAndroid Build Coastguard Worker // UObject stuff 252*0e209d39SAndroid Build Coastguard Worker public: 253*0e209d39SAndroid Build Coastguard Worker /** 254*0e209d39SAndroid Build Coastguard Worker * @return The class ID for this object. All objects of a given class have the 255*0e209d39SAndroid Build Coastguard Worker * same class ID. Objects of other classes have different class IDs. 256*0e209d39SAndroid Build Coastguard Worker * @internal 257*0e209d39SAndroid Build Coastguard Worker */ 258*0e209d39SAndroid Build Coastguard Worker virtual UClassID getDynamicClassID() const override; 259*0e209d39SAndroid Build Coastguard Worker 260*0e209d39SAndroid Build Coastguard Worker /** 261*0e209d39SAndroid Build Coastguard Worker * Return the class ID for this class. This is useful only for comparing to a return 262*0e209d39SAndroid Build Coastguard Worker * value from getDynamicClassID(). For example: 263*0e209d39SAndroid Build Coastguard Worker * 264*0e209d39SAndroid Build Coastguard Worker * Base* polymorphic_pointer = createPolymorphicObject(); 265*0e209d39SAndroid Build Coastguard Worker * if (polymorphic_pointer->getDynamicClassID() == 266*0e209d39SAndroid Build Coastguard Worker * Derived::getStaticClassID()) ... 267*0e209d39SAndroid Build Coastguard Worker * 268*0e209d39SAndroid Build Coastguard Worker * @return The class ID for all objects of this class. 269*0e209d39SAndroid Build Coastguard Worker * @internal 270*0e209d39SAndroid Build Coastguard Worker */ 271*0e209d39SAndroid Build Coastguard Worker U_I18N_API static UClassID U_EXPORT2 getStaticClassID(); 272*0e209d39SAndroid Build Coastguard Worker 273*0e209d39SAndroid Build Coastguard Worker /** 274*0e209d39SAndroid Build Coastguard Worker * return the calendar type, "persian". 275*0e209d39SAndroid Build Coastguard Worker * 276*0e209d39SAndroid Build Coastguard Worker * @return calendar type 277*0e209d39SAndroid Build Coastguard Worker * @internal 278*0e209d39SAndroid Build Coastguard Worker */ 279*0e209d39SAndroid Build Coastguard Worker virtual const char * getType() const override; 280*0e209d39SAndroid Build Coastguard Worker 281*0e209d39SAndroid Build Coastguard Worker /** 282*0e209d39SAndroid Build Coastguard Worker * @return The related Gregorian year; will be obtained by modifying the value 283*0e209d39SAndroid Build Coastguard Worker * obtained by get from UCAL_EXTENDED_YEAR field 284*0e209d39SAndroid Build Coastguard Worker * @internal 285*0e209d39SAndroid Build Coastguard Worker */ 286*0e209d39SAndroid Build Coastguard Worker virtual int32_t getRelatedYear(UErrorCode &status) const override; 287*0e209d39SAndroid Build Coastguard Worker 288*0e209d39SAndroid Build Coastguard Worker /** 289*0e209d39SAndroid Build Coastguard Worker * @param year The related Gregorian year to set; will be modified as necessary then 290*0e209d39SAndroid Build Coastguard Worker * set in UCAL_EXTENDED_YEAR field 291*0e209d39SAndroid Build Coastguard Worker * @internal 292*0e209d39SAndroid Build Coastguard Worker */ 293*0e209d39SAndroid Build Coastguard Worker virtual void setRelatedYear(int32_t year) override; 294*0e209d39SAndroid Build Coastguard Worker 295*0e209d39SAndroid Build Coastguard Worker private: 296*0e209d39SAndroid Build Coastguard Worker PersianCalendar(); // default constructor not implemented 297*0e209d39SAndroid Build Coastguard Worker 298*0e209d39SAndroid Build Coastguard Worker protected: 299*0e209d39SAndroid Build Coastguard Worker DECLARE_OVERRIDE_SYSTEM_DEFAULT_CENTURY 300*0e209d39SAndroid Build Coastguard Worker }; 301*0e209d39SAndroid Build Coastguard Worker 302*0e209d39SAndroid Build Coastguard Worker U_NAMESPACE_END 303*0e209d39SAndroid Build Coastguard Worker 304*0e209d39SAndroid Build Coastguard Worker #endif 305*0e209d39SAndroid Build Coastguard Worker #endif 306*0e209d39SAndroid Build Coastguard Worker 307*0e209d39SAndroid Build Coastguard Worker 308*0e209d39SAndroid Build Coastguard Worker 309