1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 359d709d503bab6e2b61931737e662dd293b40578ccornelius * Copyright (C) 2003-2013, International Business Machines Corporation and 459d709d503bab6e2b61931737e662dd293b40578ccornelius * others. All Rights Reserved. 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ******************************************************************************* 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * File TAIWNCAL.CPP 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * Modification History: 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 05/13/2003 srl copied from gregocal.cpp 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 06/29/2007 srl copied from buddhcal.cpp 1285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * 05/12/2008 jce modified to use calendar=roc per CLDR 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/utypes.h" 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if !UCONFIG_NO_FORMATTING 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "taiwncal.h" 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "unicode/gregocal.h" 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "umutex.h" 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include <float.h> 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(TaiwanCalendar) 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t kTaiwanEraStart = 1911; // 1911 (Gregorian) 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Querustatic const int32_t kGregorianEpoch = 1970; 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar::TaiwanCalendar(const Locale& aLocale, UErrorCode& success) 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru: GregorianCalendar(aLocale, success) 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar::~TaiwanCalendar() 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar::TaiwanCalendar(const TaiwanCalendar& source) 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru: GregorianCalendar(source) 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruTaiwanCalendar& TaiwanCalendar::operator= ( const TaiwanCalendar& right) 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GregorianCalendar::operator=(right); 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return *this; 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruCalendar* TaiwanCalendar::clone(void) const 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return new TaiwanCalendar(*this); 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruconst char *TaiwanCalendar::getType() const 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 6185bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho return "roc"; 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t TaiwanCalendar::handleGetExtendedYear() 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // EXTENDED_YEAR in TaiwanCalendar is a Gregorian year 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // The default value of EXTENDED_YEAR is 1970 (Minguo 59) 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t year = kGregorianEpoch; 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru && newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t era = internalGet(UCAL_ERA, MINGUO); 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(era == MINGUO) { 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = internalGet(UCAL_YEAR, 1) + kTaiwanEraStart; 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else if(era == BEFORE_MINGUO) { 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = 1 - internalGet(UCAL_YEAR, 1) + kTaiwanEraStart; 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 80ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 81ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return year; 82ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 83ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 84ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TaiwanCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) 85ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 86ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru GregorianCalendar::handleComputeFields(julianDay, status); 87ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t y = internalGet(UCAL_EXTENDED_YEAR) - kTaiwanEraStart; 88ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(y>0) { 89ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_ERA, MINGUO); 90ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_YEAR, y); 91ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 92ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_ERA, BEFORE_MINGUO); 93ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_YEAR, 1-y); 94ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 95ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 96ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 97ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruint32_t TaiwanCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const 98ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 99ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(field == UCAL_ERA) { 100ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { 101ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return BEFORE_MINGUO; 102ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 103ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return MINGUO; 104ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 105ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 106ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return GregorianCalendar::handleGetLimit(field,limitType); 107ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 108ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 109ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 110ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#if 0 111ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid TaiwanCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) 112ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 113ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru //Calendar::timeToFields(theTime, quick, status); 114ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 115ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t era = internalGet(UCAL_ERA); 116ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru int32_t year = internalGet(UCAL_YEAR); 117ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 118ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if(era == GregorianCalendar::BC) { 119ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = 1-year; 120ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru era = TaiwanCalendar::MINGUO; 121ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else if(era == GregorianCalendar::AD) { 122ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru era = TaiwanCalendar::MINGUO; 123ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } else { 124ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru status = U_INTERNAL_PROGRAM_ERROR; 125ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 126ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 127ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru year = year - kTaiwanEraStart; 128ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 129ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_ERA, era); 130ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru internalSet(UCAL_YEAR, year); 131ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 132ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 133ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 13459d709d503bab6e2b61931737e662dd293b40578ccornelius/** 13559d709d503bab6e2b61931737e662dd293b40578ccornelius * The system maintains a static default century start date and Year. They are 13659d709d503bab6e2b61931737e662dd293b40578ccornelius * initialized the first time they are used. Once the system default century date 13759d709d503bab6e2b61931737e662dd293b40578ccornelius * and year are set, they do not change. 13859d709d503bab6e2b61931737e662dd293b40578ccornelius */ 13959d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic UDate gSystemDefaultCenturyStart = DBL_MIN; 14059d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic int32_t gSystemDefaultCenturyStartYear = -1; 14159d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic icu::UInitOnce gSystemDefaultCenturyInit = U_INITONCE_INITIALIZER; 142ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 143ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUBool TaiwanCalendar::haveDefaultCentury() const 144ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 145ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return TRUE; 146ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 147ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 14859d709d503bab6e2b61931737e662dd293b40578ccorneliusstatic void U_CALLCONV initializeSystemDefaultCentury() 149ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 150ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // initialize systemDefaultCentury and systemDefaultCenturyYear based 151ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // on the current time. They'll be set to 80 years before 152ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // the current time. 15385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho UErrorCode status = U_ZERO_ERROR; 15485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho TaiwanCalendar calendar(Locale("@calendar=roc"),status); 15585bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho if (U_SUCCESS(status)) 156ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru { 15785bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho calendar.setTime(Calendar::getNow(), status); 15885bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho calendar.add(UCAL_YEAR, -80, status); 15959d709d503bab6e2b61931737e662dd293b40578ccornelius 16059d709d503bab6e2b61931737e662dd293b40578ccornelius gSystemDefaultCenturyStart = calendar.getTime(status); 16159d709d503bab6e2b61931737e662dd293b40578ccornelius gSystemDefaultCenturyStartYear = calendar.get(UCAL_YEAR, status); 162ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 16385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // We have no recourse upon failure unless we want to propagate the failure 16485bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho // out. 165ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 166ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 16759d709d503bab6e2b61931737e662dd293b40578ccorneliusUDate TaiwanCalendar::defaultCenturyStart() const { 16859d709d503bab6e2b61931737e662dd293b40578ccornelius // lazy-evaluate systemDefaultCenturyStart 16959d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); 17059d709d503bab6e2b61931737e662dd293b40578ccornelius return gSystemDefaultCenturyStart; 17159d709d503bab6e2b61931737e662dd293b40578ccornelius} 17259d709d503bab6e2b61931737e662dd293b40578ccornelius 17359d709d503bab6e2b61931737e662dd293b40578ccorneliusint32_t TaiwanCalendar::defaultCenturyStartYear() const { 17459d709d503bab6e2b61931737e662dd293b40578ccornelius // lazy-evaluate systemDefaultCenturyStartYear 17559d709d503bab6e2b61931737e662dd293b40578ccornelius umtx_initOnce(gSystemDefaultCenturyInit, &initializeSystemDefaultCentury); 17659d709d503bab6e2b61931737e662dd293b40578ccornelius return gSystemDefaultCenturyStartYear; 17759d709d503bab6e2b61931737e662dd293b40578ccornelius} 178ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 179ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 180ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 181ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#endif 182