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