X-Git-Url: https://git.saurik.com/apple/icu.git/blobdiff_plain/b75a7d8f3b4adbae880cab104ce2c6a50eee4db2..2ca993e82fb37b597a3c73ecd1586a139a6579c5:/icuSources/i18n/japancal.cpp diff --git a/icuSources/i18n/japancal.cpp b/icuSources/i18n/japancal.cpp index b4e83165..83aa0385 100644 --- a/icuSources/i18n/japancal.cpp +++ b/icuSources/i18n/japancal.cpp @@ -1,7 +1,7 @@ /* ******************************************************************************* -* Copyright (C) 2003, International Business Machines Corporation and * -* others. All Rights Reserved. * +* Copyright (C) 2003-2009,2012,2016 International Business Machines Corporation and +* others. All Rights Reserved. ******************************************************************************* * * File JAPANCAL.CPP @@ -15,8 +15,11 @@ #if !UCONFIG_NO_FORMATTING +#include "cmemory.h" #include "japancal.h" #include "unicode/gregocal.h" +#include "umutex.h" +#include "uassert.h" //#define U_DEBUG_JCAL @@ -26,260 +29,270 @@ U_NAMESPACE_BEGIN -const char JapaneseCalendar::fgClassID = 0; // Value is irrelevant +UOBJECT_DEFINE_RTTI_IMPLEMENTATION(JapaneseCalendar) // Gregorian date of each emperor's ascension // Years are AD, months are 1-based. static const struct { - int16_t year; - int8_t month; - int8_t day; + int16_t year; + int8_t month; + int8_t day; } kEraInfo[] = { - // Year Month Day - { 645, 6, 19 }, // Taika 0 - { 650, 2, 15 }, // Hakuchi 1 - { 672, 1, 1 }, // Hakuho 2 - { 686, 7, 20 }, // Shucho 3 - { 701, 3, 21 }, // Taiho 4 - { 704, 5, 10 }, // Keiun 5 - { 708, 1, 11 }, // Wado 6 - { 715, 9, 2 }, // Reiki 7 - { 717, 11, 17 }, // Yoro 8 - { 724, 2, 4 }, // Jinki 9 - { 729, 8, 5 }, // Tempyo 10 - { 749, 4, 14 }, // Tempyo-kampo 11 - { 749, 7, 2 }, // Tempyo-shoho 12 - { 757, 8, 18 }, // Tempyo-hoji 13 - { 765, 1, 7 }, // Tempho-jingo 14 - { 767, 8, 16 }, // Jingo-keiun 15 - { 770, 10, 1 }, // Hoki 16 - { 781, 1, 1 }, // Ten-o 17 - { 782, 8, 19 }, // Enryaku 18 - { 806, 5, 18 }, // Daido 19 - { 810, 9, 19 }, // Konin 20 - { 824, 1, 5 }, // Tencho - { 834, 1, 3 }, // Showa - { 848, 6, 13 }, // Kajo - { 851, 4, 28 }, // Ninju - { 854, 11, 30 }, // Saiko - { 857, 2, 21 }, // Tennan - { 859, 4, 15 }, // Jogan - { 877, 4, 16 }, // Genkei - { 885, 2, 21 }, // Ninna - { 889, 4, 27 }, // Kampyo 30 - { 898, 4, 26 }, // Shotai - { 901, 7, 15 }, // Engi - { 923, 4, 11 }, // Encho - { 931, 4, 26 }, // Shohei - { 938, 5, 22 }, // Tengyo - { 947, 4, 22 }, // Tenryaku - { 957, 10, 27 }, // Tentoku - { 961, 2, 16 }, // Owa - { 964, 7, 10 }, // Koho - { 968, 8, 13 }, // Anna 40 - { 970, 3, 25 }, // Tenroku - { 973, 12, 20 }, // Ten-en - { 976, 7, 13 }, // Jogen - { 978, 11, 29 }, // Tengen - { 983, 4, 15 }, // Eikan - { 985, 4, 27 }, // Kanna - { 987, 4, 5 }, // Ei-en - { 989, 8, 8 }, // Eiso - { 990, 11, 7 }, // Shoryaku - { 995, 2, 22 }, // Chotoku 50 - { 999, 1, 13 }, // Choho - { 1004, 7, 20 }, // Kanko - { 1012, 12, 25 }, // Chowa - { 1017, 4, 23 }, // Kannin - { 1021, 2, 2 }, // Jian - { 1024, 7, 13 }, // Manju - { 1028, 7, 25 }, // Chogen - { 1037, 4, 21 }, // Choryaku - { 1040, 11, 10 }, // Chokyu - { 1044, 11, 24 }, // Kantoku 60 - { 1046, 4, 14 }, // Eisho - { 1053, 1, 11 }, // Tengi - { 1058, 8, 29 }, // Kohei - { 1065, 8, 2 }, // Jiryaku - { 1069, 4, 13 }, // Enkyu - { 1074, 8, 23 }, // Shoho - { 1077, 11, 17 }, // Shoryaku - { 1081, 2, 10 }, // Eiho - { 1084, 2, 7 }, // Otoku - { 1087, 4, 7 }, // Kanji 70 - { 1094, 12, 15 }, // Kaho - { 1096, 12, 17 }, // Eicho - { 1097, 11, 21 }, // Shotoku - { 1099, 8, 28 }, // Kowa - { 1104, 2, 10 }, // Choji - { 1106, 4, 9 }, // Kasho - { 1108, 8, 3 }, // Tennin - { 1110, 7, 13 }, // Ten-ei - { 1113, 7, 13 }, // Eikyu - { 1118, 4, 3 }, // Gen-ei 80 - { 1120, 4, 10 }, // Hoan - { 1124, 4, 3 }, // Tenji - { 1126, 1, 22 }, // Daiji - { 1131, 1, 29 }, // Tensho - { 1132, 8, 11 }, // Chosho - { 1135, 4, 27 }, // Hoen - { 1141, 7, 10 }, // Eiji - { 1142, 4, 28 }, // Koji - { 1144, 2, 23 }, // Tenyo - { 1145, 7, 22 }, // Kyuan 90 - { 1151, 1, 26 }, // Ninpei - { 1154, 10, 28 }, // Kyuju - { 1156, 4, 27 }, // Hogen - { 1159, 4, 20 }, // Heiji - { 1160, 1, 10 }, // Eiryaku - { 1161, 9, 4 }, // Oho - { 1163, 3, 29 }, // Chokan - { 1165, 6, 5 }, // Eiman - { 1166, 8, 27 }, // Nin-an - { 1169, 4, 8 }, // Kao 100 - { 1171, 4, 21 }, // Shoan - { 1175, 7, 28 }, // Angen - { 1177, 8, 4 }, // Jisho - { 1181, 7, 14 }, // Yowa - { 1182, 5, 27 }, // Juei - { 1184, 4, 16 }, // Genryuku - { 1185, 8, 14 }, // Bunji - { 1190, 4, 11 }, // Kenkyu - { 1199, 4, 27 }, // Shoji - { 1201, 2, 13 }, // Kennin 110 - { 1204, 2, 20 }, // Genkyu - { 1206, 4, 27 }, // Ken-ei - { 1207, 10, 25 }, // Shogen - { 1211, 3, 9 }, // Kenryaku - { 1213, 12, 6 }, // Kenpo - { 1219, 4, 12 }, // Shokyu - { 1222, 4, 13 }, // Joo - { 1224, 11, 20 }, // Gennin - { 1225, 4, 20 }, // Karoku - { 1227, 12, 10 }, // Antei 120 - { 1229, 3, 5 }, // Kanki - { 1232, 4, 2 }, // Joei - { 1233, 4, 15 }, // Tempuku - { 1234, 11, 5 }, // Bunryaku - { 1235, 9, 19 }, // Katei - { 1238, 11, 23 }, // Ryakunin - { 1239, 2, 7 }, // En-o - { 1240, 7, 16 }, // Ninji - { 1243, 2, 26 }, // Kangen - { 1247, 2, 28 }, // Hoji 130 - { 1249, 3, 18 }, // Kencho - { 1256, 10, 5 }, // Kogen - { 1257, 3, 14 }, // Shoka - { 1259, 3, 26 }, // Shogen - { 1260, 4, 13 }, // Bun-o - { 1261, 2, 20 }, // Kocho - { 1264, 2, 28 }, // Bun-ei - { 1275, 4, 25 }, // Kenji - { 1278, 2, 29 }, // Koan - { 1288, 4, 28 }, // Shoo 140 - { 1293, 8, 55 }, // Einin - { 1299, 4, 25 }, // Shoan - { 1302, 11, 21 }, // Kengen - { 1303, 8, 5 }, // Kagen - { 1306, 12, 14 }, // Tokuji - { 1308, 10, 9 }, // Enkei - { 1311, 4, 28 }, // Ocho - { 1312, 3, 20 }, // Showa - { 1317, 2, 3 }, // Bunpo - { 1319, 4, 28 }, // Geno 150 - { 1321, 2, 23 }, // Genkyo - { 1324, 12, 9 }, // Shochu - { 1326, 4, 26 }, // Kareki - { 1329, 8, 29 }, // Gentoku - { 1331, 8, 9 }, // Genko - { 1334, 1, 29 }, // Kemmu - { 1336, 2, 29 }, // Engen - { 1340, 4, 28 }, // Kokoku - { 1346, 12, 8 }, // Shohei - { 1370, 7, 24 }, // Kentoku 160 - { 1372, 4, 1 }, // Bunch\u0169 - { 1375, 5, 27 }, // Tenju - { 1381, 2, 10 }, // Kowa - { 1384, 4, 28 }, // Gench\u0169 - { 1384, 2, 27 }, // Meitoku - { 1379, 3, 22 }, // Koryaku - { 1387, 8, 23 }, // Kakei - { 1389, 2, 9 }, // Koo - { 1390, 3, 26 }, // Meitoku - { 1394, 7, 5 }, // Oei 170 - { 1428, 4, 27 }, // Shocho - { 1429, 9, 5 }, // Eikyo - { 1441, 2, 17 }, // Kakitsu - { 1444, 2, 5 }, // Bun-an - { 1449, 7, 28 }, // Hotoku - { 1452, 7, 25 }, // Kyotoku - { 1455, 7, 25 }, // Kosho - { 1457, 9, 28 }, // Choroku - { 1460, 12, 21 }, // Kansho - { 1466, 2, 28 }, // Bunsho 180 - { 1467, 3, 3 }, // Onin - { 1469, 4, 28 }, // Bunmei - { 1487, 7, 29 }, // Chokyo - { 1489, 8, 21 }, // Entoku - { 1492, 7, 19 }, // Meio - { 1501, 2, 29 }, // Bunki - { 1504, 2, 30 }, // Eisho - { 1521, 8, 23 }, // Taiei - { 1528, 8, 20 }, // Kyoroku - { 1532, 7, 29 }, // Tenmon 190 - { 1555, 10, 23 }, // Koji - { 1558, 2, 28 }, // Eiroku - { 1570, 4, 23 }, // Genki - { 1573, 7, 28 }, // Tensho - { 1592, 12, 8 }, // Bunroku - { 1596, 10, 27 }, // Keicho - { 1615, 7, 13 }, // Genwa - { 1624, 2, 30 }, // Kan-ei - { 1644, 12, 16 }, // Shoho - { 1648, 2, 15 }, // Keian 200 - { 1652, 9, 18 }, // Shoo - { 1655, 4, 13 }, // Meiryaku - { 1658, 7, 23 }, // Manji - { 1661, 4, 25 }, // Kanbun - { 1673, 9, 21 }, // Enpo - { 1681, 9, 29 }, // Tenwa - { 1684, 2, 21 }, // Jokyo - { 1688, 9, 30 }, // Genroku - { 1704, 3, 13 }, // Hoei - { 1711, 4, 25 }, // Shotoku 210 - { 1716, 6, 22 }, // Kyoho - { 1736, 4, 28 }, // Genbun - { 1741, 2, 27 }, // Kanpo - { 1744, 2, 21 }, // Enkyo - { 1748, 7, 12 }, // Kan-en - { 1751, 10, 27 }, // Horyaku - { 1764, 6, 2 }, // Meiwa - { 1772, 11, 16 }, // An-ei - { 1781, 4, 2 }, // Tenmei - { 1789, 1, 25 }, // Kansei 220 - { 1801, 2, 5 }, // Kyowa - { 1804, 2, 11 }, // Bunka - { 1818, 4, 22 }, // Bunsei - { 1830, 12, 10 }, // Tenpo - { 1844, 12, 2 }, // Koka - { 1848, 2, 28 }, // Kaei - { 1854, 11, 27 }, // Ansei - { 1860, 3, 18 }, // Man-en - { 1861, 2, 19 }, // Bunkyu - { 1864, 2, 20 }, // Genji 230 - { 1865, 4, 7 }, // Keio 231 - { 1868, 9, 8 }, // Meiji 232 - { 1912, 7, 30 }, // Taisho 233 - { 1926, 12, 25 }, // Showa 234 - { 1989, 1, 8 } // Heisei 235 - }; - -#define kEraCount (sizeof(kEraInfo)/sizeof(kEraInfo[0])) - -const uint32_t JapaneseCalendar::kCurrentEra = (kEraCount-1); + // Year Month Day + { 645, 6, 19 }, // Taika 0 + { 650, 2, 15 }, // Hakuchi 1 + { 672, 1, 1 }, // Hakuho 2 + { 686, 7, 20 }, // Shucho 3 + { 701, 3, 21 }, // Taiho 4 + { 704, 5, 10 }, // Keiun 5 + { 708, 1, 11 }, // Wado 6 + { 715, 9, 2 }, // Reiki 7 + { 717, 11, 17 }, // Yoro 8 + { 724, 2, 4 }, // Jinki 9 + { 729, 8, 5 }, // Tempyo 10 + { 749, 4, 14 }, // Tempyo-kampo 11 + { 749, 7, 2 }, // Tempyo-shoho 12 + { 757, 8, 18 }, // Tempyo-hoji 13 + { 765, 1, 7 }, // Tempho-jingo 14 + { 767, 8, 16 }, // Jingo-keiun 15 + { 770, 10, 1 }, // Hoki 16 + { 781, 1, 1 }, // Ten-o 17 + { 782, 8, 19 }, // Enryaku 18 + { 806, 5, 18 }, // Daido 19 + { 810, 9, 19 }, // Konin 20 + { 824, 1, 5 }, // Tencho + { 834, 1, 3 }, // Showa + { 848, 6, 13 }, // Kajo + { 851, 4, 28 }, // Ninju + { 854, 11, 30 }, // Saiko + { 857, 2, 21 }, // Tennan + { 859, 4, 15 }, // Jogan + { 877, 4, 16 }, // Genkei + { 885, 2, 21 }, // Ninna + { 889, 4, 27 }, // Kampyo 30 + { 898, 4, 26 }, // Shotai + { 901, 7, 15 }, // Engi + { 923, 4, 11 }, // Encho + { 931, 4, 26 }, // Shohei + { 938, 5, 22 }, // Tengyo + { 947, 4, 22 }, // Tenryaku + { 957, 10, 27 }, // Tentoku + { 961, 2, 16 }, // Owa + { 964, 7, 10 }, // Koho + { 968, 8, 13 }, // Anna 40 + { 970, 3, 25 }, // Tenroku + { 973, 12, 20 }, // Ten-en + { 976, 7, 13 }, // Jogen + { 978, 11, 29 }, // Tengen + { 983, 4, 15 }, // Eikan + { 985, 4, 27 }, // Kanna + { 987, 4, 5 }, // Ei-en + { 989, 8, 8 }, // Eiso + { 990, 11, 7 }, // Shoryaku + { 995, 2, 22 }, // Chotoku 50 + { 999, 1, 13 }, // Choho + { 1004, 7, 20 }, // Kanko + { 1012, 12, 25 }, // Chowa + { 1017, 4, 23 }, // Kannin + { 1021, 2, 2 }, // Jian + { 1024, 7, 13 }, // Manju + { 1028, 7, 25 }, // Chogen + { 1037, 4, 21 }, // Choryaku + { 1040, 11, 10 }, // Chokyu + { 1044, 11, 24 }, // Kantoku 60 + { 1046, 4, 14 }, // Eisho + { 1053, 1, 11 }, // Tengi + { 1058, 8, 29 }, // Kohei + { 1065, 8, 2 }, // Jiryaku + { 1069, 4, 13 }, // Enkyu + { 1074, 8, 23 }, // Shoho + { 1077, 11, 17 }, // Shoryaku + { 1081, 2, 10 }, // Eiho + { 1084, 2, 7 }, // Otoku + { 1087, 4, 7 }, // Kanji 70 + { 1094, 12, 15 }, // Kaho + { 1096, 12, 17 }, // Eicho + { 1097, 11, 21 }, // Shotoku + { 1099, 8, 28 }, // Kowa + { 1104, 2, 10 }, // Choji + { 1106, 4, 9 }, // Kasho + { 1108, 8, 3 }, // Tennin + { 1110, 7, 13 }, // Ten-ei + { 1113, 7, 13 }, // Eikyu + { 1118, 4, 3 }, // Gen-ei 80 + { 1120, 4, 10 }, // Hoan + { 1124, 4, 3 }, // Tenji + { 1126, 1, 22 }, // Daiji + { 1131, 1, 29 }, // Tensho + { 1132, 8, 11 }, // Chosho + { 1135, 4, 27 }, // Hoen + { 1141, 7, 10 }, // Eiji + { 1142, 4, 28 }, // Koji + { 1144, 2, 23 }, // Tenyo + { 1145, 7, 22 }, // Kyuan 90 + { 1151, 1, 26 }, // Ninpei + { 1154, 10, 28 }, // Kyuju + { 1156, 4, 27 }, // Hogen + { 1159, 4, 20 }, // Heiji + { 1160, 1, 10 }, // Eiryaku + { 1161, 9, 4 }, // Oho + { 1163, 3, 29 }, // Chokan + { 1165, 6, 5 }, // Eiman + { 1166, 8, 27 }, // Nin-an + { 1169, 4, 8 }, // Kao 100 + { 1171, 4, 21 }, // Shoan + { 1175, 7, 28 }, // Angen + { 1177, 8, 4 }, // Jisho + { 1181, 7, 14 }, // Yowa + { 1182, 5, 27 }, // Juei + { 1184, 4, 16 }, // Genryuku + { 1185, 8, 14 }, // Bunji + { 1190, 4, 11 }, // Kenkyu + { 1199, 4, 27 }, // Shoji + { 1201, 2, 13 }, // Kennin 110 + { 1204, 2, 20 }, // Genkyu + { 1206, 4, 27 }, // Ken-ei + { 1207, 10, 25 }, // Shogen + { 1211, 3, 9 }, // Kenryaku + { 1213, 12, 6 }, // Kenpo + { 1219, 4, 12 }, // Shokyu + { 1222, 4, 13 }, // Joo + { 1224, 11, 20 }, // Gennin + { 1225, 4, 20 }, // Karoku + { 1227, 12, 10 }, // Antei 120 + { 1229, 3, 5 }, // Kanki + { 1232, 4, 2 }, // Joei + { 1233, 4, 15 }, // Tempuku + { 1234, 11, 5 }, // Bunryaku + { 1235, 9, 19 }, // Katei + { 1238, 11, 23 }, // Ryakunin + { 1239, 2, 7 }, // En-o + { 1240, 7, 16 }, // Ninji + { 1243, 2, 26 }, // Kangen + { 1247, 2, 28 }, // Hoji 130 + { 1249, 3, 18 }, // Kencho + { 1256, 10, 5 }, // Kogen + { 1257, 3, 14 }, // Shoka + { 1259, 3, 26 }, // Shogen + { 1260, 4, 13 }, // Bun-o + { 1261, 2, 20 }, // Kocho + { 1264, 2, 28 }, // Bun-ei + { 1275, 4, 25 }, // Kenji + { 1278, 2, 29 }, // Koan + { 1288, 4, 28 }, // Shoo 140 + { 1293, 8, 55 }, // Einin + { 1299, 4, 25 }, // Shoan + { 1302, 11, 21 }, // Kengen + { 1303, 8, 5 }, // Kagen + { 1306, 12, 14 }, // Tokuji + { 1308, 10, 9 }, // Enkei + { 1311, 4, 28 }, // Ocho + { 1312, 3, 20 }, // Showa + { 1317, 2, 3 }, // Bunpo + { 1319, 4, 28 }, // Geno 150 + { 1321, 2, 23 }, // Genkyo + { 1324, 12, 9 }, // Shochu + { 1326, 4, 26 }, // Kareki + { 1329, 8, 29 }, // Gentoku + { 1331, 8, 9 }, // Genko + { 1334, 1, 29 }, // Kemmu + { 1336, 2, 29 }, // Engen + { 1340, 4, 28 }, // Kokoku + { 1346, 12, 8 }, // Shohei + { 1370, 7, 24 }, // Kentoku 160 + { 1372, 4, 1 }, // Bunch\u0169 + { 1375, 5, 27 }, // Tenju + { 1379, 3, 22 }, // Koryaku + { 1381, 2, 10 }, // Kowa + { 1384, 4, 28 }, // Gench\u0169 + { 1384, 2, 27 }, // Meitoku + { 1387, 8, 23 }, // Kakei + { 1389, 2, 9 }, // Koo + { 1390, 3, 26 }, // Meitoku + { 1394, 7, 5 }, // Oei 170 + { 1428, 4, 27 }, // Shocho + { 1429, 9, 5 }, // Eikyo + { 1441, 2, 17 }, // Kakitsu + { 1444, 2, 5 }, // Bun-an + { 1449, 7, 28 }, // Hotoku + { 1452, 7, 25 }, // Kyotoku + { 1455, 7, 25 }, // Kosho + { 1457, 9, 28 }, // Choroku + { 1460, 12, 21 }, // Kansho + { 1466, 2, 28 }, // Bunsho 180 + { 1467, 3, 3 }, // Onin + { 1469, 4, 28 }, // Bunmei + { 1487, 7, 29 }, // Chokyo + { 1489, 8, 21 }, // Entoku + { 1492, 7, 19 }, // Meio + { 1501, 2, 29 }, // Bunki + { 1504, 2, 30 }, // Eisho + { 1521, 8, 23 }, // Taiei + { 1528, 8, 20 }, // Kyoroku + { 1532, 7, 29 }, // Tenmon 190 + { 1555, 10, 23 }, // Koji + { 1558, 2, 28 }, // Eiroku + { 1570, 4, 23 }, // Genki + { 1573, 7, 28 }, // Tensho + { 1592, 12, 8 }, // Bunroku + { 1596, 10, 27 }, // Keicho + { 1615, 7, 13 }, // Genwa + { 1624, 2, 30 }, // Kan-ei + { 1644, 12, 16 }, // Shoho + { 1648, 2, 15 }, // Keian 200 + { 1652, 9, 18 }, // Shoo + { 1655, 4, 13 }, // Meiryaku + { 1658, 7, 23 }, // Manji + { 1661, 4, 25 }, // Kanbun + { 1673, 9, 21 }, // Enpo + { 1681, 9, 29 }, // Tenwa + { 1684, 2, 21 }, // Jokyo + { 1688, 9, 30 }, // Genroku + { 1704, 3, 13 }, // Hoei + { 1711, 4, 25 }, // Shotoku 210 + { 1716, 6, 22 }, // Kyoho + { 1736, 4, 28 }, // Genbun + { 1741, 2, 27 }, // Kanpo + { 1744, 2, 21 }, // Enkyo + { 1748, 7, 12 }, // Kan-en + { 1751, 10, 27 }, // Horyaku + { 1764, 6, 2 }, // Meiwa + { 1772, 11, 16 }, // An-ei + { 1781, 4, 2 }, // Tenmei + { 1789, 1, 25 }, // Kansei 220 + { 1801, 2, 5 }, // Kyowa + { 1804, 2, 11 }, // Bunka + { 1818, 4, 22 }, // Bunsei + { 1830, 12, 10 }, // Tenpo + { 1844, 12, 2 }, // Koka + { 1848, 2, 28 }, // Kaei + { 1854, 11, 27 }, // Ansei + { 1860, 3, 18 }, // Man-en + { 1861, 2, 19 }, // Bunkyu + { 1864, 2, 20 }, // Genji 230 + { 1865, 4, 7 }, // Keio 231 + { 1868, 9, 8 }, // Meiji 232 + { 1912, 7, 30 }, // Taisho 233 + { 1926, 12, 25 }, // Showa 234 + { 1989, 1, 8 } // Heisei 235 +}; + +#define kEraCount UPRV_LENGTHOF(kEraInfo) + +/** + * The current era, for reference. + */ +static const int32_t kCurrentEra = (kEraCount-1); // int32_t to match the calendar field type + +static const int32_t kGregorianEpoch = 1970; // used as the default value of EXTENDED_YEAR + +/* Some platforms don't like to export constants, like old Palm OS and some z/OS configurations. */ +uint32_t JapaneseCalendar::getCurrentEra() { + return kCurrentEra; +} JapaneseCalendar::JapaneseCalendar(const Locale& aLocale, UErrorCode& success) - : GregorianCalendar(aLocale, success) +: GregorianCalendar(aLocale, success) { setTimeInMillis(getNow(), success); // Call this again now that the vtable is set up properly. } @@ -289,230 +302,230 @@ JapaneseCalendar::~JapaneseCalendar() } JapaneseCalendar::JapaneseCalendar(const JapaneseCalendar& source) - : GregorianCalendar(source) +: GregorianCalendar(source) { } JapaneseCalendar& JapaneseCalendar::operator= ( const JapaneseCalendar& right) { - GregorianCalendar::operator=(right); - return *this; + GregorianCalendar::operator=(right); + return *this; } Calendar* JapaneseCalendar::clone(void) const { - return new JapaneseCalendar(*this); + return new JapaneseCalendar(*this); } const char *JapaneseCalendar::getType() const { - return "japanese"; + return "japanese"; } - -int32_t -JapaneseCalendar::getMaximum(UCalendarDateFields field) const +int32_t JapaneseCalendar::getDefaultMonthInYear(int32_t eyear) { - if(field == UCAL_ERA) { - return kCurrentEra; - } else { - return GregorianCalendar::getMaximum(field); - } -} + int32_t era = internalGetEra(); + // TODO do we assume we can trust 'era'? What if it is denormalized? -int32_t -JapaneseCalendar::getLeastMaximum(UCalendarDateFields field) const -{ - if(field == UCAL_ERA) { - return kCurrentEra; - } else { - return GregorianCalendar::getLeastMaximum(field); - } -} + int32_t month = 0; -int32_t -JapaneseCalendar::monthLength(int32_t month, int32_t year) const -{ - return GregorianCalendar::monthLength(month,year); -} + // Find out if we are at the edge of an era + if(eyear == kEraInfo[era].year) { + // Yes, we're in the first year of this era. + return kEraInfo[era].month-1; + } -int32_t -JapaneseCalendar::monthLength(int32_t month) const -{ - UErrorCode status = U_ZERO_ERROR; - int32_t year = internalGet(UCAL_YEAR); - // ignore era - return GregorianCalendar::monthLength(month, getGregorianYear(status)); + return month; } -int32_t JapaneseCalendar::getDefaultMonthInYear() const +int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t eyear, int32_t month) { - UErrorCode status = U_ZERO_ERROR; - int32_t era = internalGetEra(); - int32_t year = getGregorianYear(status); - // TODO do we assume we can trust 'era'? What if it is denormalized? - - int32_t month = GregorianCalendar::getDefaultMonthInYear(); - - // Find out if we are at the edge of an era - - if(year == kEraInfo[era].year) { - // Yes, we're in the first year of this era. - return kEraInfo[era].month-1; - } + int32_t era = internalGetEra(); + int32_t day = 1; - if(era < kCurrentEra) { - // if we're not in the current era, - // fail_here; - } - - return month; -} - -int32_t JapaneseCalendar::getDefaultDayInMonth(int32_t month) const -{ - UErrorCode status = U_ZERO_ERROR; - int32_t era = internalGetEra(); - int32_t year = getGregorianYear(status); - int32_t day = GregorianCalendar::getDefaultDayInMonth(month); - - if(year == kEraInfo[era].year) { - if(month == (kEraInfo[era].month-1)) { - return kEraInfo[era].day; + if(eyear == kEraInfo[era].year) { + if(month == (kEraInfo[era].month-1)) { + return kEraInfo[era].day; + } } - } - return day; + return day; } int32_t JapaneseCalendar::internalGetEra() const { - return isSet(UCAL_ERA) ? internalGet(UCAL_ERA) : kCurrentEra; + return internalGet(UCAL_ERA, kCurrentEra); } -int32_t -JapaneseCalendar::getGregorianYear(UErrorCode &status) const +int32_t JapaneseCalendar::handleGetExtendedYear() { - int32_t year = (fStamp[UCAL_YEAR] != kUnset) ? internalGet(UCAL_YEAR) : 1; // default year = 1 - int32_t era = kCurrentEra; - if (fStamp[UCAL_ERA] != kUnset) { - era = internalGet(UCAL_ERA); - } - - if ((era<0)||(era>kCurrentEra)) { - status = U_ILLEGAL_ARGUMENT_ERROR; - return 0 ; - } - return year + kEraInfo[era].year - 1; + // EXTENDED_YEAR in JapaneseCalendar is a Gregorian year + // The default value of EXTENDED_YEAR is 1970 (Showa 45) + int32_t year; + + if (newerField(UCAL_EXTENDED_YEAR, UCAL_YEAR) == UCAL_EXTENDED_YEAR && + newerField(UCAL_EXTENDED_YEAR, UCAL_ERA) == UCAL_EXTENDED_YEAR) { + year = internalGet(UCAL_EXTENDED_YEAR, kGregorianEpoch); + } else { + // Subtract one because year starts at 1 + year = internalGet(UCAL_YEAR) + kEraInfo[internalGetEra()].year - 1; + } + return year; } -void JapaneseCalendar::timeToFields(UDate theTime, UBool quick, UErrorCode& status) + +void JapaneseCalendar::handleComputeFields(int32_t julianDay, UErrorCode& status) { - GregorianCalendar::timeToFields(theTime, quick, status); - - // these are the gregorian era and year - int32_t era = internalGet(UCAL_ERA); - int32_t year = internalGet(UCAL_YEAR); - if(era == GregorianCalendar::BC) { - year = 1 - year; - } - - // grego [e+y] -> e+y - int32_t low = 0; - - // Short circuit for recent years. Most modern computations will - // occur in the current era and won't require the binary search. - // Note that if the year is == the current era year, then we use - // the binary search to handle the month/dom comparison. + //Calendar::timeToFields(theTime, quick, status); + GregorianCalendar::handleComputeFields(julianDay, status); + int32_t year = internalGet(UCAL_EXTENDED_YEAR); // Gregorian year + + int32_t low = 0; + + // Short circuit for recent years. Most modern computations will + // occur in the current era and won't require the binary search. + // Note that if the year is == the current era year, then we use + // the binary search to handle the month/dom comparison. #ifdef U_DEBUG_JCAL - fprintf(stderr, "== %d:%d \n", era, year); + fprintf(stderr, "== %d \n", year); #endif - if (year > kEraInfo[kCurrentEra].year) { - low = kCurrentEra; + if (year > kEraInfo[kCurrentEra].year) { + low = kCurrentEra; #ifdef U_DEBUG_JCAL - fprintf(stderr, " low=%d (special)\n", low); + fprintf(stderr, " low=%d (special)\n", low); #endif - } else { - // Binary search - int32_t high = kEraCount; - + } else { + // Binary search + int32_t high = kEraCount; + #ifdef U_DEBUG_JCAL - fprintf(stderr, " high=%d\n", high); + fprintf(stderr, " high=%d\n", high); #endif - while (low < high - 1) { - int32_t i = (low + high) / 2; - int32_t diff = year - kEraInfo[i].year; + while (low < high - 1) { + int32_t i = (low + high) / 2; + int32_t diff = year - kEraInfo[i].year; #ifdef U_DEBUG_JCAL - 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", - diff,low, high, i, kEraInfo[i].month-1, kEraInfo[i].day, kEraInfo[i].year, internalGet(UCAL_MONTH), internalGet(UCAL_DATE),year); + 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", + diff,low, high, i, kEraInfo[i].month-1, kEraInfo[i].day, kEraInfo[i].year, internalGet(UCAL_MONTH), internalGet(UCAL_DATE),year); #endif - - // If years are the same, then compare the months, and if those - // are the same, compare days of month. In the ERAS array - // months are 1-based for easier maintenance. - if (diff == 0) { - diff = internalGet(UCAL_MONTH) - (kEraInfo[i].month - 1); + + // If years are the same, then compare the months, and if those + // are the same, compare days of month. In the ERAS array + // months are 1-based for easier maintenance. + if (diff == 0) { + diff = internalGet(UCAL_MONTH) - (kEraInfo[i].month - 1); #ifdef U_DEBUG_JCAL - fprintf(stderr, "diff now %d (M) = %d - %d - 1\n", diff, internalGet(UCAL_MONTH), kEraInfo[i].month); + fprintf(stderr, "diff now %d (M) = %d - %d - 1\n", diff, internalGet(UCAL_MONTH), kEraInfo[i].month); #endif - if (diff == 0) { - diff = internalGet(UCAL_DATE) - kEraInfo[i].day; + if (diff == 0) { + diff = internalGet(UCAL_DATE) - kEraInfo[i].day; #ifdef U_DEBUG_JCAL - fprintf(stderr, "diff now %d (D)\n", diff); + fprintf(stderr, "diff now %d (D)\n", diff); #endif - } - } - if (diff >= 0) { - low = i; - } else { - high = i; - } + } + } + if (diff >= 0) { + low = i; + } else { + high = i; + } #ifdef U_DEBUG_JCAL - fprintf(stderr, ". low=%d, high=%d, i=%d, diff=%d.. %d\n", low, high, i, diff, year); + fprintf(stderr, ". low=%d, high=%d, i=%d, diff=%d.. %d\n", low, high, i, diff, year); #endif + } } - } #ifdef U_DEBUG_JCAL - fprintf(stderr, " low[era]=%d,.. %d\n", low, year); + fprintf(stderr, " low[era]=%d,.. %d\n", low, year); #endif - // Now we've found the last era that starts before this date, so - // adjust the year to count from the start of that era. Note that - // all dates before the first era will fall into the first era by - // the algorithm. - - internalSet(UCAL_ERA, low); - internalSet(UCAL_YEAR, year - kEraInfo[low].year + 1); + // Now we've found the last era that starts before this date, so + // adjust the year to count from the start of that era. Note that + // all dates before the first era will fall into the first era by + // the algorithm. + + internalSet(UCAL_ERA, low); + internalSet(UCAL_YEAR, year - kEraInfo[low].year + 1); #ifdef U_DEBUG_JCAL - fprintf(stderr, " Set ERA=%d, year=%d\n", low, year-kEraInfo[low].year+1); + fprintf(stderr, " Set ERA=%d, year=%d\n", low, year-kEraInfo[low].year+1); #endif } /* - Disable pivoting +Disable pivoting */ UBool JapaneseCalendar::haveDefaultCentury() const { - return FALSE; + return FALSE; } UDate JapaneseCalendar::defaultCenturyStart() const { - return 0;// WRONG + return 0;// WRONG } int32_t JapaneseCalendar::defaultCenturyStartYear() const { - return 0; + return 0; } +int32_t JapaneseCalendar::handleGetLimit(UCalendarDateFields field, ELimitType limitType) const +{ + switch(field) { + case UCAL_ERA: + if (limitType == UCAL_LIMIT_MINIMUM || limitType == UCAL_LIMIT_GREATEST_MINIMUM) { + return 0; + } + return kCurrentEra; + case UCAL_YEAR: + { + switch (limitType) { + case UCAL_LIMIT_MINIMUM: + case UCAL_LIMIT_GREATEST_MINIMUM: + return 1; + case UCAL_LIMIT_LEAST_MAXIMUM: + return 1; + case UCAL_LIMIT_COUNT: //added to avoid warning + case UCAL_LIMIT_MAXIMUM: + return GregorianCalendar::handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM) - kEraInfo[kCurrentEra].year; + default: + return 1; // Error condition, invalid limitType + } + } + default: + return GregorianCalendar::handleGetLimit(field,limitType); + } +} +int32_t JapaneseCalendar::getActualMaximum(UCalendarDateFields field, UErrorCode& status) const { + if (field == UCAL_YEAR) { + int32_t era = get(UCAL_ERA, status); + if (U_FAILURE(status)) { + return 0; // error case... any value + } + if (era == kCurrentEra) { + // TODO: Investigate what value should be used here - revisit after 4.0. + return handleGetLimit(UCAL_YEAR, UCAL_LIMIT_MAXIMUM); + } else { + int32_t nextEraYear = kEraInfo[era + 1].year; + int32_t nextEraMonth = kEraInfo[era + 1].month; + int32_t nextEraDate = kEraInfo[era + 1].day; + + int32_t maxYear = nextEraYear - kEraInfo[era].year + 1; // 1-base + if (nextEraMonth == 1 && nextEraDate == 1) { + // Subtract 1, because the next era starts at Jan 1 + maxYear--; + } + return maxYear; + } + } + return GregorianCalendar::getActualMaximum(field, status); +} U_NAMESPACE_END