]> granicus.if.org Git - icu/commitdiff
ICU-10695 (J) Update/expand UMALQURA_MONTHLENGTH, handleComputeMonthStart fix for...
authorPeter Edberg <pedberg@unicode.org>
Tue, 9 Sep 2014 10:28:43 +0000 (10:28 +0000)
committerPeter Edberg <pedberg@unicode.org>
Tue, 9 Sep 2014 10:28:43 +0000 (10:28 +0000)
X-SVN-Rev: 36406

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 10e521f29ae6966253894c236e4d8ebfc00971cd..cf5d26bd568e84584009297d1a5c4a3279e99a7c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2013, International Business Machines Corporation and    *
+ * Copyright (C) 1996-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -171,11 +171,11 @@ public class IslamicCalendar extends Calendar {
     /**
      * Friday EPOC
      */
-    private static final long CIVIL_EPOC = 1948440;
+    private static final long CIVIL_EPOC = 1948440; // CE 622 July 16 Friday (Julian calendar) / CE 622 July 19 (Gregorian calendar)
     /**
      * Thursday EPOC
      */
-    private static final long ASTRONOMICAL_EPOC = 1948439;
+    private static final long ASTRONOMICAL_EPOC = 1948439; // CE 622 July 15 Thursday (Julian calendar)
 
     //-------------------------------------------------------------------------
     // Constructors...
@@ -398,76 +398,110 @@ public class IslamicCalendar extends Calendar {
      * bit map array where a bit turned on represents a month with 30 days. 
      */
     private static final int[] UMALQURA_MONTHLENGTH = {
-        //* 1318 -1322 */ "0101 0111 0100", "1001 0111 0110", "0100 1011 0111", "0010 0101 0111", "0101 0010 1011",
-                               0x0574,           0x0975,           0x06A7,           0x0257,           0x052B,
-        //* 1323 -1327 */ "0110 1001 0101", "0110 1100 1010", "1010 1101 0101", "0101 0101 1011", "0010 0101 1101",
-                               0x0695,           0x06CA,           0x0AD5,           0x055B,           0x025B,
-        //* 1328 -1332 */ "1001 0010 1101", "1100 1001 0101", "1101 0100 1010", "1110 1010 0101", "0110 1101 0010",
-                               0x092D,           0x0C95,           0x0D4A,           0x0E5B,           0x025B,
-        //* 1333 -1337 */ "1010 1101 0101", "0101 0101 1010", "1010 1010 1011", "0100 0100 1011", "0110 1010 0101",
-                               0x0AD5,           0x055A,           0x0AAB,           0x044B,           0x06A5,
-        //* 1338 -1342 */ "0111 0101 0010", "1011 1010 1001", "0011 0111 0100", "1010 1011 0110", "0101 0101 0110",
-                               0x0752,           0x0BA9,           0x0374,           0x0AB6,           0x0556,
-        //* 1343 -1347 */ "1010 1010 1010", "1101 0101 0010", "1101 1010 1001", "0101 1101 0100", "1010 1110 1010",
-                               0x0AAA,           0x0D52,           0x0DA9,           0x05D4,           0x0AEA,
-        //* 1348 -1352 */ "0100 1101 1101", "0010 0110 1110", "1001 0010 1110", "1010 1010 0110", "1101 0101 0100",
-                               0x04DD,           0x026E,           0x092E,           0x0AA6,           0x0D54,
-        //* 1353 -1357 */ "0101 1010 1010", "0101 1011 0101", "0010 1011 0100", "1001 0011 0111", "0100 1001 1011",
-                               0x05AA,           0x05B5,           0x02B4,           0x0937,           0x049B,
-        //* 1358 -1362 */ "1010 0100 1011", "1011 0010 0101", "1011 0101 0100", "1011 0110 1010", "0101 0110 1101",
-                               0x0A4B,           0x0B25,           0x0B54,           0x0B6A,           0x056D,
-        //* 1363 -1367 */ "0100 1010 1101", "1010 0101 0101", "1101 0010 0101", "1110 1001 0010", "1110 1100 1001",
-                               0x04AD,           0x0A55,           0x0D25,           0x0E92,           0x0EC9,
-        //* 1368 -1372 */ "0110 1101 0100", "1010 1110 1010", "0101 0110 1011", "0100 1010 1011", "0110 1000 0101",
-                               0x06D4,           0x0ADA,           0x056B,           0x04AB,           0x0685,
-        //* 1373 -1377 */ "1011 0100 1001", "1011 1010 0100", "1011 1011 0010", "0101 1011 0101", "0010 1011 1010",
-                               0x0B49,           0x0BA4,           0x0BB2,           0x05B5,           0x02BA,
-        //* 1378 -1382 */ "1001 0101 1011", "0100 1010 1011", "0101 0101 0101", "0110 1011 0010", "0110 1101 1001",
-                               0x095B,           0x04AB,           0x0555,           0x06B2,           0x06D9,
-        //* 1383 -1387 */ "0010 1110 1100", "1001 0110 1110", "0100 1010 1110", "1010 0101 0110", "1101 0010 1010",
-                               0x02EC,           0x096E,           0x04AE,           0x0A56,           0x0D2A,
-        //* 1388 -1392 */ "1101 0101 0101", "0101 1010 1010", "1010 1011 0101", "0100 1011 1011", "0000 0101 1011",
-                               0x0D55,           0x05AA,           0x0AB5,           0x04BB,           0x005B,
-        //* 1393 -1397 */ "1001 0010 1011", "1010 1001 0101", "0011 0100 1010", "1011 1010 0101", "0101 1010 1010",
-                               0x092B,           0x0A95,           0x034A,           0x0BA5,           0x05AA,
-        //* 1398 -1402 */ "1010 1011 0101", "0101 0101 0110", "1010 1001 0110", "1101 0100 1010", "1110 1010 0101",
-                               0x0AB5,           0x0556,           0x0A96,           0x0B4A,           0x0EA5,
-        //* 1403 -1407 */ "0111 0101 0010", "0110 1110 1001", "0011 0110 1010", "1010 1010 1101", "0101 0101 0101",
-                               0x0752,           0x06E9,           0x036A,           0x0AAD,           0x0555,
-        //* 1408 -1412 */ "1010 1010 0101", "1011 0101 0010", "1011 1010 1001", "0101 1011 0100", "1001 1011 1010",
-                               0x0AA5,           0x0B52,           0x0BA9,           0x05B4,           0x09BA,
-        //* 1413 -1417 */ "0100 1101 1011", "0010 0101 1101", "0101 0010 1101", "1010 1010 0101", "1010 1101 0100",
-                               0x04DB,           0x025D,           0x052D,           0x0AA5,           0x0AD4,
-        //* 1418 -1422 */ "1010 1110 1010", "0101 0110 1101", "0100 1011 1101", "0010 0011 1101", "1001 0001 1101",
-                               0x0AEA,           0x056D,           0x04BD,           0x023D,           0x091D,
-        //* 1423 -1427 */ "1010 1001 0101", "1011 0100 1010", "1011 0101 1010", "0101 0110 1101", "0010 1011 0110",
-                               0x0A95,           0x0B4A,           0x0B5A,           0x056D,           0x02B6,
-        //* 1428 -1432 */ "1001 0011 1011", "0100 1001 1011", "0110 0101 0101", "0110 1010 1001", "0111 0101 0100",
-                               0x093B,           0x049B,           0x0655,           0x06A9,           0x0754,
-        //* 1433 -1437 */ "1011 0110 1010", "0101 0110 1100", "1010 1010 1101", "0101 0101 0101", "1011 0010 1001",
-                               0x0B6A,           0x056C,           0x0AAD,           0x0555,           0x0B29,
-        //* 1438 -1442 */ "1011 1001 0010", "1011 1010 1001", "0101 1101 0100", "1010 1101 1010", "0101 0101 1010",
-                               0x0B92,           0x0BA9,           0x05D4,           0x0ADA,           0x055A,
-        //* 1443 -1447 */ "1010 1010 1011", "0101 1001 0101", "0111 0100 1001", "0111 0110 0100", "1011 1010 1010",
-                               0x0AAB,           0x0595,           0x0749,           0x0764,           0x0BAA,
-        //* 1448 -1452 */ "0101 1011 0101", "0010 1011 0110", "1010 0101 0110", "1110 0100 1101", "1011 0010 0101",
-                               0x05B5,           0x02B6,           0x0A56,           0x0E4D,           0x0B25,
-        //* 1453 -1457 */ "1011 0101 0010", "1011 0110 1010", "0101 1010 1101", "0010 1010 1110", "1001 0010 1111",
-                               0x0B52,           0x0B6A,           0x05AD,           0x02AE,           0x092F,
-        //* 1458 -1462 */ "0100 1001 0111", "0110 0100 1011", "0110 1010 0101", "0110 1010 1100", "1010 1101 0110",
-                               0x0497,           0x064B,           0x06A5,           0x06AC,           0x0AD6,
-        //* 1463 -1467 */ "0101 0101 1101", "0100 1001 1101", "1010 0100 1101", "1101 0001 0110", "1101 1001 0101",
-                               0x055D,           0x049D,           0x0A4D,           0x0D16,           0x0D95,
-        //* 1468 -1472 */ "0101 1010 1010", "0101 1011 0101", "0010 1001 1010", "1001 0101 1011", "0100 1010 1100",
-                               0x05AA,           0x05B5,           0x029A,           0x095B,           0x04AC,
-        //* 1473 -1477 */ "0101 1001 0101", "0110 1100 1010", "0110 1110 0100", "1010 1110 1010", "0100 1111 0101",
-                               0x0595,           0x06CA,           0x06E4,           0x0AEA,           0x04F5,
-        //* 1478 -1480 */ "0010 1011 0110", "1001 0101 0110", "1010 1010 1010"
-                               0x02B6,           0x0956,           0x0AAA
+    //* 1300 -1302 */ "1010 1010 1010", "1101 0101 0100", "1110 1100 1001",
+                            0x0AAA,           0x0D54,           0x0EC9,
+    //* 1303 -1307 */ "0110 1101 0100", "0110 1110 1010", "0011 0110 1100", "1010 1010 1101", "0101 0101 0101",
+                            0x06D4,           0x06EA,           0x036C,           0x0AAD,           0x0555,
+    //* 1308 -1312 */ "0110 1010 1001", "0111 1001 0010", "1011 1010 1001", "0101 1101 0100", "1010 1101 1010",
+                            0x06A9,           0x0792,           0x0BA9,           0x05D4,           0x0ADA,
+    //* 1313 -1317 */ "0101 0101 1100", "1101 0010 1101", "0110 1001 0101", "0111 0100 1010", "1011 0101 0100",
+                            0x055C,           0x0D2D,           0x0695,           0x074A,           0x0B54,
+    //* 1318 -1322 */ "1011 0110 1010", "0101 1010 1101", "0100 1010 1110", "1010 0100 1111", "0101 0001 0111",
+                            0x0B6A,           0x05AD,           0x04AE,           0x0A4F,           0x0517,
+    //* 1323 -1327 */ "0110 1000 1011", "0110 1010 0101", "1010 1101 0101", "0010 1101 0110", "1001 0101 1011",
+                            0x068B,           0x06A5,           0x0AD5,           0x02D6,           0x095B,
+    //* 1328 -1332 */ "0100 1001 1101", "1010 0100 1101", "1101 0010 0110", "1101 1001 0101", "0101 1010 1100",
+                            0x049D,           0x0A4D,           0x0D26,           0x0D95,           0x05AC,
+    //* 1333 -1337 */ "1001 1011 0110", "0010 1011 1010", "1010 0101 1011", "0101 0010 1011", "1010 1001 0101",
+                            0x09B6,           0x02BA,           0x0A5B,           0x052B,           0x0A95,
+    //* 1338 -1342 */ "0110 1100 1010", "1010 1110 1001", "0010 1111 0100", "1001 0111 0110", "0010 1011 0110",
+                            0x06CA,           0x0AE9,           0x02F4,           0x0976,           0x02B6,
+    //* 1343 -1347 */ "1001 0101 0110", "1010 1100 1010", "1011 1010 0100", "1011 1101 0010", "0101 1101 1001",
+                            0x0956,           0x0ACA,           0x0BA4,           0x0BD2,           0x05D9,
+    //* 1348 -1352 */ "0010 1101 1100", "1001 0110 1101", "0101 0100 1101", "1010 1010 0101", "1011 0101 0010",
+                            0x02DC,           0x096D,           0x054D,           0x0AA5,           0x0B52,
+    //* 1353 -1357 */ "1011 1010 0101", "0101 1011 0100", "1001 1011 0110", "0101 0101 0111", "0010 1001 0111",
+                            0x0BA5,           0x05B4,           0x09B6,           0x0557,           0x0297,
+    //* 1358 -1362 */ "0101 0100 1011", "0110 1010 0011", "0111 0101 0010", "1011 0110 0101", "0101 0110 1010",
+                            0x054B,           0x06A3,           0x0752,           0x0B65,           0x056A,
+    //* 1363 -1367 */ "1010 1010 1011", "0101 0010 1011", "1100 1001 0101", "1101 0100 1010", "1101 1010 0101",
+                            0x0AAB,           0x052B,           0x0C95,           0x0D4A,           0x0DA5,
+    //* 1368 -1372 */ "0101 1100 1010", "1010 1101 0110", "1001 0101 0111", "0100 1010 1011", "1001 0100 1011",
+                            0x05CA,           0x0AD6,           0x0957,           0x04AB,           0x094B,
+    //* 1373 -1377 */ "1010 1010 0101", "1011 0101 0010", "1011 0110 1010", "0101 0111 0101", "0010 0111 0110",
+                            0x0AA5,           0x0B52,           0x0B6A,           0x0575,           0x0276,
+    //* 1378 -1382 */ "1000 1011 0111", "0100 0101 1011", "0101 0101 0101", "0101 1010 1001", "0101 1011 0100",
+                            0x08B7,           0x045B,           0x0555,           0x05A9,           0x05B4,
+    //* 1383 -1387 */ "1001 1101 1010", "0100 1101 1101", "0010 0110 1110", "1001 0011 0110", "1010 1010 1010",
+                            0x09DA,           0x04DD,           0x026E,           0x0936,           0x0AAA,
+    //* 1388 -1392 */ "1101 0101 0100", "1101 1011 0010", "0101 1101 0101", "0010 1101 1010", "1001 0101 1011",
+                            0x0D54,           0x0DB2,           0x05D5,           0x02DA,           0x095B,
+    //* 1393 -1397 */ "0100 1010 1011", "1010 0101 0101", "1011 0100 1001", "1011 0110 0100", "1011 0111 0001",
+                            0x04AB,           0x0A55,           0x0B49,           0x0B64,           0x0B71,
+    //* 1398 -1402 */ "0101 1011 0100", "1010 1011 0101", "1010 0101 0101", "1101 0010 0101", "1110 1001 0010",
+                            0x05B4,           0x0AB5,           0x0A55,           0x0D25,           0x0E92,
+    //* 1403 -1407 */ "1110 1100 1001", "0110 1101 0100", "1010 1110 1001", "1001 0110 1011", "0100 1010 1011",
+                            0x0EC9,           0x06D4,           0x0AE9,           0x096B,           0x04AB,
+    //* 1408 -1412 */ "1010 1001 0011", "1101 0100 1001", "1101 1010 0100", "1101 1011 0010", "1010 1011 1001",
+                            0x0A93,           0x0D49,         0x0DA4,           0x0DB2,           0x0AB9,
+    //* 1413 -1417 */ "0100 1011 1010", "1010 0101 1011", "0101 0010 1011", "1010 1001 0101", "1011 0010 1010",
+                            0x04BA,           0x0A5B,           0x052B,           0x0A95,           0x0B2A,
+    //* 1418 -1422 */ "1011 0101 0101", "0101 0101 1100", "0100 1011 1101", "0010 0011 1101", "1001 0001 1101",
+                            0x0B55,           0x055C,           0x04BD,           0x023D,           0x091D,
+    //* 1423 -1427 */ "1010 1001 0101", "1011 0100 1010", "1011 0101 1010", "0101 0110 1101", "0010 1011 0110",
+                            0x0A95,           0x0B4A,           0x0B5A,           0x056D,           0x02B6,
+    //* 1428 -1432 */ "1001 0011 1011", "0100 1001 1011", "0110 0101 0101", "0110 1010 1001", "0111 0101 0100",
+                            0x093B,           0x049B,           0x0655,           0x06A9,           0x0754,
+    //* 1433 -1437 */ "1011 0110 1010", "0101 0110 1100", "1010 1010 1101", "0101 0101 0101", "1011 0010 1001",
+                            0x0B6A,           0x056C,           0x0AAD,           0x0555,           0x0B29,
+    //* 1438 -1442 */ "1011 1001 0010", "1011 1010 1001", "0101 1101 0100", "1010 1101 1010", "0101 0101 1010",
+                            0x0B92,           0x0BA9,           0x05D4,           0x0ADA,           0x055A,
+    //* 1443 -1447 */ "1010 1010 1011", "0101 1001 0101", "0111 0100 1001", "0111 0110 0100", "1011 1010 1010",
+                            0x0AAB,           0x0595,           0x0749,           0x0764,           0x0BAA,
+    //* 1448 -1452 */ "0101 1011 0101", "0010 1011 0110", "1010 0101 0110", "1110 0100 1101", "1011 0010 0101",
+                            0x05B5,           0x02B6,           0x0A56,           0x0E4D,           0x0B25,
+    //* 1453 -1457 */ "1011 0101 0010", "1011 0110 1010", "0101 1010 1101", "0010 1010 1110", "1001 0010 1111",
+                            0x0B52,           0x0B6A,           0x05AD,           0x02AE,           0x092F,
+    //* 1458 -1462 */ "0100 1001 0111", "0110 0100 1011", "0110 1010 0101", "0110 1010 1100", "1010 1101 0110",
+                            0x0497,           0x064B,           0x06A5,           0x06AC,           0x0AD6,
+    //* 1463 -1467 */ "0101 0101 1101", "0100 1001 1101", "1010 0100 1101", "1101 0001 0110", "1101 1001 0101",
+                            0x055D,           0x049D,           0x0A4D,           0x0D16,           0x0D95,
+    //* 1468 -1472 */ "0101 1010 1010", "0101 1011 0101", "0010 1101 1010", "1001 0101 1011", "0100 1010 1101",
+                            0x05AA,           0x05B5,           0x02DA,           0x095B,           0x04AD,
+    //* 1473 -1477 */ "0101 1001 0101", "0110 1100 1010", "0110 1110 0100", "1010 1110 1010", "0100 1111 0101",
+                            0x0595,           0x06CA,           0x06E4,           0x0AEA,           0x04F5,
+    //* 1478 -1482 */ "0010 1011 0110", "1001 0101 0110", "1010 1010 1010", "1011 0101 0100", "1011 1101 0010",
+                            0x02B6,           0x0956,           0x0AAA,           0x0B54,           0x0BD2,
+    //* 1483 -1487 */ "0101 1101 1001", "0010 1110 1010", "1001 0110 1101", "0100 1010 1101", "1010 1001 0101",
+                            0x05D9,           0x02EA,           0x096D,           0x04AD,           0x0A95,
+    //* 1488 -1492 */ "1011 0100 1010", "1011 1010 0101", "0101 1011 0010", "1001 1011 0101", "0100 1101 0110",
+                            0x0B4A,           0x0BA5,           0x05B2,           0x09B5,           0x04D6,
+    //* 1493 -1497 */ "1010 1001 0111", "0101 0100 0111", "0110 1001 0011", "0111 0100 1001", "1011 0101 0101",
+                            0x0A97,           0x0547,           0x0693,           0x0749,           0x0B55,
+    //* 1498 -1508 */ "0101 0110 1010", "1010 0110 1011", "0101 0010 1011", "1010 1000 1011", "1101 0100 0110", "1101 1010 0011", "0101 1100 1010", "1010 1101 0110", "0100 1101 1011", "0010 0110 1011", "1001 0100 1011",
+                            0x056A,           0x0A6B,           0x052B,           0x0A8B,           0x0D46,           0x0DA3,           0x05CA,           0x0AD6,           0x04DB,           0x026B,           0x094B,
+    //* 1509 -1519 */ "1010 1010 0101", "1011 0101 0010", "1011 0110 1001", "0101 0111 0101", "0001 0111 0110", "1000 1011 0111", "0010 0101 1011", "0101 0010 1011", "0101 0110 0101", "0101 1011 0100", "1001 1101 1010",
+                            0x0AA5,           0x0B52,           0x0B69,           0x0575,           0x0176,           0x08B7,           0x025B,           0x052B,           0x0565,           0x05B4,           0x09DA,
+    //* 1520 -1530 */ "0100 1110 1101", "0001 0110 1101", "1000 1011 0110", "1010 1010 0110", "1101 0101 0010", "1101 1010 1001", "0101 1101 0100", "1010 1101 1010", "1001 0101 1011", "0100 1010 1011", "0110 0101 0011",
+                            0x04ED,           0x016D,           0x08B6,           0x0AA6,           0x0D52,           0x0DA9,           0x05D4,           0x0ADA,           0x095B,           0x04AB,           0x0653,
+    //* 1531 -1541 */ "0111 0010 1001", "0111 0110 0010", "1011 1010 1001", "0101 1011 0010", "1010 1011 0101", "0101 0101 0101", "1011 0010 0101", "1101 1001 0010", "1110 1100 1001", "0110 1101 0010", "1010 1110 1001",
+                            0x0729,           0x0762,           0x0BA9,           0x05B2,           0x0AB5,           0x0555,           0x0B25,           0x0D92,           0x0EC9,           0x06D2,           0x0AE9,
+    //* 1542 -1552 */ "0101 0110 1011", "0100 1010 1011", "1010 0101 0101", "1101 0010 1001", "1101 0101 0100", "1101 1010 1010", "1001 1011 0101", "0100 1011 1010", "1010 0011 1011", "0100 1001 1011", "1010 0100 1101",
+                            0x056B,           0x04AB,           0x0A55,           0x0D29,           0x0D54,           0x0DAA,           0x09B5,           0x04BA,           0x0A3B,           0x049B,           0x0A4D,
+    //* 1553 -1563 */ "1010 1010 1010", "1010 1101 0101", "0010 1101 1010", "1001 0101 1101", "0100 0101 1110", "1010 0010 1110", "1100 1001 1010", "1101 0101 0101", "0110 1011 0010", "0110 1011 1001", "0100 1011 1010",
+                            0x0AAA,           0x0AD5,           0x02DA,           0x095D,           0x045E,           0x0A2E,           0x0C9A,           0x0D55,           0x06B2,           0x06B9,           0x04BA,
+    //* 1564 -1574 */ "1010 0101 1101", "0101 0010 1101", "1010 1001 0101", "1011 0101 0010", "1011 1010 1000", "1011 1011 0100", "0101 1011 1001", "0010 1101 1010", "1001 0101 1010", "1011 0100 1010", "1101 1010 0100",
+                            0x0A5D,           0x052D,           0x0A95,           0x0B52,           0x0BA8,           0x0BB4,           0x05B9,           0x02DA,           0x095A,           0x0B4A,           0x0DA4,
+    //* 1575 -1585 */ "1110 1101 0001", "0110 1110 1000", "1011 0110 1010", "0101 0110 1101", "0101 0011 0101", "0110 1001 0101", "1101 0100 1010", "1101 1010 1000", "1101 1101 0100", "0110 1101 1010", "0101 0101 1011",
+                            0x0ED1,           0x06E8,           0x0B6A,           0x056D,           0x0535,           0x0695,           0x0D4A,           0x0DA8,           0x0DD4,           0x06DA,           0x055B,
+    //* 1586 -1596 */ "0010 1001 1101", "0110 0010 1011", "1011 0001 0101", "1011 0100 1010", "1011 1001 0101", "0101 1010 1010", "1010 1010 1110", "1001 0010 1110", "1100 1000 1111", "0101 0010 0111", "0110 1001 0101",
+                            0x029D,           0x062B,           0x0B15,           0x0B4A,           0x0B95,           0x05AA,           0x0AAE,           0x092E,           0x0C8F,           0x0527,           0x0695,
+    //* 1597 -1600 */ "0110 1010 1010", "1010 1101 0110", "0101 0101 1101", "0010 1001 1101", };
+                            0x06AA,           0x0AD6,           0x055D,           0x029D
     };
 
-    private static final int UMALQURA_YEAR_START = 1318;
-    private static final int UMALQURA_YEAR_END = 1480;
+    private static final int UMALQURA_YEAR_START = 1300;
+    private static final int UMALQURA_YEAR_END = 1600;
 
 
     /**
@@ -515,7 +549,7 @@ public class IslamicCalendar extends Calendar {
         long ys = 0;
         if (cType == CalculationType.ISLAMIC_CIVIL
                 || cType == CalculationType.ISLAMIC_TBLA
-                || (cType == CalculationType.ISLAMIC_UMALQURA && year < UMALQURA_YEAR_START )) {
+                || (cType == CalculationType.ISLAMIC_UMALQURA && (year < UMALQURA_YEAR_START || year > UMALQURA_YEAR_END))) {
              ys = (year-1)*354 + (long)Math.floor((3+11*year)/30.0);
         } else if(cType == CalculationType.ISLAMIC) {
              ys = trueMonthStart(12*(year-1));
@@ -716,11 +750,15 @@ public class IslamicCalendar extends Calendar {
     //-------------------------------------------------------------------------
 
     // Return JD of start of given month/year
+    // Calendar says:
+    // Get the Julian day of the day BEFORE the start of this year.
+    // If useMonth is true, get the day before the start of the month.
+    // Hence the -1
     /**
      * @stable ICU 2.8
      */
     protected int handleComputeMonthStart(int eyear, int month, boolean useMonth) {
-        return (int) monthStart(eyear, month) + 1948439;
+        return (int)(monthStart(eyear, month) + ((cType ==  CalculationType.ISLAMIC_TBLA)? ASTRONOMICAL_EPOC: CIVIL_EPOC) - 1);
     }    
 
     //-------------------------------------------------------------------------
index 287e53cd308db0e8cf044a6a403b85437eaf3f7b..2ec5a02a384e0bd44ea673e41caaa20a246a5b9c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *******************************************************************************
- * Copyright (C) 1996-2013, International Business Machines Corporation and    *
+ * Copyright (C) 1996-2014, International Business Machines Corporation and    *
  * others. All Rights Reserved.                                                *
  *******************************************************************************
  */
@@ -417,14 +417,14 @@ public class IslamicTest extends CalendarTest {
             formatterIslamic.applyPattern("yyyy-MMMM-dd");
             String str = formatterIslamic.format(is_cal.getTime());
 
-            // 1395 - Rabi - 29
+            // 1395 - Rabi - 24
             int is_day = is_cal.get(Calendar.DAY_OF_MONTH);
             int is_month = is_cal.get(Calendar.MONTH);
             int is_year = is_cal.get(Calendar.YEAR);
-            if(is_day != 29 || is_month != IslamicCalendar.RABI_2 || is_year != 1395)
+            if(is_day != 24 || is_month != IslamicCalendar.RABI_2 || is_year != 1395)
                 errln("unexpected conversion date: "+is_day+" "+is_month+" "+is_year);
 
-            String expectedFormatResult = "\u0661\u0663\u0669\u0665-\u0631\u0628\u064A\u0639 \u0627\u0644\u0622\u062E\u0631-\u0662\u0669";
+            String expectedFormatResult = "\u0661\u0663\u0669\u0665-\u0631\u0628\u064A\u0639 \u0627\u0644\u0622\u062E\u0631-\u0662\u0664";
             if(!str.equals(expectedFormatResult))
                 errln("unexpected formatted result: "+str);