]> granicus.if.org Git - icu/commit
ICU-21043 Fix calendar problems
authorFrank Tang <ftang@chromium.org>
Fri, 4 Sep 2020 21:42:10 +0000 (14:42 -0700)
committerFrank Yung-Fong Tang <41213225+FrankYFTang@users.noreply.github.com>
Thu, 10 Sep 2020 07:21:18 +0000 (00:21 -0700)
commit35dfdf1d0242b2185bf00595b1268aa8242e9e45
tree07ad7deab912e958bff7f84d5f4bc5971d349ff6
parent9e85ba5690756df6a424dc2ca61a1d8e5f251bf3
ICU-21043 Fix calendar problems

This PR fixes
ICU-21043 Erroneous date display in indian calendar of all dates prior to 0001-01-01.
ICU-21044 Hebrew Calendar calculation is incorrect when the year < 1
ICU-21045 Erroneous date display in islamic and islamic-rgsa calendars of all dates prior to 0622-07-18.
ICU-21046 Erroneous date display in islamic-umalqura calendar of all dates prior to  -195366-07-23.

The problem in the indiancal.cpp is
* ICU-21043 the gregorian/julain convesion is wrong. Swith to use
i18n/gregoimp.h fix the problem.

The problem in the hebrwcal.cpp is
* ICU-21044 Use ClockMath::floorDivid to replace x / y for x maybe <  0
also need to fix incorrect value in test file

The problem in the islamcal.cpp:
* ICU-21045: The math of % negative number for year and month is wrong.
* ICU-21046: Not use int64_t methods and caused int32_t overflow while the year is a
huge negative number. Cast to int64_t to force using the int64_t version
for the math fix the problem.

Also add tests to exhaust test 8000 years for all calendar. In quick
mode, only test 2.5 years.

Switch to 0-based month. fix TZ for test.
icu4c/source/i18n/hebrwcal.cpp
icu4c/source/i18n/indiancal.cpp
icu4c/source/i18n/islamcal.cpp
icu4c/source/test/intltest/incaltst.cpp
icu4c/source/test/intltest/incaltst.h
icu4c/source/test/testdata/calendar.txt