]> granicus.if.org Git - icu/commitdiff
ICU-10936 J umalqura: Speedup for IslamicCalendar.yearStart, add conversion accuracy...
authorPeter Edberg <pedberg@unicode.org>
Thu, 5 Mar 2015 04:10:35 +0000 (04:10 +0000)
committerPeter Edberg <pedberg@unicode.org>
Thu, 5 Mar 2015 04:10:35 +0000 (04:10 +0000)
X-SVN-Rev: 37141

icu4j/main/classes/core/src/com/ibm/icu/util/IslamicCalendar.java
icu4j/main/tests/core/src/com/ibm/icu/dev/test/calendar/IslamicTest.java

index 770cc44b88ac36b7cdd4f2582a292e846c61ae1f..693145ead60037283f12bdeafb6e20486dc7d6aa 100644 (file)
@@ -515,6 +515,41 @@ public class IslamicCalendar extends Calendar {
     // Assorted calculation utilities
     //
 
+       // we could compress this down more if we need to
+       private static final byte[] UMALQURA_YEAR_START_ESTIMATE_FIX = {
+                0,  0, -1,  0, -1,  0,  0,  0,  0,  0, // 1300..
+               -1,  0,  0,  0,  0,  0,  0,  0, -1,  0, // 1310..
+                1,  0,  1,  1,  0,  0,  0,  0,  1,  0, // 1320..
+                0,  0,  0,  0,  0,  0,  1,  0,  0,  0, // 1330..
+                0,  0,  1,  0,  0, -1, -1,  0,  0,  0, // 1340..
+                1,  0,  0, -1,  0,  0,  0,  1,  1,  0, // 1350..
+                0,  0,  0,  0,  0,  0,  0, -1,  0,  0, // 1360..
+                0,  1,  1,  0,  0, -1,  0,  1,  0,  1, // 1370..
+                1,  0,  0, -1,  0,  1,  0,  0,  0, -1, // 1380..
+                0,  1,  0,  1,  0,  0,  0, -1,  0,  0, // 1390..
+                0,  0, -1, -1,  0, -1,  0,  1,  0,  0, // 1400..
+                0, -1,  0,  0,  0,  1,  0,  0,  0,  0, // 1410..
+                0,  1,  0,  0, -1, -1,  0,  0,  0,  1, // 1420..
+                0,  0, -1, -1,  0, -1,  0,  0, -1, -1, // 1430..
+                0, -1,  0, -1,  0,  0, -1, -1,  0,  0, // 1440..
+                0,  0,  0,  0, -1,  0,  1,  0,  1,  1, // 1450..
+                0,  0, -1,  0,  1,  0,  0,  0,  0,  0, // 1460..
+                1,  0,  1,  0,  0,  0, -1,  0,  1,  0, // 1470..
+                0, -1, -1,  0,  0,  0,  1,  0,  0,  0, // 1480..
+                0,  0,  0,  0,  1,  0,  0,  0,  0,  0, // 1490..
+                1,  0,  0, -1,  0,  0,  0,  1,  1,  0, // 1500..
+                0, -1,  0,  1,  0,  1,  1,  0,  0,  0, // 1510..
+                0,  1,  0,  0,  0, -1,  0,  0,  0,  1, // 1520..
+                0,  0,  0, -1,  0,  0,  0,  0,  0, -1, // 1530..
+                0, -1,  0,  1,  0,  0,  0, -1,  0,  1, // 1540..
+                0,  1,  0,  0,  0,  0,  0,  1,  0,  0, // 1550..
+               -1,  0,  0,  0,  0,  1,  0,  0,  0, -1, // 1560..
+                0,  0,  0,  0, -1, -1,  0, -1,  0,  1, // 1570..
+                0,  0, -1, -1,  0,  0,  1,  1,  0,  0, // 1580..
+               -1,  0,  0,  0,  0,  1,  0,  0,  0,  0, // 1590..
+                1 // 1600
+       };
+
 // Unused code - Alan 2003-05
 //    /**
 //     * Find the day of the week for a given day
@@ -550,15 +585,15 @@ public class IslamicCalendar extends Calendar {
         if (cType == CalculationType.ISLAMIC_CIVIL
                 || cType == CalculationType.ISLAMIC_TBLA
                 || (cType == CalculationType.ISLAMIC_UMALQURA && (year < UMALQURA_YEAR_START || year > UMALQURA_YEAR_END))) {
-             ys = (year-1)*354 + (long)Math.floor((3+11*year)/30.0);
+            ys = (year-1)*354 + (long)Math.floor((3+11*year)/30.0);
         } else if(cType == CalculationType.ISLAMIC) {
-             ys = trueMonthStart(12*(year-1));
+            ys = trueMonthStart(12*(year-1));
         } else if(cType == CalculationType.ISLAMIC_UMALQURA){
-             ys = yearStart(UMALQURA_YEAR_START -1);  
-             ys += handleGetYearLength(UMALQURA_YEAR_START -1);
-             for(int i=UMALQURA_YEAR_START; i< year; i++) {
-                ys+= handleGetYearLength(i);
-            }
+            year -= UMALQURA_YEAR_START;
+            // rounded least-squares fit of the dates previously calculated from UMALQURA_MONTHLENGTH iteration
+            int yrStartLinearEstimate = (int)((354.36720 * (double)year) + 460322.05 + 0.5);
+            // need a slight correction to some
+            ys = yrStartLinearEstimate + UMALQURA_YEAR_START_ESTIMATE_FIX[year];
         }
         return ys;
     }
index c843af7feb95f6b89fdff632299dd1e641714a9e..ad83e3a34b426df27d3d53621c1887a60384cbd7 100644 (file)
@@ -18,6 +18,7 @@ import com.ibm.icu.impl.LocaleUtility;
 import com.ibm.icu.text.DateFormat;
 import com.ibm.icu.text.SimpleDateFormat;
 import com.ibm.icu.util.Calendar;
+import com.ibm.icu.util.GregorianCalendar;
 import com.ibm.icu.util.IslamicCalendar;
 import com.ibm.icu.util.IslamicCalendar.CalculationType;
 import com.ibm.icu.util.TimeZone;
@@ -361,6 +362,433 @@ public class IslamicTest extends CalendarTest {
     
     
     public void TestIslamicUmAlQura() {
+
+        class GregoUmmAlQuraMap {
+            public int gYear;
+            public int gMon; // 1-based
+            public int gDay;
+            public int uYear;
+            public int uMon; // 1-based
+            public int uDay;
+             // Simple constructor
+            public GregoUmmAlQuraMap(int gY, int gM, int gD, int uY, int uM, int uD) {
+                gYear = gY;
+                gMon  = gM;
+                gDay  = gD;
+                uYear = uY;
+                uMon  = uM;
+                uDay  = uD;
+            }
+        };
+        // data from
+        // Official Umm-al-Qura calendar of SA:
+        // home, http://www.ummulqura.org.sa/default.aspx
+        // converter, http://www.ummulqura.org.sa/Index.aspx
+        final GregoUmmAlQuraMap[] guMappings = {
+                //                     gregorian,    ummAlQura
+                //                     year mo da,   year mo da
+                //                     (using 1-based months here)
+                new GregoUmmAlQuraMap( 1882,11,12,   1300, 1, 1 ),
+                new GregoUmmAlQuraMap( 1892, 7,25,   1310, 1, 1 ),
+                new GregoUmmAlQuraMap( 1896, 6,12,   1314, 1, 1 ),
+                new GregoUmmAlQuraMap( 1898, 5,22,   1316, 1, 1 ),
+                new GregoUmmAlQuraMap( 1900, 4,30,   1318, 1, 1 ),
+                new GregoUmmAlQuraMap( 1901, 4,20,   1319, 1, 1 ),
+                new GregoUmmAlQuraMap( 1902, 4,10,   1320, 1, 1 ),
+                new GregoUmmAlQuraMap( 1903, 3,30,   1321, 1, 1 ),
+                new GregoUmmAlQuraMap( 1904, 3,19,   1322, 1, 1 ),
+                new GregoUmmAlQuraMap( 1905, 3, 8,   1323, 1, 1 ),
+                new GregoUmmAlQuraMap( 1906, 2,25,   1324, 1, 1 ),
+                new GregoUmmAlQuraMap( 1907, 2,14,   1325, 1, 1 ),
+                new GregoUmmAlQuraMap( 1908, 2, 4,   1326, 1, 1 ),
+                new GregoUmmAlQuraMap( 1909, 1,23,   1327, 1, 1 ),
+                new GregoUmmAlQuraMap( 1910, 1,13,   1328, 1, 1 ),
+                new GregoUmmAlQuraMap( 1911, 1, 2,   1329, 1, 1 ),
+                new GregoUmmAlQuraMap( 1911,12,22,   1330, 1, 1 ),
+                new GregoUmmAlQuraMap( 1912,12,10,   1331, 1, 1 ),
+                new GregoUmmAlQuraMap( 1913,11,30,   1332, 1, 1 ),
+                new GregoUmmAlQuraMap( 1914,11,19,   1333, 1, 1 ),
+                new GregoUmmAlQuraMap( 1915,11, 9,   1334, 1, 1 ),
+                new GregoUmmAlQuraMap( 1916,10,28,   1335, 1, 1 ),
+                new GregoUmmAlQuraMap( 1917,10,18,   1336, 1, 1 ),
+                new GregoUmmAlQuraMap( 1918,10, 7,   1337, 1, 1 ),
+                new GregoUmmAlQuraMap( 1919, 9,26,   1338, 1, 1 ),
+                new GregoUmmAlQuraMap( 1920, 9,14,   1339, 1, 1 ),
+                new GregoUmmAlQuraMap( 1921, 9, 4,   1340, 1, 1 ),
+                new GregoUmmAlQuraMap( 1922, 8,24,   1341, 1, 1 ),
+                new GregoUmmAlQuraMap( 1923, 8,14,   1342, 1, 1 ),
+                new GregoUmmAlQuraMap( 1924, 8, 2,   1343, 1, 1 ),
+                new GregoUmmAlQuraMap( 1925, 7,22,   1344, 1, 1 ),
+                new GregoUmmAlQuraMap( 1926, 7,11,   1345, 1, 1 ),
+                new GregoUmmAlQuraMap( 1927, 6,30,   1346, 1, 1 ),
+                new GregoUmmAlQuraMap( 1928, 6,19,   1347, 1, 1 ),
+                new GregoUmmAlQuraMap( 1929, 6, 9,   1348, 1, 1 ),
+                new GregoUmmAlQuraMap( 1930, 5,29,   1349, 1, 1 ),
+                new GregoUmmAlQuraMap( 1931, 5,19,   1350, 1, 1 ),
+                new GregoUmmAlQuraMap( 1932, 5, 7,   1351, 1, 1 ),
+                new GregoUmmAlQuraMap( 1933, 4,26,   1352, 1, 1 ),
+                new GregoUmmAlQuraMap( 1934, 4,15,   1353, 1, 1 ),
+                new GregoUmmAlQuraMap( 1935, 4, 5,   1354, 1, 1 ),
+                new GregoUmmAlQuraMap( 1936, 3,24,   1355, 1, 1 ),
+                new GregoUmmAlQuraMap( 1937, 3,14,   1356, 1, 1 ),
+                new GregoUmmAlQuraMap( 1938, 3, 4,   1357, 1, 1 ),
+                new GregoUmmAlQuraMap( 1939, 2,21,   1358, 1, 1 ),
+                new GregoUmmAlQuraMap( 1940, 2,10,   1359, 1, 1 ),
+                new GregoUmmAlQuraMap( 1941, 1,29,   1360, 1, 1 ),
+                new GregoUmmAlQuraMap( 1942, 1,18,   1361, 1, 1 ),
+                new GregoUmmAlQuraMap( 1943, 1, 8,   1362, 1, 1 ),
+                new GregoUmmAlQuraMap( 1943,12,28,   1363, 1, 1 ),
+                new GregoUmmAlQuraMap( 1944,12,17,   1364, 1, 1 ),
+                new GregoUmmAlQuraMap( 1945,12, 6,   1365, 1, 1 ),
+                new GregoUmmAlQuraMap( 1946,11,25,   1366, 1, 1 ),
+                new GregoUmmAlQuraMap( 1947,11,14,   1367, 1, 1 ),
+                new GregoUmmAlQuraMap( 1948,11, 3,   1368, 1, 1 ),
+                new GregoUmmAlQuraMap( 1949,10,23,   1369, 1, 1 ),
+                new GregoUmmAlQuraMap( 1950,10,13,   1370, 1, 1 ),
+                new GregoUmmAlQuraMap( 1951,10, 3,   1371, 1, 1 ),
+                new GregoUmmAlQuraMap( 1952, 9,21,   1372, 1, 1 ),
+                new GregoUmmAlQuraMap( 1953, 9,10,   1373, 1, 1 ),
+                new GregoUmmAlQuraMap( 1954, 8,30,   1374, 1, 1 ),
+                new GregoUmmAlQuraMap( 1955, 8,19,   1375, 1, 1 ),
+                new GregoUmmAlQuraMap( 1956, 8, 8,   1376, 1, 1 ),
+                new GregoUmmAlQuraMap( 1957, 7,29,   1377, 1, 1 ),
+                new GregoUmmAlQuraMap( 1958, 7,18,   1378, 1, 1 ),
+                new GregoUmmAlQuraMap( 1959, 7, 8,   1379, 1, 1 ),
+                new GregoUmmAlQuraMap( 1960, 6,26,   1380, 1, 1 ),
+                new GregoUmmAlQuraMap( 1961, 6,15,   1381, 1, 1 ),
+                new GregoUmmAlQuraMap( 1962, 6, 4,   1382, 1, 1 ),
+                new GregoUmmAlQuraMap( 1963, 5,24,   1383, 1, 1 ),
+                new GregoUmmAlQuraMap( 1964, 5,13,   1384, 1, 1 ),
+                new GregoUmmAlQuraMap( 1965, 5, 3,   1385, 1, 1 ),
+                new GregoUmmAlQuraMap( 1966, 4,22,   1386, 1, 1 ),
+                new GregoUmmAlQuraMap( 1967, 4,11,   1387, 1, 1 ),
+                new GregoUmmAlQuraMap( 1968, 3,30,   1388, 1, 1 ),
+                new GregoUmmAlQuraMap( 1969, 3,19,   1389, 1, 1 ),
+                new GregoUmmAlQuraMap( 1970, 3, 9,   1390, 1, 1 ),
+                new GregoUmmAlQuraMap( 1971, 2,27,   1391, 1, 1 ),
+                new GregoUmmAlQuraMap( 1972, 2,16,   1392, 1, 1 ),
+                new GregoUmmAlQuraMap( 1973, 2, 5,   1393, 1, 1 ),
+                new GregoUmmAlQuraMap( 1974, 1,25,   1394, 1, 1 ),
+                new GregoUmmAlQuraMap( 1975, 1,14,   1395, 1, 1 ),
+                new GregoUmmAlQuraMap( 1976, 1, 3,   1396, 1, 1 ),
+                new GregoUmmAlQuraMap( 1976,12,22,   1397, 1, 1 ),
+                new GregoUmmAlQuraMap( 1977,12,12,   1398, 1, 1 ),
+                new GregoUmmAlQuraMap( 1978,12, 1,   1399, 1, 1 ),
+                new GregoUmmAlQuraMap( 1979,11,21,   1400, 1, 1 ),
+                new GregoUmmAlQuraMap( 1980,11, 9,   1401, 1, 1 ),
+                new GregoUmmAlQuraMap( 1981,10,29,   1402, 1, 1 ),
+                new GregoUmmAlQuraMap( 1982,10,18,   1403, 1, 1 ),
+                new GregoUmmAlQuraMap( 1983,10, 8,   1404, 1, 1 ),
+                new GregoUmmAlQuraMap( 1984, 9,26,   1405, 1, 1 ),
+                new GregoUmmAlQuraMap( 1985, 9,16,   1406, 1, 1 ),
+                new GregoUmmAlQuraMap( 1986, 9, 6,   1407, 1, 1 ),
+                new GregoUmmAlQuraMap( 1987, 8,26,   1408, 1, 1 ),
+                new GregoUmmAlQuraMap( 1988, 8,14,   1409, 1, 1 ),
+                new GregoUmmAlQuraMap( 1989, 8, 3,   1410, 1, 1 ),
+                new GregoUmmAlQuraMap( 1990, 7,23,   1411, 1, 1 ),
+                new GregoUmmAlQuraMap( 1991, 7,13,   1412, 1, 1 ),
+                new GregoUmmAlQuraMap( 1992, 7, 2,   1413, 1, 1 ),
+                new GregoUmmAlQuraMap( 1993, 6,21,   1414, 1, 1 ),
+                new GregoUmmAlQuraMap( 1994, 6,11,   1415, 1, 1 ),
+                new GregoUmmAlQuraMap( 1995, 5,31,   1416, 1, 1 ),
+                new GregoUmmAlQuraMap( 1996, 5,19,   1417, 1, 1 ),
+                new GregoUmmAlQuraMap( 1997, 5, 8,   1418, 1, 1 ),
+                new GregoUmmAlQuraMap( 1998, 4,28,   1419, 1, 1 ),
+                new GregoUmmAlQuraMap( 1999, 4,17,   1420, 1, 1 ),
+                new GregoUmmAlQuraMap( 1999, 5,16,   1420, 2, 1 ),
+                new GregoUmmAlQuraMap( 1999, 6,15,   1420, 3, 1 ),
+                new GregoUmmAlQuraMap( 1999, 7,14,   1420, 4, 1 ),
+                new GregoUmmAlQuraMap( 1999, 8,12,   1420, 5, 1 ),
+                new GregoUmmAlQuraMap( 1999, 9,11,   1420, 6, 1 ),
+                new GregoUmmAlQuraMap( 1999,10,10,   1420, 7, 1 ),
+                new GregoUmmAlQuraMap( 1999,11, 9,   1420, 8, 1 ),
+                new GregoUmmAlQuraMap( 1999,12, 9,   1420, 9, 1 ),
+                new GregoUmmAlQuraMap( 2000, 1, 8,   1420,10, 1 ),
+                new GregoUmmAlQuraMap( 2000, 2, 7,   1420,11, 1 ),
+                new GregoUmmAlQuraMap( 2000, 3, 7,   1420,12, 1 ),
+                new GregoUmmAlQuraMap( 2000, 4, 6,   1421, 1, 1 ),
+                new GregoUmmAlQuraMap( 2000, 5, 5,   1421, 2, 1 ),
+                new GregoUmmAlQuraMap( 2000, 6, 3,   1421, 3, 1 ),
+                new GregoUmmAlQuraMap( 2000, 7, 3,   1421, 4, 1 ),
+                new GregoUmmAlQuraMap( 2000, 8, 1,   1421, 5, 1 ),
+                new GregoUmmAlQuraMap( 2000, 8,30,   1421, 6, 1 ),
+                new GregoUmmAlQuraMap( 2000, 9,28,   1421, 7, 1 ),
+                new GregoUmmAlQuraMap( 2000,10,28,   1421, 8, 1 ),
+                new GregoUmmAlQuraMap( 2000,11,27,   1421, 9, 1 ),
+                new GregoUmmAlQuraMap( 2000,12,27,   1421,10, 1 ),
+                new GregoUmmAlQuraMap( 2001, 1,26,   1421,11, 1 ),
+                new GregoUmmAlQuraMap( 2001, 2,24,   1421,12, 1 ),
+                new GregoUmmAlQuraMap( 2001, 3,26,   1422, 1, 1 ),
+                new GregoUmmAlQuraMap( 2001, 4,25,   1422, 2, 1 ),
+                new GregoUmmAlQuraMap( 2001, 5,24,   1422, 3, 1 ),
+                new GregoUmmAlQuraMap( 2001, 6,22,   1422, 4, 1 ),
+                new GregoUmmAlQuraMap( 2001, 7,22,   1422, 5, 1 ),
+                new GregoUmmAlQuraMap( 2001, 8,20,   1422, 6, 1 ),
+                new GregoUmmAlQuraMap( 2001, 9,18,   1422, 7, 1 ),
+                new GregoUmmAlQuraMap( 2001,10,17,   1422, 8, 1 ),
+                new GregoUmmAlQuraMap( 2001,11,16,   1422, 9, 1 ),
+                new GregoUmmAlQuraMap( 2001,12,16,   1422,10, 1 ),
+                new GregoUmmAlQuraMap( 2002, 1,15,   1422,11, 1 ),
+                new GregoUmmAlQuraMap( 2002, 2,13,   1422,12, 1 ),
+                new GregoUmmAlQuraMap( 2002, 3,15,   1423, 1, 1 ),
+                new GregoUmmAlQuraMap( 2002, 4,14,   1423, 2, 1 ),
+                new GregoUmmAlQuraMap( 2002, 5,13,   1423, 3, 1 ),
+                new GregoUmmAlQuraMap( 2002, 6,12,   1423, 4, 1 ),
+                new GregoUmmAlQuraMap( 2002, 7,11,   1423, 5, 1 ),
+                new GregoUmmAlQuraMap( 2002, 8,10,   1423, 6, 1 ),
+                new GregoUmmAlQuraMap( 2002, 9, 8,   1423, 7, 1 ),
+                new GregoUmmAlQuraMap( 2002,10, 7,   1423, 8, 1 ),
+                new GregoUmmAlQuraMap( 2002,11, 6,   1423, 9, 1 ),
+                new GregoUmmAlQuraMap( 2002,12, 5,   1423,10, 1 ),
+                new GregoUmmAlQuraMap( 2003, 1, 4,   1423,11, 1 ),
+                new GregoUmmAlQuraMap( 2003, 2, 2,   1423,12, 1 ),
+                new GregoUmmAlQuraMap( 2003, 3, 4,   1424, 1, 1 ),
+                new GregoUmmAlQuraMap( 2003, 4, 3,   1424, 2, 1 ),
+                new GregoUmmAlQuraMap( 2003, 5, 2,   1424, 3, 1 ),
+                new GregoUmmAlQuraMap( 2003, 6, 1,   1424, 4, 1 ),
+                new GregoUmmAlQuraMap( 2003, 7, 1,   1424, 5, 1 ),
+                new GregoUmmAlQuraMap( 2003, 7,30,   1424, 6, 1 ),
+                new GregoUmmAlQuraMap( 2003, 8,29,   1424, 7, 1 ),
+                new GregoUmmAlQuraMap( 2003, 9,27,   1424, 8, 1 ),
+                new GregoUmmAlQuraMap( 2003,10,26,   1424, 9, 1 ),
+                new GregoUmmAlQuraMap( 2003,11,25,   1424,10, 1 ),
+                new GregoUmmAlQuraMap( 2003,12,24,   1424,11, 1 ),
+                new GregoUmmAlQuraMap( 2004, 1,23,   1424,12, 1 ),
+                new GregoUmmAlQuraMap( 2004, 2,21,   1425, 1, 1 ),
+                new GregoUmmAlQuraMap( 2004, 3,22,   1425, 2, 1 ),
+                new GregoUmmAlQuraMap( 2004, 4,20,   1425, 3, 1 ),
+                new GregoUmmAlQuraMap( 2004, 5,20,   1425, 4, 1 ),
+                new GregoUmmAlQuraMap( 2004, 6,19,   1425, 5, 1 ),
+                new GregoUmmAlQuraMap( 2004, 7,18,   1425, 6, 1 ),
+                new GregoUmmAlQuraMap( 2004, 8,17,   1425, 7, 1 ),
+                new GregoUmmAlQuraMap( 2004, 9,15,   1425, 8, 1 ),
+                new GregoUmmAlQuraMap( 2004,10,15,   1425, 9, 1 ),
+                new GregoUmmAlQuraMap( 2004,11,14,   1425,10, 1 ),
+                new GregoUmmAlQuraMap( 2004,12,13,   1425,11, 1 ),
+                new GregoUmmAlQuraMap( 2005, 1,12,   1425,12, 1 ),
+                new GregoUmmAlQuraMap( 2005, 2,10,   1426, 1, 1 ),
+                new GregoUmmAlQuraMap( 2005, 3,11,   1426, 2, 1 ),
+                new GregoUmmAlQuraMap( 2005, 4,10,   1426, 3, 1 ),
+                new GregoUmmAlQuraMap( 2005, 5, 9,   1426, 4, 1 ),
+                new GregoUmmAlQuraMap( 2005, 6, 8,   1426, 5, 1 ),
+                new GregoUmmAlQuraMap( 2005, 7, 7,   1426, 6, 1 ),
+                new GregoUmmAlQuraMap( 2005, 8, 6,   1426, 7, 1 ),
+                new GregoUmmAlQuraMap( 2005, 9, 5,   1426, 8, 1 ),
+                new GregoUmmAlQuraMap( 2005,10, 4,   1426, 9, 1 ),
+                new GregoUmmAlQuraMap( 2005,11, 3,   1426,10, 1 ),
+                new GregoUmmAlQuraMap( 2005,12, 3,   1426,11, 1 ),
+                new GregoUmmAlQuraMap( 2006, 1, 1,   1426,12, 1 ),
+                new GregoUmmAlQuraMap( 2006, 1,31,   1427, 1, 1 ),
+                new GregoUmmAlQuraMap( 2006, 3, 1,   1427, 2, 1 ),
+                new GregoUmmAlQuraMap( 2006, 3,30,   1427, 3, 1 ),
+                new GregoUmmAlQuraMap( 2006, 4,29,   1427, 4, 1 ),
+                new GregoUmmAlQuraMap( 2006, 5,28,   1427, 5, 1 ),
+                new GregoUmmAlQuraMap( 2006, 6,27,   1427, 6, 1 ),
+                new GregoUmmAlQuraMap( 2006, 7,26,   1427, 7, 1 ),
+                new GregoUmmAlQuraMap( 2006, 8,25,   1427, 8, 1 ),
+                new GregoUmmAlQuraMap( 2006, 9,24,   1427, 9, 1 ),
+                new GregoUmmAlQuraMap( 2006,10,23,   1427,10, 1 ),
+                new GregoUmmAlQuraMap( 2006,11,22,   1427,11, 1 ),
+                new GregoUmmAlQuraMap( 2006,12,22,   1427,12, 1 ),
+                new GregoUmmAlQuraMap( 2007, 1,20,   1428, 1, 1 ),
+                new GregoUmmAlQuraMap( 2007, 2,19,   1428, 2, 1 ),
+                new GregoUmmAlQuraMap( 2007, 3,20,   1428, 3, 1 ),
+                new GregoUmmAlQuraMap( 2007, 4,18,   1428, 4, 1 ),
+                new GregoUmmAlQuraMap( 2007, 5,18,   1428, 5, 1 ),
+                new GregoUmmAlQuraMap( 2007, 6,16,   1428, 6, 1 ),
+                new GregoUmmAlQuraMap( 2007, 7,15,   1428, 7, 1 ),
+                new GregoUmmAlQuraMap( 2007, 8,14,   1428, 8, 1 ),
+                new GregoUmmAlQuraMap( 2007, 9,13,   1428, 9, 1 ),
+                new GregoUmmAlQuraMap( 2007,10,13,   1428,10, 1 ),
+                new GregoUmmAlQuraMap( 2007,11,11,   1428,11, 1 ),
+                new GregoUmmAlQuraMap( 2007,12,11,   1428,12, 1 ),
+                new GregoUmmAlQuraMap( 2008, 1,10,   1429, 1, 1 ),
+                new GregoUmmAlQuraMap( 2008, 2, 8,   1429, 2, 1 ),
+                new GregoUmmAlQuraMap( 2008, 3, 9,   1429, 3, 1 ),
+                new GregoUmmAlQuraMap( 2008, 4, 7,   1429, 4, 1 ),
+                new GregoUmmAlQuraMap( 2008, 5, 6,   1429, 5, 1 ),
+                new GregoUmmAlQuraMap( 2008, 6, 5,   1429, 6, 1 ),
+                new GregoUmmAlQuraMap( 2008, 7, 4,   1429, 7, 1 ),
+                new GregoUmmAlQuraMap( 2008, 8, 2,   1429, 8, 1 ),
+                new GregoUmmAlQuraMap( 2008, 9, 1,   1429, 9, 1 ),
+                new GregoUmmAlQuraMap( 2008,10, 1,   1429,10, 1 ),
+                new GregoUmmAlQuraMap( 2008,10,30,   1429,11, 1 ),
+                new GregoUmmAlQuraMap( 2008,11,29,   1429,12, 1 ),
+                new GregoUmmAlQuraMap( 2008,12,29,   1430, 1, 1 ),
+                new GregoUmmAlQuraMap( 2009, 1,27,   1430, 2, 1 ),
+                new GregoUmmAlQuraMap( 2009, 2,26,   1430, 3, 1 ),
+                new GregoUmmAlQuraMap( 2009, 3,28,   1430, 4, 1 ),
+                new GregoUmmAlQuraMap( 2009, 4,26,   1430, 5, 1 ),
+                new GregoUmmAlQuraMap( 2009, 5,25,   1430, 6, 1 ),
+                new GregoUmmAlQuraMap( 2009, 6,24,   1430, 7, 1 ),
+                new GregoUmmAlQuraMap( 2009, 7,23,   1430, 8, 1 ),
+                new GregoUmmAlQuraMap( 2009, 8,22,   1430, 9, 1 ),
+                new GregoUmmAlQuraMap( 2009, 9,20,   1430,10, 1 ),
+                new GregoUmmAlQuraMap( 2009,10,20,   1430,11, 1 ),
+                new GregoUmmAlQuraMap( 2009,11,18,   1430,12, 1 ),
+                new GregoUmmAlQuraMap( 2009,12,18,   1431, 1, 1 ),
+                new GregoUmmAlQuraMap( 2010, 1,16,   1431, 2, 1 ),
+                new GregoUmmAlQuraMap( 2010, 2,15,   1431, 3, 1 ),
+                new GregoUmmAlQuraMap( 2010, 3,17,   1431, 4, 1 ),
+                new GregoUmmAlQuraMap( 2010, 4,15,   1431, 5, 1 ),
+                new GregoUmmAlQuraMap( 2010, 5,15,   1431, 6, 1 ),
+                new GregoUmmAlQuraMap( 2010, 6,13,   1431, 7, 1 ),
+                new GregoUmmAlQuraMap( 2010, 7,13,   1431, 8, 1 ),
+                new GregoUmmAlQuraMap( 2010, 8,11,   1431, 9, 1 ),
+                new GregoUmmAlQuraMap( 2010, 9,10,   1431,10, 1 ),
+                new GregoUmmAlQuraMap( 2010,10, 9,   1431,11, 1 ),
+                new GregoUmmAlQuraMap( 2010,11, 7,   1431,12, 1 ),
+                new GregoUmmAlQuraMap( 2010,12, 7,   1432, 1, 1 ),
+                new GregoUmmAlQuraMap( 2011, 1, 5,   1432, 2, 1 ),
+                new GregoUmmAlQuraMap( 2011, 2, 4,   1432, 3, 1 ),
+                new GregoUmmAlQuraMap( 2011, 3, 6,   1432, 4, 1 ),
+                new GregoUmmAlQuraMap( 2011, 4, 5,   1432, 5, 1 ),
+                new GregoUmmAlQuraMap( 2011, 5, 4,   1432, 6, 1 ),
+                new GregoUmmAlQuraMap( 2011, 6, 3,   1432, 7, 1 ),
+                new GregoUmmAlQuraMap( 2011, 7, 2,   1432, 8, 1 ),
+                new GregoUmmAlQuraMap( 2011, 8, 1,   1432, 9, 1 ),
+                new GregoUmmAlQuraMap( 2011, 8,30,   1432,10, 1 ),
+                new GregoUmmAlQuraMap( 2011, 9,29,   1432,11, 1 ),
+                new GregoUmmAlQuraMap( 2011,10,28,   1432,12, 1 ),
+                new GregoUmmAlQuraMap( 2011,11,26,   1433, 1, 1 ),
+                new GregoUmmAlQuraMap( 2011,12,26,   1433, 2, 1 ),
+                new GregoUmmAlQuraMap( 2012, 1,24,   1433, 3, 1 ),
+                new GregoUmmAlQuraMap( 2012, 2,23,   1433, 4, 1 ),
+                new GregoUmmAlQuraMap( 2012, 3,24,   1433, 5, 1 ),
+                new GregoUmmAlQuraMap( 2012, 4,22,   1433, 6, 1 ),
+                new GregoUmmAlQuraMap( 2012, 5,22,   1433, 7, 1 ),
+                new GregoUmmAlQuraMap( 2012, 6,21,   1433, 8, 1 ),
+                new GregoUmmAlQuraMap( 2012, 7,20,   1433, 9, 1 ),
+                new GregoUmmAlQuraMap( 2012, 8,19,   1433,10, 1 ),
+                new GregoUmmAlQuraMap( 2012, 9,17,   1433,11, 1 ),
+                new GregoUmmAlQuraMap( 2012,10,17,   1433,12, 1 ),
+                new GregoUmmAlQuraMap( 2012,11,15,   1434, 1, 1 ),
+                new GregoUmmAlQuraMap( 2012,12,14,   1434, 2, 1 ),
+                new GregoUmmAlQuraMap( 2013, 1,13,   1434, 3, 1 ),
+                new GregoUmmAlQuraMap( 2013, 2,11,   1434, 4, 1 ),
+                new GregoUmmAlQuraMap( 2013, 3,13,   1434, 5, 1 ),
+                new GregoUmmAlQuraMap( 2013, 4,11,   1434, 6, 1 ),
+                new GregoUmmAlQuraMap( 2013, 5,11,   1434, 7, 1 ),
+                new GregoUmmAlQuraMap( 2013, 6,10,   1434, 8, 1 ),
+                new GregoUmmAlQuraMap( 2013, 7, 9,   1434, 9, 1 ),
+                new GregoUmmAlQuraMap( 2013, 8, 8,   1434,10, 1 ),
+                new GregoUmmAlQuraMap( 2013, 9, 7,   1434,11, 1 ),
+                new GregoUmmAlQuraMap( 2013,10, 6,   1434,12, 1 ),
+                new GregoUmmAlQuraMap( 2013,11, 4,   1435, 1, 1 ),
+                new GregoUmmAlQuraMap( 2013,12, 4,   1435, 2, 1 ),
+                new GregoUmmAlQuraMap( 2014, 1, 2,   1435, 3, 1 ),
+                new GregoUmmAlQuraMap( 2014, 2, 1,   1435, 4, 1 ),
+                new GregoUmmAlQuraMap( 2014, 3, 2,   1435, 5, 1 ),
+                new GregoUmmAlQuraMap( 2014, 4, 1,   1435, 6, 1 ),
+                new GregoUmmAlQuraMap( 2014, 4,30,   1435, 7, 1 ),
+                new GregoUmmAlQuraMap( 2014, 5,30,   1435, 8, 1 ),
+                new GregoUmmAlQuraMap( 2014, 6,28,   1435, 9, 1 ),
+                new GregoUmmAlQuraMap( 2014, 7,28,   1435,10, 1 ),
+                new GregoUmmAlQuraMap( 2014, 8,27,   1435,11, 1 ),
+                new GregoUmmAlQuraMap( 2014, 9,25,   1435,12, 1 ),
+                new GregoUmmAlQuraMap( 2014,10,25,   1436, 1, 1 ),
+                new GregoUmmAlQuraMap( 2014,11,23,   1436, 2, 1 ),
+                new GregoUmmAlQuraMap( 2014,12,23,   1436, 3, 1 ),
+                new GregoUmmAlQuraMap( 2015, 1,21,   1436, 4, 1 ),
+                new GregoUmmAlQuraMap( 2015, 2,20,   1436, 5, 1 ),
+                new GregoUmmAlQuraMap( 2015, 3,21,   1436, 6, 1 ),
+                new GregoUmmAlQuraMap( 2015, 4,20,   1436, 7, 1 ),
+                new GregoUmmAlQuraMap( 2015, 5,19,   1436, 8, 1 ),
+                new GregoUmmAlQuraMap( 2015, 6,18,   1436, 9, 1 ),
+                new GregoUmmAlQuraMap( 2015, 7,17,   1436,10, 1 ),
+                new GregoUmmAlQuraMap( 2015, 8,16,   1436,11, 1 ),
+                new GregoUmmAlQuraMap( 2015, 9,14,   1436,12, 1 ),
+                new GregoUmmAlQuraMap( 2015,10,14,   1437, 1, 1 ),
+                new GregoUmmAlQuraMap( 2015,11,13,   1437, 2, 1 ),
+                new GregoUmmAlQuraMap( 2015,12,12,   1437, 3, 1 ),
+                new GregoUmmAlQuraMap( 2016, 1,11,   1437, 4, 1 ),
+                new GregoUmmAlQuraMap( 2016, 2,10,   1437, 5, 1 ),
+                new GregoUmmAlQuraMap( 2016, 3,10,   1437, 6, 1 ),
+                new GregoUmmAlQuraMap( 2016, 4, 8,   1437, 7, 1 ),
+                new GregoUmmAlQuraMap( 2016, 5, 8,   1437, 8, 1 ),
+                new GregoUmmAlQuraMap( 2016, 6, 6,   1437, 9, 1 ),
+                new GregoUmmAlQuraMap( 2016, 7, 6,   1437,10, 1 ),
+                new GregoUmmAlQuraMap( 2016, 8, 4,   1437,11, 1 ),
+                new GregoUmmAlQuraMap( 2016, 9, 2,   1437,12, 1 ),
+                new GregoUmmAlQuraMap( 2016,10, 2,   1438, 1, 1 ),
+                new GregoUmmAlQuraMap( 2016,11, 1,   1438, 2, 1 ),
+                new GregoUmmAlQuraMap( 2016,11,30,   1438, 3, 1 ),
+                new GregoUmmAlQuraMap( 2016,12,30,   1438, 4, 1 ),
+                new GregoUmmAlQuraMap( 2017, 1,29,   1438, 5, 1 ),
+                new GregoUmmAlQuraMap( 2017, 2,28,   1438, 6, 1 ),
+                new GregoUmmAlQuraMap( 2017, 3,29,   1438, 7, 1 ),
+                new GregoUmmAlQuraMap( 2017, 4,27,   1438, 8, 1 ),
+                new GregoUmmAlQuraMap( 2017, 5,27,   1438, 9, 1 ),
+                new GregoUmmAlQuraMap( 2017, 6,25,   1438,10, 1 ),
+                new GregoUmmAlQuraMap( 2017, 7,24,   1438,11, 1 ),
+                new GregoUmmAlQuraMap( 2017, 8,23,   1438,12, 1 ),
+                new GregoUmmAlQuraMap( 2017, 9,21,   1439, 1, 1 ),
+                new GregoUmmAlQuraMap( 2017,10,21,   1439, 2, 1 ),
+                new GregoUmmAlQuraMap( 2017,11,19,   1439, 3, 1 ),
+                new GregoUmmAlQuraMap( 2017,12,19,   1439, 4, 1 ),
+                new GregoUmmAlQuraMap( 2018, 1,18,   1439, 5, 1 ),
+                new GregoUmmAlQuraMap( 2018, 2,17,   1439, 6, 1 ),
+                new GregoUmmAlQuraMap( 2018, 3,18,   1439, 7, 1 ),
+                new GregoUmmAlQuraMap( 2018, 4,17,   1439, 8, 1 ),
+                new GregoUmmAlQuraMap( 2018, 5,16,   1439, 9, 1 ),
+                new GregoUmmAlQuraMap( 2018, 6,15,   1439,10, 1 ),
+                new GregoUmmAlQuraMap( 2018, 7,14,   1439,11, 1 ),
+                new GregoUmmAlQuraMap( 2018, 8,12,   1439,12, 1 ),
+                new GregoUmmAlQuraMap( 2018, 9,11,   1440, 1, 1 ),
+                new GregoUmmAlQuraMap( 2019, 8,31,   1441, 1, 1 ),
+                new GregoUmmAlQuraMap( 2020, 8,20,   1442, 1, 1 ),
+                new GregoUmmAlQuraMap( 2021, 8, 9,   1443, 1, 1 ),
+                new GregoUmmAlQuraMap( 2022, 7,30,   1444, 1, 1 ),
+                new GregoUmmAlQuraMap( 2023, 7,19,   1445, 1, 1 ),
+                new GregoUmmAlQuraMap( 2024, 7, 7,   1446, 1, 1 ),
+                new GregoUmmAlQuraMap( 2025, 6,26,   1447, 1, 1 ),
+                new GregoUmmAlQuraMap( 2026, 6,16,   1448, 1, 1 ),
+                new GregoUmmAlQuraMap( 2027, 6, 6,   1449, 1, 1 ),
+                new GregoUmmAlQuraMap( 2028, 5,25,   1450, 1, 1 ),
+                new GregoUmmAlQuraMap( 2029, 5,14,   1451, 1, 1 ),
+                new GregoUmmAlQuraMap( 2030, 5, 4,   1452, 1, 1 ),
+                new GregoUmmAlQuraMap( 2031, 4,23,   1453, 1, 1 ),
+                new GregoUmmAlQuraMap( 2032, 4,11,   1454, 1, 1 ),
+                new GregoUmmAlQuraMap( 2033, 4, 1,   1455, 1, 1 ),
+                new GregoUmmAlQuraMap( 2034, 3,22,   1456, 1, 1 ),
+                new GregoUmmAlQuraMap( 2035, 3,11,   1457, 1, 1 ),
+                new GregoUmmAlQuraMap( 2036, 2,29,   1458, 1, 1 ),
+                new GregoUmmAlQuraMap( 2037, 2,17,   1459, 1, 1 ),
+                new GregoUmmAlQuraMap( 2038, 2, 6,   1460, 1, 1 ),
+                new GregoUmmAlQuraMap( 2039, 1,26,   1461, 1, 1 ),
+                new GregoUmmAlQuraMap( 2040, 1,15,   1462, 1, 1 ),
+                new GregoUmmAlQuraMap( 2041, 1, 4,   1463, 1, 1 ),
+                new GregoUmmAlQuraMap( 2041,12,25,   1464, 1, 1 ),
+                new GregoUmmAlQuraMap( 2042,12,14,   1465, 1, 1 ),
+                new GregoUmmAlQuraMap( 2043,12, 3,   1466, 1, 1 ),
+                new GregoUmmAlQuraMap( 2044,11,21,   1467, 1, 1 ),
+                new GregoUmmAlQuraMap( 2045,11,11,   1468, 1, 1 ),
+                new GregoUmmAlQuraMap( 2046,10,31,   1469, 1, 1 ),
+                new GregoUmmAlQuraMap( 2047,10,21,   1470, 1, 1 ),
+                new GregoUmmAlQuraMap( 2048,10, 9,   1471, 1, 1 ),
+                new GregoUmmAlQuraMap( 2049, 9,29,   1472, 1, 1 ),
+                new GregoUmmAlQuraMap( 2050, 9,18,   1473, 1, 1 ),
+                new GregoUmmAlQuraMap( 2051, 9, 7,   1474, 1, 1 ),
+                new GregoUmmAlQuraMap( 2052, 8,26,   1475, 1, 1 ),
+                new GregoUmmAlQuraMap( 2053, 8,15,   1476, 1, 1 ),
+                new GregoUmmAlQuraMap( 2054, 8, 5,   1477, 1, 1 ),
+                new GregoUmmAlQuraMap( 2055, 7,26,   1478, 1, 1 ),
+                new GregoUmmAlQuraMap( 2056, 7,14,   1479, 1, 1 ),
+                new GregoUmmAlQuraMap( 2057, 7, 3,   1480, 1, 1 ),
+                new GregoUmmAlQuraMap( 2058, 6,22,   1481, 1, 1 ),
+                new GregoUmmAlQuraMap( 2059, 6,11,   1482, 1, 1 ),
+                new GregoUmmAlQuraMap( 2061, 5,21,   1484, 1, 1 ),
+                new GregoUmmAlQuraMap( 2063, 4,30,   1486, 1, 1 ),
+                new GregoUmmAlQuraMap( 2065, 4, 7,   1488, 1, 1 ),
+                new GregoUmmAlQuraMap( 2067, 3,17,   1490, 1, 1 ),
+                new GregoUmmAlQuraMap( 2069, 2,23,   1492, 1, 1 ),
+                new GregoUmmAlQuraMap( 2071, 2, 2,   1494, 1, 1 ),
+                new GregoUmmAlQuraMap( 2073, 1,10,   1496, 1, 1 ),
+                new GregoUmmAlQuraMap( 2074,12,20,   1498, 1, 1 ),
+                new GregoUmmAlQuraMap( 2076,11,28,   1500, 1, 1 ),
+        };
+
+
         int firstYear = 1318;
         //*  use either 1 or 2 leading slashes to toggle
         int lastYear = 1368;    // just enough to be pretty sure
@@ -368,7 +796,11 @@ public class IslamicTest extends CalendarTest {
         int lastYear = 1480;    // the whole shootin' match
         //*/
         
-        IslamicCalendar tstCal = newIslamicUmalqura();
+        ULocale umalquraLoc = new ULocale("ar_SA@calendar=islamic-umalqura"); 
+        ULocale gregoLoc = new ULocale("ar_SA@calendar=gregorian"); 
+        TimeZone tzSA = TimeZone.getTimeZone("Asia/Riyadh");
+        IslamicCalendar tstCal = new IslamicCalendar(tzSA, umalquraLoc);
+        GregorianCalendar gregCal = new GregorianCalendar(tzSA, gregoLoc);
         tstCal.clear();
         tstCal.setLenient(false);
         
@@ -422,11 +854,10 @@ public class IslamicTest extends CalendarTest {
         try {
             SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");            
             Date date = formatter.parse("1975-05-06");
-            ULocale islamicLoc = new ULocale("ar_SA@calendar=islamic-umalqura"); 
             IslamicCalendar is_cal = new IslamicCalendar();
             is_cal.setCalculationType(CalculationType.ISLAMIC_UMALQURA);
             is_cal.setTime(date);
-            SimpleDateFormat formatterIslamic = (SimpleDateFormat) is_cal.getDateTimeFormat(0,0,islamicLoc);
+            SimpleDateFormat formatterIslamic = (SimpleDateFormat) is_cal.getDateTimeFormat(0,0,umalquraLoc);
             formatterIslamic.applyPattern("yyyy-MMMM-dd");
             String str = formatterIslamic.format(is_cal.getTime());
 
@@ -444,6 +875,23 @@ public class IslamicTest extends CalendarTest {
         }catch(Exception e){
             errln(e.getLocalizedMessage());
         }
+        
+        // check against data
+        gregCal.clear();
+        tstCal.clear();
+        for (GregoUmmAlQuraMap guMap: guMappings) {
+            gregCal.set(guMap.gYear, guMap.gMon - 1, guMap.gDay, 12, 0);
+            long mapDate = gregCal.getTimeInMillis();
+            tstCal.setTimeInMillis(mapDate);
+            int uYear = tstCal.get(Calendar.YEAR);
+            int uMon  = tstCal.get(Calendar.MONTH) + 1;
+            int uDay  = tstCal.get(Calendar.DATE);
+            if ( uYear != guMap.uYear || uMon != guMap.uMon || uDay != guMap.uDay ) {
+                errln("For gregorian "     + guMap.gYear+"-"+guMap.gMon+"-"+guMap.gDay+
+                      ", expect umalqura " + guMap.uYear+"-"+guMap.uMon+"-"+guMap.uDay+
+                      ", get "             +       uYear+"-"+      uMon+"-"+      uDay);
+            }
+        }
     }
     
     public void TestSerialization8449() {