From 44b2617d44911378742948d44e42bab92e02fa34 Mon Sep 17 00:00:00 2001 From: Yoshito Umaoka Date: Wed, 21 Feb 2018 21:09:33 +0000 Subject: [PATCH] ICU-13548 Fixed a calendar calculation problem with setting week-of-year and year. X-SVN-Rev: 40966 --- icu4c/source/i18n/calendar.cpp | 8 ++++---- icu4c/source/test/intltest/calregts.cpp | 18 ++++++++++++++++++ icu4c/source/test/intltest/calregts.h | 1 + .../core/src/com/ibm/icu/util/Calendar.java | 4 ++-- .../test/calendar/CalendarRegressionTest.java | 14 ++++++++++++++ 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/icu4c/source/i18n/calendar.cpp b/icu4c/source/i18n/calendar.cpp index 092dc4c1d9e..526a5a70b4a 100644 --- a/icu4c/source/i18n/calendar.cpp +++ b/icu4c/source/i18n/calendar.cpp @@ -3223,14 +3223,14 @@ int32_t Calendar::handleComputeJulianDay(UCalendarDateFields bestField) { bestField == UCAL_DAY_OF_WEEK_IN_MONTH); int32_t year; - if (bestField == UCAL_WEEK_OF_YEAR) { - year = internalGet(UCAL_YEAR_WOY, handleGetExtendedYear()); - internalSet(UCAL_EXTENDED_YEAR, year); + if (bestField == UCAL_WEEK_OF_YEAR && newerField(UCAL_YEAR_WOY, UCAL_YEAR) == UCAL_YEAR_WOY) { + year = internalGet(UCAL_YEAR_WOY); } else { year = handleGetExtendedYear(); - internalSet(UCAL_EXTENDED_YEAR, year); } + internalSet(UCAL_EXTENDED_YEAR, year); + #if defined (U_DEBUG_CAL) fprintf(stderr, "%s:%d: bestField= %s - y=%d\n", __FILE__, __LINE__, fldName(bestField), year); #endif diff --git a/icu4c/source/test/intltest/calregts.cpp b/icu4c/source/test/intltest/calregts.cpp index 24951e5b8aa..da522637c6f 100644 --- a/icu4c/source/test/intltest/calregts.cpp +++ b/icu4c/source/test/intltest/calregts.cpp @@ -17,6 +17,7 @@ #include "unicode/simpletz.h" #include "unicode/smpdtfmt.h" #include "unicode/strenum.h" +#include "unicode/localpointer.h" #include "cmemory.h" #include "caltest.h" #include "unicode/localpointer.h" @@ -94,6 +95,7 @@ CalendarRegressionTest::runIndexedTest( int32_t index, UBool exec, const char* & CASE(51,TestT11632); CASE(52,TestPersianCalOverflow); CASE(53,TestIslamicCalOverflow); + CASE(54,TestWeekOfYear13548); default: name = ""; break; } } @@ -3051,4 +3053,20 @@ void CalendarRegressionTest::TestIslamicCalOverflow(void) { } } +void CalendarRegressionTest::TestWeekOfYear13548(void) { + int32_t year = 2000; + UErrorCode status = U_ZERO_ERROR; + LocalPointer cal(Calendar::createInstance(status)); + failure(status, "Calendar::createInstance(status)"); + + cal->set(UCAL_YEAR, year); + cal->set(UCAL_WEEK_OF_YEAR, 4); + + int32_t resultYear = cal->get(UCAL_YEAR, status); + failure(status, "get(UCAL_YEAR, status)"); + if (year != resultYear) { + errln((UnicodeString)"Fail: Expected year=" + year + ", actual=" + resultYear); + } +} + #endif /* #if !UCONFIG_NO_FORMATTING */ diff --git a/icu4c/source/test/intltest/calregts.h b/icu4c/source/test/intltest/calregts.h index 7d36fab0b45..b4166a0c61d 100644 --- a/icu4c/source/test/intltest/calregts.h +++ b/icu4c/source/test/intltest/calregts.h @@ -80,6 +80,7 @@ public: void TestT11632(void); void TestPersianCalOverflow(void); void TestIslamicCalOverflow(void); + void TestWeekOfYear13548(void); void printdate(GregorianCalendar *cal, const char *string); void dowTest(UBool lenient) ; diff --git a/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java b/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java index 6529867e708..81d35403ac5 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/util/Calendar.java @@ -5959,12 +5959,12 @@ public abstract class Calendar implements Serializable, Cloneable, Comparable