1 // © 2016 and later: Unicode, Inc. and others. 2 // License & terms of use: http://www.unicode.org/copyright.html 3 /* 4 ******************************************************************************* 5 * Copyright (C) 2003-2009,2012,2016 International Business Machines Corporation and 6 * others. All Rights Reserved. 7 ******************************************************************************* 8 * 9 * File JAPANCAL.CPP 10 * 11 * Modification History: 12 * 05/16/2003 srl copied from buddhcal.cpp 13 * 14 */ 15 16 #include "unicode/utypes.h" 17 18 #if !UCONFIG_NO_FORMATTING 19 20 #include "cmemory.h" 21 #include "japancal.h" 22 #include "unicode/gregocal.h" 23 #include "umutex.h" 24 #include "uassert.h" 25 26 //#define U_DEBUG_JCAL 27 28 #ifdef U_DEBUG_JCAL 29 #include <stdio.h> 30 #endif 31 32 U_NAMESPACE_BEGIN 33 34 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar) 35 36 // Gregorian date of each emperor's ascension 37 // Years are AD, months are 1-based. 38 static const struct { 39 int16_t year; 40 int8_t month; 41 int8_t day; 42 } kEraInfo[] = { 43 // Year Month Day 44 { 645, 6, 19 }, // Taika 0 45 { 650, 2, 15 }, // Hakuchi 1 46 { 672, 1, 1 }, // Hakuho 2 47 { 686, 7, 20 }, // Shucho 3 48 { 701, 3, 21 }, // Taiho 4 49 { 704, 5, 10 }, // Keiun 5 50 { 708, 1, 11 }, // Wado 6 51 { 715, 9, 2 }, // Reiki 7 52 { 717, 11, 17 }, // Yoro 8 53 { 724, 2, 4 }, // Jinki 9 54 { 729, 8, 5 }, // Tempyo 10 55 { 749, 4, 14 }, // Tempyo-kampo 11 56 { 749, 7, 2 }, // Tempyo-shoho 12 57 { 757, 8, 18 }, // Tempyo-hoji 13 58 { 765, 1, 7 }, // Tempho-jingo 14 59 { 767, 8, 16 }, // Jingo-keiun 15 60 { 770, 10, 1 }, // Hoki 16 61 { 781, 1, 1 }, // Ten-o 17 62 { 782, 8, 19 }, // Enryaku 18 63 { 806, 5, 18 }, // Daido 19 64 { 810, 9, 19 }, // Konin 20 65 { 824, 1, 5 }, // Tencho 66 { 834, 1, 3 }, // Showa 67 { 848, 6, 13 }, // Kajo 68 { 851, 4, 28 }, // Ninju 69 { 854, 11, 30 }, // Saiko 70 { 857, 2, 21 }, // Tennan 71 { 859, 4, 15 }, // Jogan 72 { 877, 4, 16 }, // Genkei 73 { 885, 2, 21 }, // Ninna 74 { 889, 4, 27 }, // Kampyo 30 75 { 898, 4, 26 }, // Shotai 76 { 901, 7, 15 }, // Engi 77 { 923, 4, 11 }, // Encho 78 { 931, 4, 26 }, // Shohei 79 { 938, 5, 22 }, // Tengyo 80 { 947, 4, 22 }, // Tenryaku 81 { 957, 10, 27 }, // Tentoku 82 { 961, 2, 16 }, // Owa 83 { 964, 7, 10 }, // Koho 84 { 968, 8, 13 }, // Anna 40 85 { 970, 3, 25 }, // Tenroku 86 { 973, 12, 20 }, // Ten-en 87 { 976, 7, 13 }, // Jogen 88 { 978, 11, 29 }, // Tengen 89 { 983, 4, 15 }, // Eikan 90 { 985, 4, 27 }, // Kanna 91 { 987, 4, 5 }, // Ei-en 92 { 989, 8, 8 }, // Eiso 93 { 990, 11, 7 }, // Shoryaku 94 { 995, 2, 22 }, // Chotoku 50 95 { 999, 1, 13 }, // Choho 96 { 1004, 7, 20 }, // Kanko 97 { 1012, 12, 25 }, // Chowa 98 { 1017, 4, 23 }, // Kannin 99 { 1021, 2, 2 }, // Jian 100 { 1024, 7, 13 }, // Manju 101 { 1028, 7, 25 }, // Chogen 102 { 1037, 4, 21 }, // Choryaku 103 { 1040, 11, 10 }, // Chokyu 104 { 1044, 11, 24 }, // Kantoku 60 105 { 1046, 4, 14 }, // Eisho 106 { 1053, 1, 11 }, // Tengi 107 { 1058, 8, 29 }, // Kohei 108 { 1065, 8, 2 }, // Jiryaku 109 { 1069, 4, 13 }, // Enkyu 110 { 1074, 8, 23 }, // Shoho 111 { 1077, 11, 17 }, // Shoryaku 112 { 1081, 2, 10 }, // Eiho 113 { 1084, 2, 7 }, // Otoku 114 { 1087, 4, 7 }, // Kanji 70 115 { 1094, 12, 15 }, // Kaho 116 { 1096, 12, 17 }, // Eicho 117 { 1097, 11, 21 }, // Shotoku 118 { 1099, 8, 28 }, // Kowa 119 { 1104, 2, 10 }, // Choji 120 { 1106, 4, 9 }, // Kasho 121 { 1108, 8, 3 }, // Tennin 122 { 1110, 7, 13 }, // Ten-ei 123 { 1113, 7, 13 }, // Eikyu 124 { 1118, 4, 3 }, // Gen-ei 80 125 { 1120, 4, 10 }, // Hoan 126 { 1124, 4, 3 }, // Tenji 127 { 1126, 1, 22 }, // Daiji 128 { 1131, 1, 29 }, // Tensho 129 { 1132, 8, 11 }, // Chosho 130 { 1135, 4, 27 }, // Hoen 131 { 1141, 7, 10 }, // Eiji 132 { 1142, 4, 28 }, // Koji 133 { 1144, 2, 23 }, // Tenyo 134 { 1145, 7, 22 }, // Kyuan 90 135 { 1151, 1, 26 }, // Ninpei 136 { 1154, 10, 28 }, // Kyuju 137 { 1156, 4, 27 }, // Hogen 138 { 1159, 4, 20 }, // Heiji 139 { 1160, 1, 10 }, // Eiryaku 140 { 1161, 9, 4 }, // Oho 141 { 1163, 3, 29 }, // Chokan 142 { 1165, 6, 5 }, // Eiman 143 { 1166, 8, 27 }, // Nin-an 144 { 1169, 4, 8 }, // Kao 100 145 { 1171, 4, 21 }, // Shoan 146 { 1175, 7, 28 }, // Angen 147 { 1177, 8, 4 }, // Jisho 148 { 1181, 7, 14 }, // Yowa 149 { 1182, 5, 27 }, // Juei 150 { 1184, 4, 16 }, // Genryuku 151 { 1185, 8, 14 }, // Bunji 152 { 1190, 4, 11 }, // Kenkyu 153 { 1199, 4, 27 }, // Shoji 154 { 1201, 2, 13 }, // Kennin 110 155 { 1204, 2, 20 }, // Genkyu 156 { 1206, 4, 27 }, // Ken-ei 157 { 1207, 10, 25 }, // Shogen 158 { 1211, 3, 9 }, // Kenryaku 159 { 1213, 12, 6 }, // Kenpo 160 { 1219, 4, 12 }, // Shokyu 161 { 1222, 4, 13 }, // Joo 162 { 1224, 11, 20 }, // Gennin 163 { 1225, 4, 20 }, // Karoku 164 { 1227, 12, 10 }, // Antei 120 165 { 1229, 3, 5 }, // Kanki 166 { 1232, 4, 2 }, // Joei 167 { 1233, 4, 15 }, // Tempuku 168 { 1234, 11, 5 }, // Bunryaku 169 { 1235, 9, 19 }, // Katei 170 { 1238, 11, 23 }, // Ryakunin 171 { 1239, 2, 7 }, // En-o 172 { 1240, 7, 16 }, // Ninji 173 { 1243, 2, 26 }, // Kangen 174 { 1247, 2, 28 }, // Hoji 130 175 { 1249, 3, 18 }, // Kencho 176 { 1256, 10, 5 }, // Kogen 177 { 1257, 3, 14 }, // Shoka 178 { 1259, 3, 26 }, // Shogen 179 { 1260, 4, 13 }, // Bun-o 180 { 1261, 2, 20 }, // Kocho 181 { 1264, 2, 28 }, // Bun-ei 182 { 1275, 4, 25 }, // Kenji 183 { 1278, 2, 29 }, // Koan 184 { 1288, 4, 28 }, // Shoo 140 185 { 1293, 8, 55 }, // Einin 186 { 1299, 4, 25 }, // Shoan 187 { 1302, 11, 21 }, // Kengen 188 { 1303, 8, 5 }, // Kagen 189 { 1306, 12, 14 }, // Tokuji 190 { 1308, 10, 9 }, // Enkei 191 { 1311, 4, 28 }, // Ocho 192 { 1312, 3, 20 }, // Showa 193 { 1317, 2, 3 }, // Bunpo 194 { 1319, 4, 28 }, // Geno 150 195 { 1321, 2, 23 }, // Genkyo 196 { 1324, 12, 9 }, // Shochu 197 { 1326, 4, 26 }, // Kareki 198 { 1329, 8, 29 }, // Gentoku 199 { 1331, 8, 9 }, // Genko 200 { 1334, 1, 29 }, // Kemmu 201 { 1336, 2, 29 }, // Engen 202 { 1340, 4, 28 }, // Kokoku 203 { 1346, 12, 8 }, // Shohei 204 { 1370, 7, 24 }, // Kentoku 160 205 { 1372, 4, 1 }, // Bunch\u0169 206 { 1375, 5, 27 }, // Tenju 207 { 1379, 3, 22 }, // Koryaku 208 { 1381, 2, 10 }, // Kowa 209 { 1384, 4, 28 }, // Gench\u0169 210 { 1384, 2, 27 }, // Meitoku 211 { 1387, 8, 23 }, // Kakei 212 { 1389, 2, 9 }, // Koo 213 { 1390, 3, 26 }, // Meitoku 214 { 1394, 7, 5 }, // Oei 170 215 { 1428, 4, 27 }, // Shocho 216 { 1429, 9, 5 }, // Eikyo 217 { 1441, 2, 17 }, // Kakitsu 218 { 1444, 2, 5 }, // Bun-an 219 { 1449, 7, 28 }, // Hotoku 220 { 1452, 7, 25 }, // Kyotoku 221 { 1455, 7, 25 }, // Kosho 222 { 1457, 9, 28 }, // Choroku 223 { 1460, 12, 21 }, // Kansho 224 { 1466, 2, 28 }, // Bunsho 180 225 { 1467, 3, 3 }, // Onin 226 { 1469, 4, 28 }, // Bunmei 227 { 1487, 7, 29 }, // Chokyo 228 { 1489, 8, 21 }, // Entoku 229 { 1492, 7, 19 }, // Meio 230 { 1501, 2, 29 }, // Bunki 231 { 1504, 2, 30 }, // Eisho 232 { 1521, 8, 23 }, // Taiei 233 { 1528, 8, 20 }, // Kyoroku 234 { 1532, 7, 29 }, // Tenmon 190 235 { 1555, 10, 23 }, // Koji 236 { 1558, 2, 28 }, // Eiroku 237 { 1570, 4, 23 }, // Genki 238 { 1573, 7, 28 }, // Tensho 239 { 1592, 12, 8 }, // Bunroku 240 { 1596, 10, 27 }, // Keicho 241 { 1615, 7, 13 }, // Genwa 242 { 1624, 2, 30 }, // Kan-ei 243 { 1644, 12, 16 }, // Shoho 244 { 1648, 2, 15 }, // Keian 200 245 { 1652, 9, 18 }, // Shoo 246 { 1655, 4, 13 }, // Meiryaku 247 { 1658, 7, 23 }, // Manji 248 { 1661, 4, 25 }, // Kanbun 249 { 1673, 9, 21 }, // Enpo 250 { 1681, 9, 29 }, // Tenwa 251 { 1684, 2, 21 }, // Jokyo 252 { 1688, 9, 30 }, // Genroku 253 { 1704, 3, 13 }, // Hoei 254 { 1711, 4, 25 }, // Shotoku 210 255 { 1716, 6, 22 }, // Kyoho 256 { 1736, 4, 28 }, // Genbun 257 { 1741, 2, 27 }, // Kanpo 258 { 1744, 2, 21 }, // Enkyo 259 { 1748, 7, 12 }, // Kan-en 260 { 1751, 10, 27 }, // Horyaku 261 { 1764, 6, 2 }, // Meiwa 262 { 1772, 11, 16 }, // An-ei 263 { 1781, 4, 2 }, // Tenmei 264 { 1789, 1, 25 }, // Kansei 220 265 { 1801, 2, 5 }, // Kyowa 266 { 1804, 2, 11 }, // Bunka 267 { 1818, 4, 22 }, // Bunsei 268 { 1830, 12, 10 }, // Tenpo 269 { 1844, 12, 2 }, // Koka 270 { 1848, 2, 28 }, // Kaei 271 { 1854, 11, 27 }, // Ansei 272 { 1860, 3, 18 }, // Man-en 273 { 1861, 2, 19 }, // Bunkyu 274 { 1864, 2, 20 }, // Genji 230 275 { 1865, 4, 7 }, // Keio 231 276 { 1868, 9, 8 }, // Meiji 232 277 { 1912, 7, 30 }, // Taisho 233 278 { 1926, 12, 25 }, // Showa 234 279 { 1989, 1, 8 } // Heisei 235 280 }; 281 282 #define kEraCount UPRV_LENGTHOF(kEraInfo) 283 284 /** 285 * The current era, for reference. 286 */ 287 static const int32_t kCurrentEra = (kEraCount-1); // int32_t to match the calendar field type 288 289 static const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR 290 291 /* Some platforms don't like to export constants, like old Palm OS and some z/OS configurations. */ 292 uint32_t JapaneseCalendar::getCurrentEra() { 293 return kCurrentEra; 294 } 295 296 JapaneseCalendar::JapaneseCalendar(const Locale& aLocale, UErrorCode& success) 297 : GregorianCalendar(aLocale, success) 298 { 299 setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. 300 } 301 302 JapaneseCalendar::~JapaneseCalendar() 303 { 304 } 305 306 JapaneseCalendar::JapaneseCalendar(const JapaneseCalendar& source) 307 : GregorianCalendar(source) 308 { 309 } 310 311 JapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right) 312 { 313 GregorianCalendar::operator=(right); 314 return *this; 315 } 316 317 Calendar* JapaneseCalendar::clone(void) const 318 { 319 return new JapaneseCalendar(*this); 320 } 321 322 const char *JapaneseCalendar::getType() const 323 { 324 return "japanese"; 325 } 326 327 int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) 328 { 329 int32_t era = internalGetEra(); 330 // TODO do we assume we can trust 'era'? What if it is denormalized? 331 332 int32_t month = 0; 333 334 // Find out if we are at the edge of an era 335 336 if(eyear == kEraInfo[era].year) { 337 // Yes, we're in the first year of this era. 338 return kEraInfo[era].month-1; 339 } 340 341 return month; 342 } 343 344 int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month) 345 { 346 int32_t era = internalGetEra(); 347 int32_t day = 1; 348 349 if(eyear == kEraInfo[era].year) { 350 if(month == (kEraInfo[era].month-1)) { 351 return kEraInfo[era].day; 352 } 353 } 354 355 return day; 356 } 357 358 359 int32_t JapaneseCalendar::internalGetEra() const 360 { 361 return internalGet(UCAL_ERA, kCurrentEra); 362 } 363 364 int32_t JapaneseCalendar::handleGetExtendedYear() 365 { 366 // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year 367 // The default value of EXTENDED_YEAR is 1970 (Showa 45) 368 int32_t year; 369 370 if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && 371 newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { 372 year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); 373 } else { 374 // Subtract one because year starts at 1 375 year = internalGet(UCAL_YEAR) + kEraInfo[internalGetEra()].year - 1; 376 } 377 return year; 378 } 379 380 381 void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) 382 { 383 //Calendar::timeToFields(theTime, quick, status); 384 GregorianCalendar::handleComputeFields(julianDay, status); 385 int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year 386 387 int32_t low = 0; 388 389 // Short circuit for recent years. Most modern computations will 390 // occur in the current era and won't require the binary search. 391 // Note that if the year is == the current era year, then we use 392 // the binary search to handle the month/dom comparison. 393 #ifdef U_DEBUG_JCAL 394 fprintf(stderr, "== %d \n", year); 395 #endif 396 397 if (year > kEraInfo[kCurrentEra].year) { 398 low = kCurrentEra; 399 #ifdef U_DEBUG_JCAL 400 fprintf(stderr, " low=%d (special)\n", low); 401 #endif 402 } else { 403 // Binary search 404 int32_t high = kEraCount; 405 406 #ifdef U_DEBUG_JCAL 407 fprintf(stderr, " high=%d\n", high); 408 #endif 409 while (low < high - 1) { 410 int32_t i = (low + high) / 2; 411 int32_t diff = year - kEraInfo[i].year; 412 413 #ifdef U_DEBUG_JCAL 414 fprintf(stderr, " d=%d low=%d, high=%d. Considering %d:M%d D%d Y%d. { we are ?:M%d D%d Y%d }\n", 415 diff,low, high, i, kEraInfo[i].month-1, kEraInfo[i].day, kEraInfo[i].year, internalGet(UCAL_MONTH), internalGet(UCAL_DATE),year); 416 #endif 417 418 // If years are the same, then compare the months, and if those 419 // are the same, compare days of month. In the ERAS array 420 // months are 1-based for easier maintenance. 421 if (diff == 0) { 422 diff = internalGet(UCAL_MONTH) - (kEraInfo[i].month - 1); 423 #ifdef U_DEBUG_JCAL 424 fprintf(stderr, "diff now %d (M) = %d - %d - 1\n", diff, internalGet(UCAL_MONTH), kEraInfo[i].month); 425 #endif 426 if (diff == 0) { 427 diff = internalGet(UCAL_DATE) - kEraInfo[i].day; 428 #ifdef U_DEBUG_JCAL 429 fprintf(stderr, "diff now %d (D)\n", diff); 430 #endif 431 } 432 } 433 if (diff >= 0) { 434 low = i; 435 } else { 436 high = i; 437 } 438 #ifdef U_DEBUG_JCAL 439 fprintf(stderr, ". low=%d, high=%d, i=%d, diff=%d.. %d\n", low, high, i, diff, year); 440 #endif 441 442 } 443 } 444 445 #ifdef U_DEBUG_JCAL 446 fprintf(stderr, " low[era]=%d,.. %d\n", low, year); 447 #endif 448 // Now we've found the last era that starts before this date, so 449 // adjust the year to count from the start of that era. Note that 450 // all dates before the first era will fall into the first era by 451 // the algorithm. 452 453 internalSet(UCAL_ERA, low); 454 internalSet(UCAL_YEAR, year - kEraInfo[low].year + 1); 455 #ifdef U_DEBUG_JCAL 456 fprintf(stderr, " Set ERA=%d, year=%d\n", low, year-kEraInfo[low].year+1); 457 #endif 458 459 } 460 461 /* 462 Disable pivoting 463 */ 464 UBool JapaneseCalendar::haveDefaultCentury() const 465 { 466 return FALSE; 467 } 468 469 UDate JapaneseCalendar::defaultCenturyStart() const 470 { 471 return 0;// WRONG 472 } 473 474 int32_t JapaneseCalendar::defaultCenturyStartYear() const 475 { 476 return 0; 477 } 478 479 int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const 480 { 481 switch(field) { 482 case UCAL_ERA: 483 if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { 484 return 0; 485 } 486 return kCurrentEra; 487 case UCAL_YEAR: 488 { 489 switch (limitType) { 490 case UCAL_LIMIT_MINIMUM: 491 case UCAL_LIMIT_GREATEST_MINIMUM: 492 return 1; 493 case UCAL_LIMIT_LEAST_MAXIMUM: 494 return 1; 495 case UCAL_LIMIT_COUNT: //added to avoid warning 496 case UCAL_LIMIT_MAXIMUM: 497 return GregorianCalendar::handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM) - kEraInfo[kCurrentEra].year; 498 default: 499 return 1; // Error condition, invalid limitType 500 } 501 } 502 default: 503 return GregorianCalendar::handleGetLimit(field,limitType); 504 } 505 } 506 507 int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { 508 if (field == UCAL_YEAR) { 509 int32_t era = get(UCAL_ERA, status); 510 if (U_FAILURE(status)) { 511 return 0; // error case... any value 512 } 513 if (era == kCurrentEra) { 514 // TODO: Investigate what value should be used here - revisit after 4.0. 515 return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); 516 } else { 517 int32_t nextEraYear = kEraInfo[era + 1].year; 518 int32_t nextEraMonth = kEraInfo[era + 1].month; 519 int32_t nextEraDate = kEraInfo[era + 1].day; 520 521 int32_t maxYear = nextEraYear - kEraInfo[era].year + 1; // 1-base 522 if (nextEraMonth == 1 && nextEraDate == 1) { 523 // Subtract 1, because the next era starts at Jan 1 524 maxYear--; 525 } 526 return maxYear; 527 } 528 } 529 return GregorianCalendar::getActualMaximum(field, status); 530 } 531 532 U_NAMESPACE_END 533 534 #endif 535