1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2f9878a236aa0d9662d8e40cafdaf2e04cd615835ccornelius * Copyright (C) 2003-2014, International Business Machines Corporation 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * and others. All Rights Reserved. 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ****************************************************************************** 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * File INDIANCAL.CPP 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ***************************************************************************** 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "indiancal.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdlib.h> 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "mutex.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <float.h> 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "gregoimp.h" // Math 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "astro.h" // CalendarAstronomer 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "uhash.h" 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Debugging 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#ifdef U_DEBUG_INDIANCAL 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdio.h> 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <stdarg.h> 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Implementation of the IndianCalendar class 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//------------------------------------------------------------------------- 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Constructors... 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//------------------------------------------------------------------------- 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruCalendar* IndianCalendar::clone() const { 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return new IndianCalendar(*this); 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::IndianCalendar(const Locale& aLocale, UErrorCode& success) 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : Calendar(TimeZone::createDefault(), aLocale, success) 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::IndianCalendar(const IndianCalendar& other) : Calendar(other) { 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::~IndianCalendar() 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char *IndianCalendar::getType() const { 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return "indian"; 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t LIMITS[UCAL_FIELD_COUNT][4] = { 5785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Minimum Greatest Least Maximum 5885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Minimum Maximum 5985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0, 0, 0, 0}, // ERA 6085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -5000000, -5000000, 5000000, 5000000}, // YEAR 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 0, 0, 11, 11}, // MONTH 6285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 52, 53}, // WEEK_OF_YEAR 6385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // WEEK_OF_MONTH 6485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 30, 31}, // DAY_OF_MONTH 6585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { 1, 1, 365, 366}, // DAY_OF_YEAR 6685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DAY_OF_WEEK 6785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -1, -1, 5, 5}, // DAY_OF_WEEK_IN_MONTH 6885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // AM_PM 6985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR 7085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // HOUR_OF_DAY 7185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MINUTE 7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // SECOND 7385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECOND 7485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // ZONE_OFFSET 7585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DST_OFFSET 7685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -5000000, -5000000, 5000000, 5000000}, // YEAR_WOY 7785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // DOW_LOCAL 7885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho { -5000000, -5000000, 5000000, 5000000}, // EXTENDED_YEAR 7985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // JULIAN_DAY 8085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // MILLISECONDS_IN_DAY 8185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho {/*N/A*/-1,/*N/A*/-1,/*N/A*/-1,/*N/A*/-1}, // IS_LEAP_MONTH 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru}; 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const double JULIAN_EPOCH = 1721425.5; 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t INDIAN_ERA_START = 78; 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t INDIAN_YEAR_START = 80; 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t IndianCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const { 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return LIMITS[field][limitType]; 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Determine whether the given gregorian year is a Leap year 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic UBool isGregorianLeap(int32_t year) 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return ((year % 4) == 0) && (!(((year % 100) == 0) && ((year % 400) != 0))); 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//---------------------------------------------------------------------- 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Calendar framework 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//---------------------------------------------------------------------- 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return the length (in days) of the given month. 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param eyear The year in Saka Era 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param month The month(0-based) in Indian calendar 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t IndianCalendar::handleGetMonthLength(int32_t eyear, int32_t month) const { 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (month < 0 || month > 11) { 11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho eyear += ClockMath::floorDivide(month, 12, month); 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (isGregorianLeap(eyear + INDIAN_ERA_START) && month == 0) { 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 31; 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (month >= 1 && month <= 5) { 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 31; 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return 30; 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return the number of days in the given Indian year 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param eyear The year in Saka Era. 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t IndianCalendar::handleGetYearLength(int32_t eyear) const { 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return isGregorianLeap(eyear + INDIAN_ERA_START) ? 366 : 365; 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 134ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 135ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Returns the Julian Day corresponding to gregorian date 136ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 137ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param year The Gregorian year 138ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param month The month in Gregorian Year 139ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param date The date in Gregorian day in month 140ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 141ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic double gregorianToJD(int32_t year, int32_t month, int32_t date) { 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double julianDay = (JULIAN_EPOCH - 1) + 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (365 * (year - 1)) + 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_floor((year - 1) / 4) + 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (-uprv_floor((year - 1) / 100)) + 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_floor((year - 1) / 400) + 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru uprv_floor((((367 * month) - 362) / 12) + 148ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((month <= 2) ? 0 : 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (isGregorianLeap(year) ? -1 : -2) 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ) + 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru date); 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 153ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return julianDay; 154ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 155ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 157ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Returns the Gregorian Date corresponding to a given Julian Day 158ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param jd The Julian Day 159ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 160ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic int32_t* jdToGregorian(double jd, int32_t gregorianDate[3]) { 161ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double wjd, depoch, quadricent, dqc, cent, dcent, quad, dquad, yindex, yearday, leapadj; 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t year, month, day; 163ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru wjd = uprv_floor(jd - 0.5) + 0.5; 164ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru depoch = wjd - JULIAN_EPOCH; 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru quadricent = uprv_floor(depoch / 146097); 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru dqc = (int32_t)uprv_floor(depoch) % 146097; 167ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru cent = uprv_floor(dqc / 36524); 168ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru dcent = (int32_t)uprv_floor(dqc) % 36524; 169ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru quad = uprv_floor(dcent / 1461); 170ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru dquad = (int32_t)uprv_floor(dcent) % 1461; 171ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru yindex = uprv_floor(dquad / 365); 172ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = (int32_t)((quadricent * 400) + (cent * 100) + (quad * 4) + yindex); 173ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!((cent == 4) || (yindex == 4))) { 174ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year++; 175ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 176ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru yearday = wjd - gregorianToJD(year, 1, 1); 177ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru leapadj = ((wjd < gregorianToJD(year, 3, 1)) ? 0 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru (isGregorianLeap(year) ? 1 : 2) 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ); 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru month = (int32_t)uprv_floor((((yearday + leapadj) * 12) + 373) / 367); 182ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru day = (int32_t)(wjd - gregorianToJD(year, month, 1)) + 1; 183ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 184ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gregorianDate[0] = year; 185ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gregorianDate[1] = month; 186ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gregorianDate[2] = day; 187ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 188ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return gregorianDate; 189ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 190ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 191ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 192ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//------------------------------------------------------------------------- 193ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Functions for converting from field values to milliseconds.... 194ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//------------------------------------------------------------------------- 195ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic double IndianToJD(int32_t year, int32_t month, int32_t date) { 196ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t leapMonth, gyear, m; 197ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double start, jd; 198ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 199ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru gyear = year + INDIAN_ERA_START; 200ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 201ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 202ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(isGregorianLeap(gyear)) { 203ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru leapMonth = 31; 204ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru start = gregorianToJD(gyear, 3, 21); 205ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 206ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru else { 207ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru leapMonth = 30; 208ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru start = gregorianToJD(gyear, 3, 22); 209ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 210ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 211ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (month == 1) { 212ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru jd = start + (date - 1); 213ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 214ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru jd = start + leapMonth; 215ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru m = month - 2; 216ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 217ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //m = Math.min(m, 5); 218ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (m > 5) { 219ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru m = 5; 220ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 221ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 222ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru jd += m * 31; 223ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 224ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (month >= 8) { 225ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru m = month - 7; 226ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru jd += m * 30; 227ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 228ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru jd += date - 1; 229ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 230ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 231ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return jd; 232ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 233ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 234ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 235ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Return JD of start of given month/year of Indian Calendar 236ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param eyear The year in Indian Calendar measured from Saka Era (78 AD). 237ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * @param month The month in Indian calendar 238ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 23985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hoint32_t IndianCalendar::handleComputeMonthStart(int32_t eyear, int32_t month, UBool /* useMonth */ ) const { 240ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 241ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //month is 0 based; converting it to 1-based 242ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t imonth; 243ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 244ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // If the month is out of range, adjust it into range, and adjust the extended eyar accordingly 245ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (month < 0 || month > 11) { 24685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho eyear += (int32_t)ClockMath::floorDivide(month, 12, month); 247ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 248ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 249ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(month == 12){ 250ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru imonth = 1; 251ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 252ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru imonth = month + 1; 253ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 254ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 255ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru double jd = IndianToJD(eyear ,imonth, 1); 256ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 257ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (int32_t)jd; 258ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 259ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 260ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//------------------------------------------------------------------------- 261ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// Functions for converting from milliseconds to field values 262ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru//------------------------------------------------------------------------- 263ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 264ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t IndianCalendar::handleGetExtendedYear() { 265ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t year; 266ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 267ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR) { 268ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = internalGet(UCAL_EXTENDED_YEAR, 1); // Default to year 1 269ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 270ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = internalGet(UCAL_YEAR, 1); // Default to year 1 271ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 272ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 273ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return year; 274ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 275ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 276ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 277ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Override Calendar to compute several fields specific to the Indian 278ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * calendar system. These are: 279ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 280ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <ul><li>ERA 281ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <li>YEAR 282ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <li>MONTH 283ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <li>DAY_OF_MONTH 284ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * <li>EXTENDED_YEAR</ul> 285ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 286ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * The DAY_OF_WEEK and DOW_LOCAL fields are already set when this 287ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * method is called. The getGregorianXxx() methods return Gregorian 288ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * calendar equivalents for the given Julian day. 289ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 29085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Hovoid IndianCalendar::handleComputeFields(int32_t julianDay, UErrorCode& /* status */) { 29185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho double jdAtStartOfGregYear; 29285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t leapMonth, IndianYear, yday, IndianMonth, IndianDayOfMonth, mday; 29385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t gregorianYear; // Stores gregorian date corresponding to Julian day; 29485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho int32_t gd[3]; 29585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 29685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho gregorianYear = jdToGregorian(julianDay, gd)[0]; // Gregorian date for Julian day 29785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianYear = gregorianYear - INDIAN_ERA_START; // Year in Saka era 29885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho jdAtStartOfGregYear = gregorianToJD(gregorianYear, 1, 1); // JD at start of Gregorian year 29985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho yday = (int32_t)(julianDay - jdAtStartOfGregYear); // Day number in Gregorian year (starting from 0) 30085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho 30185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (yday < INDIAN_YEAR_START) { 30285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // Day is at the end of the preceding Saka year 30385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianYear -= 1; 30485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho leapMonth = isGregorianLeap(gregorianYear - 1) ? 31 : 30; // Days in leapMonth this year, previous Gregorian year 30585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho yday += leapMonth + (31 * 5) + (30 * 3) + 10; 30685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 30785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho leapMonth = isGregorianLeap(gregorianYear) ? 31 : 30; // Days in leapMonth this year 30885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho yday -= INDIAN_YEAR_START; 30985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 310ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (yday < leapMonth) { 31285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianMonth = 0; 31385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianDayOfMonth = yday + 1; 31485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 31585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho mday = yday - leapMonth; 31685bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (mday < (31 * 5)) { 31785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianMonth = (int32_t)uprv_floor(mday / 31) + 1; 31885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianDayOfMonth = (mday % 31) + 1; 31985bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } else { 32085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho mday -= 31 * 5; 32185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianMonth = (int32_t)uprv_floor(mday / 30) + 6; 32285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho IndianDayOfMonth = (mday % 30) + 1; 32385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho } 324ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 325ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 326ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_ERA, 0); 327ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_EXTENDED_YEAR, IndianYear); 328ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_YEAR, IndianYear); 329ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_MONTH, IndianMonth); 33085bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_DAY_OF_MONTH, IndianDayOfMonth); 33185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho internalSet(UCAL_DAY_OF_YEAR, yday + 1); // yday is 0-based 332ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 333ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 334ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool 335ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::inDaylightTime(UErrorCode& status) const 336ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 337ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // copied from GregorianCalendar 338ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_FAILURE(status) || !getTimeZone().useDaylightTime()) { 339ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return FALSE; 340ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 341ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 342ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // Force an update of the state of the Calendar. 343ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ((IndianCalendar*)this)->complete(status); // cast away const 344ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 345ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return (UBool)(U_SUCCESS(status) ? (internalGet(UCAL_DST_OFFSET) != 0) : FALSE); 346ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 347ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 348ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru// default century 349ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst UDate IndianCalendar::fgSystemDefaultCentury = DBL_MIN; 350ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst int32_t IndianCalendar::fgSystemDefaultCenturyYear = -1; 351ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 352ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDate IndianCalendar::fgSystemDefaultCenturyStart = DBL_MIN; 353ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t IndianCalendar::fgSystemDefaultCenturyStartYear = -1; 354ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 355ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 356ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool IndianCalendar::haveDefaultCentury() const 357ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 358ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 359ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 360ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 361ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDate IndianCalendar::defaultCenturyStart() const 362ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 363ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return internalGetDefaultCenturyStart(); 364ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 365ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 366ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t IndianCalendar::defaultCenturyStartYear() const 367ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 368ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return internalGetDefaultCenturyStartYear(); 369ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 370ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 371ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUDate 372ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::internalGetDefaultCenturyStart() const 373ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 374ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // lazy-evaluate systemDefaultCenturyStart 375ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool needsUpdate; 376ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 377ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Mutex m; 378ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); 379ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 380ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 381ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (needsUpdate) { 382ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru initializeSystemDefaultCentury(); 383ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 384ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 385ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // use defaultCenturyStart unless it's the flag value; 386ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // then use systemDefaultCenturyStart 387ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 388ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return fgSystemDefaultCenturyStart; 389ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 390ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 391ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t 392ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::internalGetDefaultCenturyStartYear() const 393ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 394ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // lazy-evaluate systemDefaultCenturyStartYear 395ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UBool needsUpdate; 396ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 397ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Mutex m; 398ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 399ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru needsUpdate = (fgSystemDefaultCenturyStart == fgSystemDefaultCentury); 400ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 401ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 402ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (needsUpdate) { 403ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru initializeSystemDefaultCentury(); 404ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 405ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 406ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // use defaultCenturyStart unless it's the flag value; 407ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // then use systemDefaultCenturyStartYear 408ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 409ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return fgSystemDefaultCenturyStartYear; 410ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 411ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 412ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid 413ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruIndianCalendar::initializeSystemDefaultCentury() 414ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 415ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // initialize systemDefaultCentury and systemDefaultCenturyYear based 416ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // on the current time. They'll be set to 80 years before 417ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // the current time. 418ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // No point in locking as it should be idempotent. 419ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (fgSystemDefaultCenturyStart == fgSystemDefaultCentury) { 420ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UErrorCode status = U_ZERO_ERROR; 421ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 422ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru IndianCalendar calendar(Locale("@calendar=Indian"),status); 423ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (U_SUCCESS(status)) { 424ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru calendar.setTime(Calendar::getNow(), status); 425ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru calendar.add(UCAL_YEAR, -80, status); 426ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 427ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru UDate newStart = calendar.getTime(status); 428ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t newYear = calendar.get(UCAL_YEAR, status); 429ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 430ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 431ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru Mutex m; 432ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 433ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fgSystemDefaultCenturyStart = newStart; 434ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru fgSystemDefaultCenturyStartYear = newYear; 435ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 436ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 437ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 438ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // We have no recourse upon failure unless we want to propagate the failure 439ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // out. 440ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 441ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 442ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 443ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(IndianCalendar) 444ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 445ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 446ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 447ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 448ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 449